{"$schema":"https://json.schemastore.org/sarif-2.1.0.json","version":"2.1.0","runs":[{"tool":{"driver":{"name":"codehealth","informationUri":"https://codehealth.canine.dev","rules":[{"id":"D1","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D1"},{"id":"D2","name":"Cognitive Complexity","shortDescription":{"text":"Cognitive Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D2"},{"id":"D3","name":"God Classes","shortDescription":{"text":"God Classes"},"helpUri":"https://codehealth.canine.dev/dimensions/D3"},{"id":"D4","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/D4"},{"id":"D5","name":"Coupling","shortDescription":{"text":"Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D5"},{"id":"D6","name":"Cohesion (LCOM4)","shortDescription":{"text":"Cohesion (LCOM4)"},"helpUri":"https://codehealth.canine.dev/dimensions/D6"},{"id":"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"]},{"target":{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"],"owasp":"A07:2025"}},{"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":"D20","name":"ADR Quality","shortDescription":{"text":"ADR Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D20"},{"id":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"],"owasp":"A07:2025"}},{"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"]},{"target":{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-79","CWE-89","CWE-78","CWE-94","CWE-77"],"owasp":"A05:2025"}},{"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"]},{"target":{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1395","CWE-937"],"owasp":"A03:2025"}},{"id":"D31","name":"IaC \u0026 Container Security","shortDescription":{"text":"IaC \u0026 Container Security"},"helpUri":"https://codehealth.canine.dev/dimensions/D31","relationships":[{"target":{"id":"CWE-1032","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-732","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-16","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A02:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1032","CWE-732","CWE-16"],"owasp":"A02:2025"}},{"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"]},{"target":{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1357","CWE-494"],"owasp":"A03:2025"}},{"id":"D37","name":"Vulnerability-disclosure Policy","shortDescription":{"text":"Vulnerability-disclosure Policy"},"helpUri":"https://codehealth.canine.dev/dimensions/D37","relationships":[{"target":{"id":"CWE-1059","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A02:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1059"],"owasp":"A02:2025"}},{"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"]},{"target":{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-506"],"owasp":"A08:2025"}},{"id":"D44","name":"Platform End-of-Life","shortDescription":{"text":"Platform End-of-Life"},"helpUri":"https://codehealth.canine.dev/dimensions/D44"},{"id":"AC1","name":"Text alternatives","shortDescription":{"text":"Text alternatives"},"helpUri":"https://codehealth.canine.dev/dimensions/AC1"},{"id":"AC2","name":"Forms \u0026 labels","shortDescription":{"text":"Forms \u0026 labels"},"helpUri":"https://codehealth.canine.dev/dimensions/AC2"},{"id":"AC3","name":"Page structure","shortDescription":{"text":"Page structure"},"helpUri":"https://codehealth.canine.dev/dimensions/AC3"},{"id":"AC4","name":"Keyboard semantics","shortDescription":{"text":"Keyboard semantics"},"helpUri":"https://codehealth.canine.dev/dimensions/AC4"},{"id":"AC5","name":"ARIA correctness","shortDescription":{"text":"ARIA correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/AC5"},{"id":"AC6","name":"Visual \u0026 motion safety","shortDescription":{"text":"Visual \u0026 motion safety"},"helpUri":"https://codehealth.canine.dev/dimensions/AC6"},{"id":"AC7","name":"A11y enforcement","shortDescription":{"text":"A11y enforcement"},"helpUri":"https://codehealth.canine.dev/dimensions/AC7"},{"id":"AX10","name":"Code composition","shortDescription":{"text":"Code composition"},"helpUri":"https://codehealth.canine.dev/dimensions/AX10"},{"id":"AX2","name":"Stateful singletons","shortDescription":{"text":"Stateful singletons"},"helpUri":"https://codehealth.canine.dev/dimensions/AX2"},{"id":"AX3","name":"Project dependency cycles","shortDescription":{"text":"Project dependency cycles"},"helpUri":"https://codehealth.canine.dev/dimensions/AX3"},{"id":"AX5","name":"Architecture \u0026 structure","shortDescription":{"text":"Architecture \u0026 structure"},"helpUri":"https://codehealth.canine.dev/dimensions/AX5"},{"id":"AX6","name":"Interface segregation","shortDescription":{"text":"Interface segregation"},"helpUri":"https://codehealth.canine.dev/dimensions/AX6"},{"id":"AX7","name":"Slice cohesion","shortDescription":{"text":"Slice cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/AX7"},{"id":"AXB2","name":"Runtime readiness","shortDescription":{"text":"Runtime readiness"},"helpUri":"https://codehealth.canine.dev/dimensions/AXB2"},{"id":"C2","name":"Access Controls","shortDescription":{"text":"Access Controls"},"helpUri":"https://codehealth.canine.dev/dimensions/C2"},{"id":"C4","name":"Data Retention","shortDescription":{"text":"Data Retention"},"helpUri":"https://codehealth.canine.dev/dimensions/C4"},{"id":"ED5","name":"Idempotency","shortDescription":{"text":"Idempotency"},"helpUri":"https://codehealth.canine.dev/dimensions/ED5"},{"id":"GD1","name":"Unfinished \u0026 placeholder code","shortDescription":{"text":"Unfinished \u0026 placeholder code"},"helpUri":"https://codehealth.canine.dev/dimensions/GD1"},{"id":"IC1","name":"Incompleteness \u0026 stubs","shortDescription":{"text":"Incompleteness \u0026 stubs"},"helpUri":"https://codehealth.canine.dev/dimensions/IC1"},{"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":"P2","name":"Observability","shortDescription":{"text":"Observability"},"helpUri":"https://codehealth.canine.dev/dimensions/P2"},{"id":"P3","name":"Security \u0026 performance tooling","shortDescription":{"text":"Security \u0026 performance tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/P3"},{"id":"P4","name":"Deployment \u0026 Rollback","shortDescription":{"text":"Deployment \u0026 Rollback"},"helpUri":"https://codehealth.canine.dev/dimensions/P4"},{"id":"P6","name":"Release Hygiene","shortDescription":{"text":"Release Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/P6"},{"id":"P7","name":"Outbound HTTP resilience","shortDescription":{"text":"Outbound HTTP resilience"},"helpUri":"https://codehealth.canine.dev/dimensions/P7"},{"id":"P8","name":"Schema migrations","shortDescription":{"text":"Schema migrations"},"helpUri":"https://codehealth.canine.dev/dimensions/P8"},{"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":"R11","name":"Import Boundaries","shortDescription":{"text":"Import Boundaries"},"helpUri":"https://codehealth.canine.dev/dimensions/R11"},{"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":"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":"X1","name":"Async correctness","shortDescription":{"text":"Async correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/X1"},{"id":"X10","name":"Duplicated predicate","shortDescription":{"text":"Duplicated predicate"},"helpUri":"https://codehealth.canine.dev/dimensions/X10"},{"id":"X12","name":"Unreachable branch","shortDescription":{"text":"Unreachable branch"},"helpUri":"https://codehealth.canine.dev/dimensions/X12"},{"id":"X13","name":"Undrained process stream","shortDescription":{"text":"Undrained process stream"},"helpUri":"https://codehealth.canine.dev/dimensions/X13"},{"id":"X14","name":"Bypassable address classification","shortDescription":{"text":"Bypassable address classification"},"helpUri":"https://codehealth.canine.dev/dimensions/X14"},{"id":"X15","name":"Unvalidated length from an untrusted reader","shortDescription":{"text":"Unvalidated length from an untrusted reader"},"helpUri":"https://codehealth.canine.dev/dimensions/X15"},{"id":"X16","name":"Unfloored truncation loop","shortDescription":{"text":"Unfloored truncation loop"},"helpUri":"https://codehealth.canine.dev/dimensions/X16"},{"id":"X17","name":"Uncapped recursion over a caller-supplied document","shortDescription":{"text":"Uncapped recursion over a caller-supplied document"},"helpUri":"https://codehealth.canine.dev/dimensions/X17"},{"id":"X18","name":"Disposal-pattern correctness","shortDescription":{"text":"Disposal-pattern correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/X18"},{"id":"X19","name":"Unrestored process-global state","shortDescription":{"text":"Unrestored process-global state"},"helpUri":"https://codehealth.canine.dev/dimensions/X19"},{"id":"X2","name":"Cancellation propagation","shortDescription":{"text":"Cancellation propagation"},"helpUri":"https://codehealth.canine.dev/dimensions/X2"},{"id":"X20","name":"Mistyped argument guard","shortDescription":{"text":"Mistyped argument guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X20"},{"id":"X21","name":"Side-effecting pattern guard","shortDescription":{"text":"Side-effecting pattern guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X21"},{"id":"X22","name":"Contradicted release guard","shortDescription":{"text":"Contradicted release guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X22"},{"id":"X23","name":"Unguarded diagnostic materialisation","shortDescription":{"text":"Unguarded diagnostic materialisation"},"helpUri":"https://codehealth.canine.dev/dimensions/X23"},{"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":"X27","name":"Collection changed while being enumerated","shortDescription":{"text":"Collection changed while being enumerated"},"helpUri":"https://codehealth.canine.dev/dimensions/X27"},{"id":"X28","name":"Index access outside its own emptiness guard","shortDescription":{"text":"Index access outside its own emptiness guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X28"},{"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":"X3","name":"Exception handling","shortDescription":{"text":"Exception handling"},"helpUri":"https://codehealth.canine.dev/dimensions/X3"},{"id":"X30","name":"Support guard that admits what it rejects","shortDescription":{"text":"Support guard that admits what it rejects"},"helpUri":"https://codehealth.canine.dev/dimensions/X30"},{"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":"X4","name":"Structured logging","shortDescription":{"text":"Structured logging"},"helpUri":"https://codehealth.canine.dev/dimensions/X4"},{"id":"X5","name":"Nullable reference types","shortDescription":{"text":"Nullable reference types"},"helpUri":"https://codehealth.canine.dev/dimensions/X5"},{"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":"mock-backend.startMockBackend.server (cyclomatic 523): mock-backend.startMockBackend.server has cyclomatic complexity 523 (threshold 15). Of this number, 501 points are the body\u0027s own statements and 22 belong to 11 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":"invokeai/frontend/webv2/scripts/mock-backend.mjs"},"region":{"startLine":937}}}],"partialFingerprints":{"codehealthFindingId/v1":"f54f5a5e4962f7943ace767eed2d8ba44c588bc9af9c278cfb3b342a75bb4359"}},{"ruleId":"D1","level":"warning","message":{"text":"workbenchState.__workbenchReducerInternal (cyclomatic 384): workbenchState.__workbenchReducerInternal has cyclomatic complexity 384 (threshold 15). Of this number, 205 points are the body\u0027s own statements and 179 belong to 70 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":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":3890}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1aadeaa451d724f3a00e63424d9abe9e46e8545590b2b8942bcb08d41e6e38d"}},{"ruleId":"D1","level":"warning","message":{"text":"GalleryImageGrid.GalleryImageGrid (cyclomatic 322): GalleryImageGrid.GalleryImageGrid has cyclomatic complexity 322 (threshold 15). Of this number, 90 points are the body\u0027s own statements and 232 belong to 47 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.tsx"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a5f3b72ae9f42b08dda975f3f33d898d6e79ff3cf0ce57b157ed17b8961ee58"}},{"ruleId":"D1","level":"warning","message":{"text":"LayersTree.LayersTree (cyclomatic 227): LayersTree.LayersTree has cyclomatic complexity 227 (threshold 15). Of this number, 29 points are the body\u0027s own statements and 198 belong to 49 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayersTree.tsx"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2b3bee2807a095ed391d768f28043bb2abf6e531f2f7cebfc83505220a46e0f"}},{"ruleId":"D1","level":"warning","message":{"text":"modelSelected.addModelSelectedListener (cyclomatic 205): modelSelected.addModelSelectedListener has cyclomatic complexity 205 (threshold 15). Most of this is not in the body itself: 1 of the 205 points is its own statement and the rest belongs to 9 function literals inside it that branch (lines 100, 739, 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":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d4ca0fa549d87bed9116fca0638472b68a7d6bb63bfe2e4aa3c7bab46476398"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphExecutionState._validate_effects (cyclomatic 155): GraphExecutionState._validate_effects has cyclomatic complexity 155 (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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":2565}}}],"partialFingerprints":{"codehealthFindingId/v1":"3965fbea2601be369bb41302a8996042d9e1141abb5b4656695e620fcceedc07"}},{"ruleId":"D1","level":"warning","message":{"text":"readiness.getReasonsWhyCannotEnqueueCanvasTab (cyclomatic 150): readiness.getReasonsWhyCannotEnqueueCanvasTab has cyclomatic complexity 150 (threshold 15). Of this number, 145 points are the body\u0027s own statements and 5 belong to 5 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":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":773}}}],"partialFingerprints":{"codehealthFindingId/v1":"15982ba4fe9f6af45a0396af1401d2131ddca51a92a19830096e8eedb488f3b1"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowEditorView.WorkflowFlow (cyclomatic 139): WorkflowEditorView.WorkflowFlow has cyclomatic complexity 139 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 122 belong to 48 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"401fb258db67847847c0330095015eb9225fe6fa4070b124e1ff8b138171cfc1"}},{"ruleId":"D1","level":"warning","message":{"text":"useImageActions.useImageActions (cyclomatic 129): useImageActions.useImageActions has cyclomatic complexity 129 (threshold 15). Most of this is not in the body itself: 1 of the 129 points is its own statement and the rest belongs to 42 function literals inside it that branch (lines 435, 750, 898, \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":"invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e80aa63adf9b0d4005ae66d9c3281993c7b69318ad1454bc63eee874a224e29"}},{"ruleId":"D1","level":"warning","message":{"text":"videoRecall.buildVideoRecallSettings (cyclomatic 113): videoRecall.buildVideoRecallSettings has cyclomatic complexity 113 (threshold 15). Of this number, 110 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":"invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0bfbb052bab2209a1aa579cdb45dbf2dd38b1d6a17a13e4aea8cc23908c88f8"}},{"ruleId":"D1","level":"warning","message":{"text":"recallParameters.buildRecallParametersSettings (cyclomatic 110): recallParameters.buildRecallParametersSettings has cyclomatic complexity 110 (threshold 15). Of this number, 91 points are the body\u0027s own statements and 19 belong to 13 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":"invokeai/frontend/webv2/src/workbench/image-actions/recallParameters.ts"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c9ba9b6f74cbedf94b4c082be52d5e018d2840d1f80472081df455bb4b21f93"}},{"ruleId":"D1","level":"warning","message":{"text":"setEventListeners.setEventListeners (cyclomatic 107): setEventListeners.setEventListeners has cyclomatic complexity 107 (threshold 15). Most of this is not in the body itself: 1 of the 107 points is its own statement and the rest belongs to 36 function items inside it that branch (a function literal at line 544, a function literal at line 786, a function literal at line 669, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"b119ee5912ebf027851b5be0289af4fee8cc09c9d0e883102591148d7e21ec04"}},{"ruleId":"D1","level":"warning","message":{"text":"LayerContextMenu.LayerMenu (cyclomatic 107): LayerContextMenu.LayerMenu has cyclomatic complexity 107 (threshold 15). Most of this is not in the body itself: 9 of the 107 points are its own statements and the rest belongs to 35 function literals inside it that branch (lines 649, 462, 362, \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"05c027bb4665171ae520e26ffed54fc678d0829346610c6edb4e97251bdd1d60"}},{"ruleId":"D1","level":"warning","message":{"text":"videoPolicies.getVideoValidationReasons (cyclomatic 100): videoPolicies.getVideoValidationReasons has cyclomatic complexity 100 (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":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":2291}}}],"partialFingerprints":{"codehealthFindingId/v1":"b78d9673c945be9e591f4ac57ef631fcb58d4eca16d3bb4cf1415de2f97097f7"}},{"ruleId":"D1","level":"warning","message":{"text":"ScrubberField.ScrubberField (cyclomatic 99): ScrubberField.ScrubberField has cyclomatic complexity 99 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 81 belong to 28 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":"invokeai/frontend/webv2/src/platform/ui/ScrubberField.tsx"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"012a14aca04232dfba3732d5bde375cfa4444fc7b7ec1ef9c3f725b41428c33b"}},{"ruleId":"D1","level":"warning","message":{"text":"canvasHotkeyCommands.executeCanvasHotkeyCommand (cyclomatic 97): canvasHotkeyCommands.executeCanvasHotkeyCommand has cyclomatic complexity 97 (threshold 15). Of this number, 94 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHotkeyCommands.ts"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"6283fbe69a1e794d243d9e4af5c9b9d0c808c83f63f1cf60009e5afd32237102"}},{"ruleId":"D1","level":"warning","message":{"text":"VideoWidgetView.VideoWidgetView (cyclomatic 94): VideoWidgetView.VideoWidgetView has cyclomatic complexity 94 (threshold 15). Of this number, 65 points are the body\u0027s own statements and 29 belong to 13 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":"invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"d706de13a2092bfa63995f7a4da467d1b78f4b2d1da3ba5589000d8e21aeb82b"}},{"ruleId":"D1","level":"warning","message":{"text":"GalleryPickerView.GalleryPickerView (cyclomatic 91): GalleryPickerView.GalleryPickerView has cyclomatic complexity 91 (threshold 15). Of this number, 54 points are the body\u0027s own statements and 37 belong to 10 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":"invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerView.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"c151ff68fdea2714b386c294c2dd32c53cc95cc3025acf1b6b5944cf311dda8d"}},{"ruleId":"D1","level":"warning","message":{"text":"readiness.getReasonsWhyCannotEnqueueGenerateTab (cyclomatic 90): readiness.getReasonsWhyCannotEnqueueGenerateTab has cyclomatic complexity 90 (threshold 15). 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, 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":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc106ecdf2f1cfdbfbfc464cb86c8ee3efab0d20ed6f93d55177785ff6fefaf4"}},{"ruleId":"D1","level":"warning","message":{"text":"queueRunRestoration.normalizeRestoredQueueItem (cyclomatic 90): queueRunRestoration.normalizeRestoredQueueItem has cyclomatic complexity 90 (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":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRunRestoration.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a0d4756aac9d65ae3fe7881b1f3598bc68adc731b2d7f61ec84dfd745e880de"}},{"ruleId":"D1","level":"warning","message":{"text":"video_smart_concat.try_build_smart_render_plan (cyclomatic 89): video_smart_concat.try_build_smart_render_plan has cyclomatic complexity 89 (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":"invokeai/app/util/video_smart_concat.py"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed4b406023fb96b5620798343f995ac4d544d3fc12253af5f6bdd338fb1b5280"}},{"ruleId":"D1","level":"warning","message":{"text":"runtime.createFontRuntime (cyclomatic 89): runtime.createFontRuntime has cyclomatic complexity 89 (threshold 15). Most of this is not in the body itself: 1 of the 89 points is its own statement and the rest belongs to 24 function items inside it that branch (a function literal at line 452, a function literal at line 575, removeState, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/fonts/runtime.ts"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"23dfcb7bbb6b03883dd3e1a14a4cedb9704a829974f6114ff3be15e20d7ca6bc"}},{"ruleId":"D1","level":"warning","message":{"text":"document.applyProjectGraphAction (cyclomatic 89): document.applyProjectGraphAction has cyclomatic complexity 89 (threshold 15). Of this number, 71 points are the body\u0027s own statements and 18 belong to 9 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":"invokeai/frontend/webv2/src/features/workflow/core/document.ts"},"region":{"startLine":907}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6665a8fdcd62018313c7bfb0f5ac5b63034082e2efc58f144a6e95fe96c08de"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelInstallQueueItem.ModelInstallQueueItem (cyclomatic 81): ModelInstallQueueItem.ModelInstallQueueItem has cyclomatic complexity 81 (threshold 15). Of this number, 36 points are the body\u0027s own statements and 45 belong to 15 function literals inside it that branch. To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueItem.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"2924e0500bd65d4712578731b80d2ef28d89ebb05b465deceee5601319dd2c64"}},{"ruleId":"D1","level":"warning","message":{"text":"PreviewFrame.PreviewVideo (cyclomatic 80): PreviewFrame.PreviewVideo has cyclomatic complexity 80 (threshold 15). Most of this is not in the body itself: 11 of the 80 points are its own statements and the rest belongs to 23 function literals inside it that branch (lines 462, 792, 601, \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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"637b4675deb0201aaaba73d1d4f7e4aa4596fdd1a8f2673b26c2fca379ce471f"}},{"ruleId":"D1","level":"warning","message":{"text":"canvasProjectMutations.applyCanvasProjectMutation (cyclomatic 77): canvasProjectMutations.applyCanvasProjectMutation has cyclomatic complexity 77 (threshold 15). Of this number, 64 points are the body\u0027s own statements and 13 belong to 8 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":"invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts"},"region":{"startLine":669}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1684ab8499dcfd78cb5d0a7bbfa875d6504305083076675a557053999077da0"}},{"ruleId":"D1","level":"warning","message":{"text":"useGalleryData.useGalleryData (cyclomatic 75): useGalleryData.useGalleryData has cyclomatic complexity 75 (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":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryData.ts"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"3544c2abea9e0163736a9ca15749f8e2e68a5eed1695363d7cea2e1e1161ae49"}},{"ruleId":"D1","level":"warning","message":{"text":"videoPolicies.getVideoModelSelectionResult (cyclomatic 74): videoPolicies.getVideoModelSelectionResult has cyclomatic complexity 74 (threshold 15). Of this number, 71 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":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":1964}}}],"partialFingerprints":{"codehealthFindingId/v1":"86c9eef10ae14e35f4ea72da339336ec8010bcb8dab59bd953576af44d92e5c7"}},{"ruleId":"D1","level":"warning","message":{"text":"ImageMapPlot.ImageMapPlot (cyclomatic 74): ImageMapPlot.ImageMapPlot has cyclomatic complexity 74 (threshold 15). Most of this is not in the body itself: 5 of the 74 points are its own statements and the rest belongs to 25 function items inside it that branch (a function literal at line 446, a function literal at line 392, a function literal at line 197, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapPlot.tsx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"a60c5557bb1edac409d9d2001cb38d884023387ccc63021785410beb130721a5"}},{"ruleId":"D1","level":"warning","message":{"text":"executeVideoRecall.applyVideoRecallMetadata (cyclomatic 72): executeVideoRecall.applyVideoRecallMetadata has cyclomatic complexity 72 (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":"invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3a0a5b669a68c10c095132880411b496c55ab66411c982f81a558fe4430d0c2"}},{"ruleId":"D1","level":"warning","message":{"text":"validateWorkflow.validateWorkflow (cyclomatic 70): validateWorkflow.validateWorkflow has cyclomatic complexity 70 (threshold 15). Of this number, 69 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":"invokeai/frontend/webv1/src/features/nodes/util/workflow/validateWorkflow.ts"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"b51636f231557c774e72de39c53b729f37b2667715c26fe0ede0e81ee39ffc01"}},{"ruleId":"D1","level":"warning","message":{"text":"workbenchState.enqueueCompiledSnapshot (cyclomatic 70): workbenchState.enqueueCompiledSnapshot has cyclomatic complexity 70 (threshold 15). Of this number, 66 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":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":3538}}}],"partialFingerprints":{"codehealthFindingId/v1":"be7703883fa52d4bfc9c9aeb36e2fc3bf716c5041a0a5288cbf5143dc3a2d1a5"}},{"ruleId":"D1","level":"warning","message":{"text":"CanvasTextOverlay.TextEditor (cyclomatic 69): CanvasTextOverlay.TextEditor has cyclomatic complexity 69 (threshold 15). Most of this is not in the body itself: 12 of the 69 points are its own statements and the rest belongs to 24 function literals inside it that branch (lines 307, 571, 230, \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ae103e5b8f56af9412987a437d29a290534c6b968504299f30c670bd11a5ce7"}},{"ruleId":"D1","level":"warning","message":{"text":"IntermediatesManager.IntermediatesManager (cyclomatic 69): IntermediatesManager.IntermediatesManager has cyclomatic complexity 69 (threshold 15). Of this number, 56 points are the body\u0027s own statements and 13 belong to 8 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":"invokeai/frontend/webv2/src/features/intermediates/ui/IntermediatesManager.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb0bb3b931f8582d13e53d74c5e1a42a2da48cc668a84e8f35bcf3f145b5da8"}},{"ruleId":"D1","level":"warning","message":{"text":"PreviewWidgetView.PreviewWidgetView (cyclomatic 69): PreviewWidgetView.PreviewWidgetView has cyclomatic complexity 69 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 52 belong to 15 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewWidgetView.tsx"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7b975a54a9ebe641cb505f4c7f02163108611ab6d526843a63a18fb847907a0"}},{"ruleId":"D1","level":"warning","message":{"text":"DownloadQueueService._do_download (cyclomatic 68): DownloadQueueService._do_download has cyclomatic complexity 68 (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":"invokeai/app/services/download/download_default.py"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"230fbcf3640b1b3d523ba1b8ac079f5c0f88b1577fe76baaf1156d751639df5f"}},{"ruleId":"D1","level":"warning","message":{"text":"AddNodeDialog.AddNodeDialogContent (cyclomatic 67): AddNodeDialog.AddNodeDialogContent has cyclomatic complexity 67 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 40 belong to 13 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/AddNodeDialog.tsx"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3e2cba02d5d1868ca11752dcc66b6997424d8aadef11c3e4a9e775fa3f0bef6"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowPublicationHost.WorkflowPublicationHost (cyclomatic 67): WorkflowPublicationHost.WorkflowPublicationHost has cyclomatic complexity 67 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 42 belong to 20 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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowPublicationHost.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d6f4d7c207129d6d8180e60bb06f44794d3e254342b067cd4820d5a47a197fb"}},{"ruleId":"D1","level":"warning","message":{"text":"lora._is_flux2_lora_state_dict (cyclomatic 66): lora._is_flux2_lora_state_dict has cyclomatic complexity 66 (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":"invokeai/backend/model_manager/configs/lora.py"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"3735725e1181426b33889996011bccca817b19e6d0a4058640914be408397a21"}},{"ruleId":"D1","level":"warning","message":{"text":"FloatingWidgetWindow.FloatingWidgetWindow (cyclomatic 66): FloatingWidgetWindow.FloatingWidgetWindow has cyclomatic complexity 66 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 41 belong to 15 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":"invokeai/frontend/webv2/src/workbench/widget-frame/FloatingWidgetWindow.tsx"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"52f995550390979dda068e5ea082cef1e3925c6cfabd9e48bf28348c2d06604c"}},{"ruleId":"D1","level":"warning","message":{"text":"utils.pred_squares (cyclomatic 65): utils.pred_squares has cyclomatic complexity 65 (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":"invokeai/backend/image_util/mlsd/utils.py"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"81790bac2d7fcac24776b5a7e78e2f86cf5d45704db86be4a8ad20a3de5c448b"}},{"ruleId":"D1","level":"warning","message":{"text":"validateConnection.validateConnection (cyclomatic 65): validateConnection.validateConnection has cyclomatic complexity 65 (threshold 15). Of this number, 59 points are the body\u0027s own statements and 6 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":"invokeai/frontend/webv1/src/features/nodes/store/util/validateConnection.ts"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"f19e4ef0a62fb314063f2d825417ebae0ac3b95d0ade06e91f86aa6eccf96163"}},{"ruleId":"D1","level":"warning","message":{"text":"utilityGraph.runUtilityGraph (cyclomatic 65): utilityGraph.runUtilityGraph has cyclomatic complexity 65 (threshold 15). Most of this is not in the body itself: 5 of the 65 points are its own statements and the rest belongs to 15 function literals inside it that branch (lines 359, 426, 258, \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":"invokeai/frontend/webv2/src/features/queue/runtime/utilityGraph.ts"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cb3bb593b7d00b75bad416d0b06b0ae581b6e43f795bf71f6c54a95b31fd8d2"}},{"ruleId":"D1","level":"warning","message":{"text":"LayerRow.LayerRowComponent (cyclomatic 65): LayerRow.LayerRowComponent has cyclomatic complexity 65 (threshold 15). Of this number, 45 points are the body\u0027s own statements and 20 belong to 9 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRow.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1187074ff627bbca8d3ce4519a2bf40b8afd0e1bcea501bf39f5327015adbd1"}},{"ruleId":"D1","level":"warning","message":{"text":"InputFieldRenderer.InputFieldRenderer (cyclomatic 64): InputFieldRenderer.InputFieldRenderer has cyclomatic complexity 64 (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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ffab2f577d3137d1aa7faabcf5378f1448ed091d004e0395b2078f770ff77db"}},{"ruleId":"D1","level":"warning","message":{"text":"addRegions.addRegions (cyclomatic 64): addRegions.addRegions has cyclomatic complexity 64 (threshold 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"10c534634257cd7da4a273a606fc95559be78317dd3ed630a89b3f03891e588f"}},{"ruleId":"D1","level":"warning","message":{"text":"buildFLUXGraph.buildFLUXGraph (cyclomatic 64): buildFLUXGraph.buildFLUXGraph has cyclomatic complexity 64 (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 shape REPEATS in the file: one other method here (buildFLUXGraph.buildFLUXGraph::addFlux2Features) 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"38842868240945aadbf3c952ee54ec054b2a5eb549c946e2084633c5ce271328"}},{"ruleId":"D1","level":"warning","message":{"text":"GalleryMediaSlot.GalleryMediaSlot (cyclomatic 62): GalleryMediaSlot.GalleryMediaSlot has cyclomatic complexity 62 (threshold 15). Of this number, 46 points are the body\u0027s own statements and 16 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":"invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryMediaSlot.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f045bdc684b1fa835a88717160fcddeb64c0f405d943390550fc4841b06b570"}},{"ruleId":"D1","level":"warning","message":{"text":"AddModelsView.AddModelsView (cyclomatic 62): AddModelsView.AddModelsView has cyclomatic complexity 62 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 37 belong to 14 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":"invokeai/frontend/webv2/src/features/models/ui/add-models/AddModelsView.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3b1d6de399efd0ddbdfbdb60661bc62979f4cc2697ba5f30f89fdbfe44c2c89"}},{"ruleId":"D1","level":"warning","message":{"text":"settings.isVideoSettings (cyclomatic 61): settings.isVideoSettings has cyclomatic complexity 61 (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":"invokeai/frontend/webv2/src/features/video/core/settings.ts"},"region":{"startLine":446}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed4d1a347353000a4196113b73207995fe7de484cb6bfd8312456725268a3b91"}},{"ruleId":"D1","level":"warning","message":{"text":"graph.buildLtx2VideoGraph (cyclomatic 61): graph.buildLtx2VideoGraph has cyclomatic complexity 61 (threshold 15). Of this number, 59 points are the body\u0027s own statements and 2 belong to 2 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":"invokeai/frontend/webv2/src/features/video/core/graph.ts"},"region":{"startLine":654}}}],"partialFingerprints":{"codehealthFindingId/v1":"6672ce05bd89559b1dc45689f66218022c6d1cb1c8894d2e5557ad5f50d1a6ff"}},{"ruleId":"D1","level":"warning","message":{"text":"GenerationSettingsAccordion.GenerationSettingsAccordion (cyclomatic 60): GenerationSettingsAccordion.GenerationSettingsAccordion has cyclomatic complexity 60 (threshold 15). Of this number, 58 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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"3699490ee43dffbe50a9ad90d6b28103ddcb895e4a7267ed3349a10dfe1def88"}},{"ruleId":"D1","level":"warning","message":{"text":"forLoops.validateForLoopGraph::getSupportedNestedForBody (cyclomatic 59): forLoops.validateForLoopGraph::getSupportedNestedForBody has cyclomatic complexity 59 (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 shape REPEATS in the file: 2 other methods here (forLoops.validateForLoopGraph, forLoops.validateForLoopGraph::supportsNestedIterateBody) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 3 times rather than 3 independent problems. Splitting this body alone leaves the other 2 exactly as they are. Where these are variations on one operation, the change that clears all 3 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":"invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc05040c6ee47dea10c6a435296cd17095d14c1af58d411d44e64bf664d56941"}},{"ruleId":"D1","level":"warning","message":{"text":"runtime.createQueueRuntime.reconcile (cyclomatic 58): runtime.createQueueRuntime.reconcile has cyclomatic complexity 58 (threshold 15). Most of this is not in the body itself: 8 of the 58 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 2168, 2121, 2092, \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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":2076}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a89c4101c78379c02e9a7baf682bec8c270eb7c75fbd8ec49b325646926cd87"}},{"ruleId":"D1","level":"warning","message":{"text":"graph_loop_topology._recognize_nested_for_body (cyclomatic 56): graph_loop_topology._recognize_nested_for_body 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":"invokeai/app/services/shared/graph_loop_topology.py"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7bc82a9ed25aafcf59822cacfac01c022c1c6745336f93c94cc491b22488d32"}},{"ruleId":"D1","level":"warning","message":{"text":"hidiffusion.apply_hidiffusion (cyclomatic 55): hidiffusion.apply_hidiffusion has cyclomatic complexity 55 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/hidiffusion/hidiffusion.py"},"region":{"startLine":2040}}}],"partialFingerprints":{"codehealthFindingId/v1":"d82e97a864bba564a646c1556ab9cf722657b9fb1e859cb078b547a66e02266c"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowFieldRenderer.WorkflowFieldRenderer (cyclomatic 55): WorkflowFieldRenderer.WorkflowFieldRenderer has cyclomatic complexity 55 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 37 belong to 10 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa912cb70d81504be6a4dcc40cfaf84fc48b98a5da7749e3e939945e1ed95d11"}},{"ruleId":"D1","level":"warning","message":{"text":"ReferenceImageCropDialog.ReferenceImageCropDialog (cyclomatic 55): ReferenceImageCropDialog.ReferenceImageCropDialog has cyclomatic complexity 55 (threshold 15). Most of this is not in the body itself: 7 of the 55 points are its own statements and the rest belongs to 19 function literals inside it that branch (lines 459, 389, 403, \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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"9502a10f8cb4e7ca63441e57f51c2c649801573346d89b418099d6b2a12f1350"}},{"ruleId":"D1","level":"warning","message":{"text":"imageRecall.buildImageRecallSettings (cyclomatic 55): imageRecall.buildImageRecallSettings has cyclomatic complexity 55 (threshold 15). Of this number, 53 points are the body\u0027s own statements and 2 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":"invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts"},"region":{"startLine":1115}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d86aed5f3c576f30a0e9f4ea6a97f8cb785a27e8aa0fe2b76d1a2a68931a6ff"}},{"ruleId":"D1","level":"warning","message":{"text":"forLoops.validateForLoopGraph (cyclomatic 54): forLoops.validateForLoopGraph has cyclomatic complexity 54 (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. This shape REPEATS in the file: 2 other methods here (forLoops.validateForLoopGraph::supportsNestedIterateBody, forLoops.validateForLoopGraph::getSupportedNestedForBody) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 3 times rather than 3 independent problems. Splitting this body alone leaves the other 2 exactly as they are. Where these are variations on one operation, the change that clears all 3 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":"invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"49980319eb787ac99fb4c31035f2d73dd45979cbd7ad506d1962acb6dade316f"}},{"ruleId":"D1","level":"warning","message":{"text":"List.List (cyclomatic 54): List.List has cyclomatic complexity 54 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 34 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":"invokeai/frontend/webv2/src/platform/ui/list/List.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"3aa25cf7a9ad14e62720611905f6dfb1d1a875afcaad0b979901680bbf900cd1"}},{"ruleId":"D1","level":"warning","message":{"text":"ZImageDenoiseInvocation._run_diffusion (cyclomatic 53): ZImageDenoiseInvocation._run_diffusion has cyclomatic complexity 53 (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":"invokeai/app/invocations/z_image/z_image_denoise.py"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"c32292d5be8922e9b914c549c2fd7b37dd9e2f796390a2b5cc7d13184e7fd248"}},{"ruleId":"D1","level":"warning","message":{"text":"widgetValues.syncVideoWidgetValuesWithModels (cyclomatic 53): widgetValues.syncVideoWidgetValuesWithModels has cyclomatic complexity 53 (threshold 15). Of this number, 44 points are the body\u0027s own statements and 9 belong to 2 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":"invokeai/frontend/webv2/src/features/video/core/widgetValues.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"6348566b3d625e23975f21e35ce25570ffeaa53d32a647a7dd2708043a989c5d"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowLibraryDetailPanel.WorkflowLibraryDetailPanel (cyclomatic 53): WorkflowLibraryDetailPanel.WorkflowLibraryDetailPanel has cyclomatic complexity 53 (threshold 15). Most of this is not in the body itself: 13 of the 53 points are its own statements and the rest belongs to 14 function literals inside it that branch (lines 143, 182, 237, \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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.tsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fa4ddf1d8bfea6e58e505b0f8db5fa251382dc33b72b17d0171acafb5572941"}},{"ruleId":"D1","level":"warning","message":{"text":"AdvancedSettingsAccordion.AdvancedSettingsAccordion (cyclomatic 52): AdvancedSettingsAccordion.AdvancedSettingsAccordion has cyclomatic complexity 52 (threshold 15). Of this number, 37 points are the body\u0027s own statements and 15 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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7e5e4c91abffde769aca6b832d134f7128858f047a0cd85df78dff282be032b"}},{"ruleId":"D1","level":"warning","message":{"text":"GenerateAdvancedFields.GenerateAdvancedFields (cyclomatic 52): GenerateAdvancedFields.GenerateAdvancedFields has cyclomatic complexity 52 (threshold 15). Of this number, 46 points are the body\u0027s own statements and 6 belong to 5 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":"invokeai/frontend/webv2/src/features/generation/ui/GenerateAdvancedFields.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee9ef45b6511e38f33871e954bd4b66488dae6747145d403dce712de8ced8ef3"}},{"ruleId":"D1","level":"warning","message":{"text":"batch.planWorkflowBatch (cyclomatic 52): batch.planWorkflowBatch has cyclomatic complexity 52 (threshold 15). Of this number, 49 points are the body\u0027s own statements and 3 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":"invokeai/frontend/webv2/src/features/workflow/core/batch.ts"},"region":{"startLine":681}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8c9087211a0418464b1bff19f03b6d1511e86b343c2f2bc3ceaec87cdf2be42"}},{"ruleId":"D1","level":"warning","message":{"text":"GalleryItemSearch.GalleryItemSearch (cyclomatic 51): GalleryItemSearch.GalleryItemSearch has cyclomatic complexity 51 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 29 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryItemSearch.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d87ebbdb023c1a6640048828e90e7b0133a5f06e87639d26327235ae57d0a3e"}},{"ruleId":"D1","level":"warning","message":{"text":"settings.getUpscaleValidationReasons (cyclomatic 51): settings.getUpscaleValidationReasons has cyclomatic complexity 51 (threshold 15). Of this number, 50 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":"invokeai/frontend/webv2/src/features/upscale/core/settings.ts"},"region":{"startLine":948}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1704b992bfea62305aaf6576da0e1051180fc2f242aefff1d4792b5e2f740b6"}},{"ruleId":"D1","level":"warning","message":{"text":"PreviewFrame.PreviewImageFrame (cyclomatic 51): PreviewFrame.PreviewImageFrame has cyclomatic complexity 51 (threshold 15). Of this number, 36 points are the body\u0027s own statements and 15 belong to 6 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"9678d98dd26f406bfee4537b600a7b10384a51ac3e319e6ce147466541ed7c43"}},{"ruleId":"D1","level":"warning","message":{"text":"ControlLayerSettings.ControlLayerSettings (cyclomatic 51): ControlLayerSettings.ControlLayerSettings has cyclomatic complexity 51 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 29 belong to 18 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2fd76eefbfc53fd24112338d9412c9732e8bdefa378465c50dd5832d4580b93"}},{"ruleId":"D1","level":"warning","message":{"text":"_ExecutionNodeBuilder.prepare (cyclomatic 50): _ExecutionNodeBuilder.prepare has cyclomatic complexity 50 (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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":2385}}}],"partialFingerprints":{"codehealthFindingId/v1":"54160efd980254da3a094056265c2b77c116a7df128923c7274a70a7881a8a88"}},{"ruleId":"D1","level":"warning","message":{"text":"FontsPage.FontLibrary (cyclomatic 50): FontsPage.FontLibrary has cyclomatic complexity 50 (threshold 15). Of this number, 26 points are the body\u0027s own statements and 24 belong to 14 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":"invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.tsx"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b34d4c0a610273c4c171273bb6792a64d53c6ed5ac97cf44d5ccd139b755c0e"}},{"ruleId":"D1","level":"warning","message":{"text":"VideoReferenceListField.VideoReferenceListField (cyclomatic 50): VideoReferenceListField.VideoReferenceListField has cyclomatic complexity 50 (threshold 15). Most of this is not in the body itself: 14 of the 50 points are its own statements and the rest belongs to 17 function literals inside it that branch (lines 540, 558, 470, \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":"invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx"},"region":{"startLine":363}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e5e4073d8498c39a7f0013e854f71df1c6d645e06aad7fc52f6b28e97dbbcba"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphExecutionState._can_use_generic_two_sibling_nested_for_scheduler (cyclomatic 49): GraphExecutionState._can_use_generic_two_sibling_nested_for_scheduler has cyclomatic complexity 49 (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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1050}}}],"partialFingerprints":{"codehealthFindingId/v1":"681431b401ea355692ae6082a32ccb5502c57050e42176f922d5bf0cd6ac6110"}},{"ruleId":"D1","level":"warning","message":{"text":"layerChildRows.layerChildRowCommand (cyclomatic 49): layerChildRows.layerChildRowCommand has cyclomatic complexity 49 (threshold 15). Of this number, 45 points are the body\u0027s own statements and 4 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerChildRows.ts"},"region":{"startLine":507}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac98b1411fa84dd32c2945ec37a950463cb9f7014f0e48b6355a165166221647"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphExecutionState._can_use_generic_for_scheduler (cyclomatic 48): GraphExecutionState._can_use_generic_for_scheduler has cyclomatic complexity 48 (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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1251}}}],"partialFingerprints":{"codehealthFindingId/v1":"fba60898120d768fc000373e9b2c63f94742a72e062d89814da5930e98d955f4"}},{"ruleId":"D1","level":"warning","message":{"text":"draftStore.isProjectDraftCandidate (cyclomatic 48): draftStore.isProjectDraftCandidate has cyclomatic complexity 48 (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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"d564b7eabc16ecaff53ad1d99066335657fb688b5434db67239fb08cbfd18510"}},{"ruleId":"D1","level":"warning","message":{"text":"GalleryMaintenance.GalleryMaintenance (cyclomatic 48): GalleryMaintenance.GalleryMaintenance has cyclomatic complexity 48 (threshold 15). Most of this is not in the body itself: 13 of the 48 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 157, 235, 108, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/GalleryMaintenance.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"182e5ef36dbd03483d66a97b26c82e431797fd177bc380f34e0d3a47a986c042"}},{"ruleId":"D1","level":"warning","message":{"text":"useGalleryActions.useGalleryActions (cyclomatic 47): useGalleryActions.useGalleryActions has cyclomatic complexity 47 (threshold 15). Most of this is not in the body itself: 1 of the 47 points is its own statement and the rest belongs to 10 function literals inside it that branch (lines 237, 98, 63, \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":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryActions.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e240d9bec30bf8df2e0f44df618f5e8b05a24f5bd2d656e89d22a3344329544"}},{"ruleId":"D1","level":"warning","message":{"text":"UpscaleWidgetView.UpscaleWidgetView (cyclomatic 47): UpscaleWidgetView.UpscaleWidgetView has cyclomatic complexity 47 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 27 belong to 14 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":"invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"55290d5c1f0dd1bb6a88d691578db24bb68728fa40c98f624f6929a729b602d8"}},{"ruleId":"D1","level":"warning","message":{"text":"ListItem.ListItem (cyclomatic 47): ListItem.ListItem has cyclomatic complexity 47 (threshold 15). Of this number, 32 points are the body\u0027s own statements and 15 belong to 6 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":"invokeai/frontend/webv2/src/platform/ui/list/ListItem.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"897990cf6e1704cef26dcbad9bf550c3c1e08324b28b384a4bada7f8fb7c57f4"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectConflictBanner.ProjectConflictBanner (cyclomatic 47): ProjectConflictBanner.ProjectConflictBanner has cyclomatic complexity 47 (threshold 15). Of this number, 32 points are the body\u0027s own statements and 15 belong to 7 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":"invokeai/frontend/webv2/src/workbench/shell/ProjectConflictBanner.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fb3d412e19ed67b155a9abf9d79ac1f36b287e6fce7ec2da4341432fbe548b7"}},{"ruleId":"D1","level":"warning","message":{"text":"WanDenoiseInvocation._run_diffusion (cyclomatic 46): WanDenoiseInvocation._run_diffusion has cyclomatic complexity 46 (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":"invokeai/app/invocations/wan/wan_denoise.py"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"8770d70607b1914ef77a3f11f371c4d3ceddbb0ad0af6bbaf284c1c74660e371"}},{"ruleId":"D1","level":"warning","message":{"text":"workflow_graph_builder.build_graph_from_workflow (cyclomatic 46): workflow_graph_builder.build_graph_from_workflow has cyclomatic complexity 46 (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":"invokeai/app/services/shared/workflow_graph_builder.py"},"region":{"startLine":367}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ff4bb164a9fa524b63ee7623d37c68211ef1b1a2b9b27edeedc17145d54062d"}},{"ruleId":"D1","level":"warning","message":{"text":"useCanvasWorkflowIntegrationExecute.useCanvasWorkflowIntegrationExecute.execute (cyclomatic 46): useCanvasWorkflowIntegrationExecute.useCanvasWorkflowIntegrationExecute.execute has cyclomatic complexity 46 (threshold 15). Of this number, 35 points are the body\u0027s own statements and 11 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c925617055b0a913a375610ed7f9571647ce41db3abdea1971ec1fcfed834d7"}},{"ruleId":"D1","level":"warning","message":{"text":"Editor.getNextCropBoxByHandleWithAspectRatio (cyclomatic 46): Editor.getNextCropBoxByHandleWithAspectRatio has cyclomatic complexity 46 (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":"invokeai/frontend/webv1/src/features/cropper/lib/editor.ts"},"region":{"startLine":746}}}],"partialFingerprints":{"codehealthFindingId/v1":"f89ea3d66e8e52c71de25b7483bf82d90a6561d810c94292fdd6fdfef7590942"}},{"ruleId":"D1","level":"warning","message":{"text":"CurrentVideoPreview.CurrentVideoPreview (cyclomatic 46): CurrentVideoPreview.CurrentVideoPreview has cyclomatic complexity 46 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 29 belong to 12 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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2d3fe9eb618bb9f8f0a1cb3adf7e506b885d81c300c9445d74b1e85b504d2ea"}},{"ruleId":"D1","level":"warning","message":{"text":"settings.normalizeVideoSettings (cyclomatic 46): settings.normalizeVideoSettings has cyclomatic complexity 46 (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":"invokeai/frontend/webv2/src/features/video/core/settings.ts"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5115d083d070a17a3780b1f8f808ae062b52f336f2c6fd9a938ad80a2b8fb5a"}},{"ruleId":"D1","level":"warning","message":{"text":"templates.parseInvocationSchema (cyclomatic 46): templates.parseInvocationSchema has cyclomatic complexity 46 (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":"invokeai/frontend/webv2/src/features/workflow/data/templates.ts"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"b99d585c3a89ae7e0ec45170ab10a5d4d0d95e73d3d0059bcfc56c50545873ab"}},{"ruleId":"D1","level":"warning","message":{"text":"CanvasWidgetView.CanvasWidgetView (cyclomatic 46): CanvasWidgetView.CanvasWidgetView has cyclomatic complexity 46 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 29 belong to 14 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasWidgetView.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"2327155cd9a1d67243e442242332e140927a1816ae337015a2f3ac54ab18da3b"}},{"ruleId":"D1","level":"warning","message":{"text":"usePreviewNavigation.usePreviewNavigation.navigate (cyclomatic 46): usePreviewNavigation.usePreviewNavigation.navigate has cyclomatic complexity 46 (threshold 15). Most of this is not in the body itself: 12 of the 46 points are its own statements and the rest belongs to 4 function items inside it that branch (a function literal at line 780, stepTo, isCurrentNavigation, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewNavigation.ts"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"4220288bda85cb7123dae37cc1c6ba83e178beef5d5502ada4016667c39e2972"}},{"ruleId":"D1","level":"warning","message":{"text":"graph_if_dependencies._can_use_fresh_flat_if_activation (cyclomatic 45): graph_if_dependencies._can_use_fresh_flat_if_activation 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":"invokeai/app/services/shared/graph_if_dependencies.py"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"503c87997f9e7a3543edf06de3933cbff97b42310b734b9e953bd8f93f2fd596"}},{"ruleId":"D1","level":"warning","message":{"text":"video_smart_concat.encode_rgb_frames (cyclomatic 45): video_smart_concat.encode_rgb_frames 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":"invokeai/app/util/video_smart_concat.py"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"dac8b6158c48c5b15ff931e55e554c03bbe792f312dc6548d695e0d61895ea0c"}},{"ruleId":"D1","level":"warning","message":{"text":"settings.normalizeGenerateSettings (cyclomatic 45): settings.normalizeGenerateSettings has cyclomatic complexity 45 (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":"invokeai/frontend/webv2/src/features/generation/core/settings.ts"},"region":{"startLine":743}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ee026761ce7e7a0c8f2a43753ab357f2679ebb8aa15325c184f4b3422023127"}},{"ruleId":"D1","level":"warning","message":{"text":"ExtractMaskedAreaController.extract (cyclomatic 45): ExtractMaskedAreaController.extract has cyclomatic complexity 45 (threshold 15). Of this number, 44 points are the body\u0027s own statements and 1 belongs 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/extractMaskedAreaController.ts"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"c870d5cc36e91224283c31b2a644f136f4c7a0587e6636e33407f39b25751217"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphExecutionState._can_use_generic_nested_iterate_scheduler (cyclomatic 44): GraphExecutionState._can_use_generic_nested_iterate_scheduler has cyclomatic complexity 44 (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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1404}}}],"partialFingerprints":{"codehealthFindingId/v1":"14ed2054b2d765f6b86ebb4c50cbf3c1bd6baaf113e4e3b2ca83091deb3407cd"}},{"ruleId":"D1","level":"warning","message":{"text":"strokeSession.createStrokeSession.paint (cyclomatic 44): strokeSession.createStrokeSession.paint has cyclomatic complexity 44 (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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/strokeSession.ts"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"04a78d3b73c1340fe097ef2c542a939efb3c92aa0c0d4c1324c1fbf0298caed7"}},{"ruleId":"D1","level":"warning","message":{"text":"lora._get_flux2_lora_variant (cyclomatic 43): lora._get_flux2_lora_variant 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":"invokeai/backend/model_manager/configs/lora.py"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"019f084b3c9b7dc3e3be2f97f5ddca4cc1a0276356e475683fca71d343aa397c"}},{"ruleId":"D1","level":"warning","message":{"text":"PidNet.forward (cyclomatic 43): PidNet.forward 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":"invokeai/backend/pid/_src/networks/pid_net.py"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"a83535938263fab311477811105b55717594d35485e191907928dd7410047c66"}},{"ruleId":"D1","level":"warning","message":{"text":"CanvasEntityObjectRenderer.renderObject (cyclomatic 43): CanvasEntityObjectRenderer.renderObject 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc4447881d8c9f9576ccd6de51b42e5ddcaba1cfffebecf76fdbd189c964bdfd"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelView.ModelView (cyclomatic 43): ModelView.ModelView has cyclomatic complexity 43 (threshold 15). Of this number, 34 points are the body\u0027s own statements and 9 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelView.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"29fb01d1b631ad0a03e5991110a0840dcb9d786a6ad38de80dcbf94e1826f9fc"}},{"ruleId":"D1","level":"warning","message":{"text":"GeminiProvider.generate (cyclomatic 42): GeminiProvider.generate 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":"invokeai/app/services/external_generation/providers/gemini.py"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"2765b3660b93d420540d37d0712916b515e83c9d15755bab6525a1f31cb77783"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelSelect.ModelSelect (cyclomatic 42): ModelSelect.ModelSelect has cyclomatic complexity 42 (threshold 15). Of this number, 34 points are the body\u0027s own statements and 8 belong to 7 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":"invokeai/frontend/webv2/src/features/models/ui/components/ModelSelect.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"60616927f6109c852d19d6d82439094f861fe951374de7b51d966a74c49d55f4"}},{"ruleId":"D1","level":"warning","message":{"text":"InvocationFlowNode.ExpandedInvocationNode (cyclomatic 42): InvocationFlowNode.ExpandedInvocationNode has cyclomatic complexity 42 (threshold 15). Of this number, 41 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.tsx"},"region":{"startLine":961}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8629c78bb910c65a5d9b8d5f20d75f902e553864d281aeeccdb54d2b6647874"}},{"ruleId":"D1","level":"warning","message":{"text":"compositor.compositeDocument (cyclomatic 42): compositor.compositeDocument has cyclomatic complexity 42 (threshold 15). Of this number, 32 points are the body\u0027s own statements and 10 belong to 3 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositor.ts"},"region":{"startLine":520}}}],"partialFingerprints":{"codehealthFindingId/v1":"e90dc66b7f4a3e2a5eb4ccc7607f277069384d7b2c90800c01980a7a35e3496c"}},{"ruleId":"D1","level":"warning","message":{"text":"parseFieldType.parseFieldType (cyclomatic 41): parseFieldType.parseFieldType has cyclomatic complexity 41 (threshold 15). Of this number, 39 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":"invokeai/frontend/webv1/src/features/nodes/util/schema/parseFieldType.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"d55b701d6d39e5e575d7d47b0e6cd0507e5df02cb59a5456e1b95f703b8e6470"}},{"ruleId":"D1","level":"warning","message":{"text":"useGalleryUploadAction.useGalleryUploadAction (cyclomatic 41): useGalleryUploadAction.useGalleryUploadAction has cyclomatic complexity 41 (threshold 15). Most of this is not in the body itself: 1 of the 41 points is its own statement and the rest belongs to 8 function literals inside it that branch (lines 68, 218, 148, \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":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryUploadAction.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"bafcb3a75d8974fbfbd809beb99f642c9f92f1ffab39ce8af76b289ecce40c79"}},{"ruleId":"D1","level":"warning","message":{"text":"GalleryBoardsPanel.GalleryBoardsPanel (cyclomatic 41): GalleryBoardsPanel.GalleryBoardsPanel has cyclomatic complexity 41 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 17 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardsPanel.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"59f3c786ff081664f318228e103da65805342974ff160d1011235eaecc785775"}},{"ruleId":"D1","level":"warning","message":{"text":"GalleryThumbnail.GalleryThumbnail (cyclomatic 41): GalleryThumbnail.GalleryThumbnail has cyclomatic complexity 41 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 22 belong to 14 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryThumbnail.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"df8294fd2830d12c8e6d7a60ce5e7af60edac6c7c20503ff17cfac7d1568b4f5"}},{"ruleId":"D1","level":"warning","message":{"text":"useCompareLoupe.useCompareLoupe (cyclomatic 41): useCompareLoupe.useCompareLoupe has cyclomatic complexity 41 (threshold 15). Most of this is not in the body itself: 2 of the 41 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 399, 323, 210, \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":"invokeai/frontend/webv2/src/workbench/widgets/preview/useCompareLoupe.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8d4dd779360fd01822f82cb8c5f9fc7666efac7c8aabde4050b531d9a4cc313"}},{"ruleId":"D1","level":"warning","message":{"text":"QueueRecoveryNotice.QueueRecoveryNotice (cyclomatic 41): QueueRecoveryNotice.QueueRecoveryNotice has cyclomatic complexity 41 (threshold 15). Most of this is not in the body itself: 13 of the 41 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 66, 92, 113, \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":"invokeai/frontend/webv2/src/workbench/queue-integration/QueueRecoveryNotice.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"be2719bb66b96cb6674b9a6aa0f9057ea3c5fba0db5bbab62d07db6dc0e4aa46"}},{"ruleId":"D1","level":"warning","message":{"text":"AnimaDenoiseInvocation._run_diffusion (cyclomatic 40): AnimaDenoiseInvocation._run_diffusion 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":"invokeai/app/invocations/anima/anima_denoise.py"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"593f4bb9baccc1420f919913c1d6a6a2ea0bb7b2a846e3fdf6a48579bb0c79ad"}},{"ruleId":"D1","level":"warning","message":{"text":"InvokeImageBlendInvocation.apply_blend (cyclomatic 40): InvokeImageBlendInvocation.apply_blend 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":"invokeai/app/invocations/composition-nodes.py"},"region":{"startLine":679}}}],"partialFingerprints":{"codehealthFindingId/v1":"4770e980f30d380e9427d77c8ce55de1cac9116689785e66222d7bb0cf10aa62"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphExecutionState._can_use_generic_serial_nested_for_scheduler (cyclomatic 40): GraphExecutionState._can_use_generic_serial_nested_for_scheduler 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1158}}}],"partialFingerprints":{"codehealthFindingId/v1":"96af50193150284b51ea5cb9d2b311fea049564ffce754f73dd6c296ec101bd7"}},{"ruleId":"D1","level":"warning","message":{"text":"UserProfile.UserProfile (cyclomatic 40): UserProfile.UserProfile has cyclomatic complexity 40 (threshold 15). Of this number, 31 points are the body\u0027s own statements and 9 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/UserProfile.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0fc60d06876c6e3d47726d914135475049b16157165e6f92f610c95d811f7c2"}},{"ruleId":"D1","level":"warning","message":{"text":"fields.isWorkflowFieldValueValid (cyclomatic 40): fields.isWorkflowFieldValueValid has cyclomatic complexity 40 (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":"invokeai/frontend/webv2/src/features/workflow/core/fields.ts"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"eaae3657a3be776688ca4eafb3a97cc30a248b81fa8c0cb643ae040b62cf0f7f"}},{"ruleId":"D1","level":"warning","message":{"text":"LayerMutationController.commitDuplicate (cyclomatic 40): LayerMutationController.commitDuplicate has cyclomatic complexity 40 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 23 belong to 11 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"937373884704b464fa0ef0bf265d59b8b002f730e03482e98be2dcd150d3c500"}},{"ruleId":"D1","level":"warning","message":{"text":"bitmapStore.createBitmapStore.flushLayer (cyclomatic 40): bitmapStore.createBitmapStore.flushLayer has cyclomatic complexity 40 (threshold 15). Of this number, 38 points are the body\u0027s own statements and 2 belong to 2 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"d461f9b96361db4fd50c2827b1ea7c5e4c1a56bdeebae3badae8542100b0805c"}},{"ruleId":"D1","level":"warning","message":{"text":"select_hf_files._filter_by_variant (cyclomatic 39): select_hf_files._filter_by_variant has cyclomatic complexity 39 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/util/select_hf_files.py"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"20182e240b8de0e55987fd2e3f2fbde0d71a4b99b8a4cca694c7c96ec46d4250"}},{"ruleId":"D1","level":"warning","message":{"text":"UserManagement.UserFormModal (cyclomatic 39): UserManagement.UserFormModal has cyclomatic complexity 39 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 17 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/UserManagement.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"b71c264b490621798af7aeb3507515b5d36d2bad24d75f2dcbb6c909541b6745"}},{"ruleId":"D1","level":"warning","message":{"text":"runtime.createQueueRuntime.submitQueueItem (cyclomatic 39): runtime.createQueueRuntime.submitQueueItem has cyclomatic complexity 39 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 21 belong to 4 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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":1745}}}],"partialFingerprints":{"codehealthFindingId/v1":"685e66dc128e00f2ec076119a00ea3b5e15cec2151203b3ff5a79fa599d39776"}},{"ruleId":"D1","level":"warning","message":{"text":"usePreviewNavigation.usePreviewNavigation (cyclomatic 39): usePreviewNavigation.usePreviewNavigation has cyclomatic complexity 39 (threshold 15). Of this number, 35 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewNavigation.ts"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd2f22f8de10ac5d0f575f9a72e0dd655e30f29aa9b706ee2779f8088ae62ac1"}},{"ruleId":"D1","level":"warning","message":{"text":"GalleryMaintenanceService._remove_missing_page (cyclomatic 38): GalleryMaintenanceService._remove_missing_page has cyclomatic complexity 38 (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":"invokeai/app/services/gallery_maintenance/gallery_maintenance_default.py"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee0584133fd9a230cead29309f1428cb9cb374125ef6c5c121a4888c9499142a"}},{"ruleId":"D1","level":"warning","message":{"text":"graph_iterate_planner._get_direct_iterate_collect_nodes (cyclomatic 38): graph_iterate_planner._get_direct_iterate_collect_nodes has cyclomatic complexity 38 (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":"invokeai/app/services/shared/graph_iterate_planner.py"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbd0dc20a8c8aff69d09ba1d334aab2f5a234fe0ae35faee866ef40b65d3264e"}},{"ruleId":"D1","level":"warning","message":{"text":"ResizeHandle.ResizeHandle (cyclomatic 38): ResizeHandle.ResizeHandle has cyclomatic complexity 38 (threshold 15). Most of this is not in the body itself: 4 of the 38 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 299, 224, 277, \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":"invokeai/frontend/webv2/src/platform/ui/ResizeHandle.tsx"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"32460091bae9e7f0d0c1f405ceb83f0901e7a6a35493e9ff0eaa32bf8e33b3a3"}},{"ruleId":"D1","level":"warning","message":{"text":"BooleanMergeController.merge (cyclomatic 38): BooleanMergeController.merge has cyclomatic complexity 38 (threshold 15). Of this number, 37 points are the body\u0027s own statements and 1 belongs 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/booleanMergeController.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"120a80a27031fa50fc10f14087da54c72671ffecec85b19d1af249aa4ac98d1e"}},{"ruleId":"D1","level":"warning","message":{"text":"Flux2DenoiseInvocation._run_diffusion (cyclomatic 37): Flux2DenoiseInvocation._run_diffusion has cyclomatic complexity 37 (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":"invokeai/app/invocations/flux2/flux2_denoise.py"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"d912b2580a1db112eaafc8f51f5f4d9bda3d01df324a3e53a5ecdf225878d052"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphExecutionState._rehydrate_generic_runtime_state (cyclomatic 37): GraphExecutionState._rehydrate_generic_runtime_state has cyclomatic complexity 37 (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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":3771}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f0294581e2e8a170eaf5e9e2bac70b2d554448a8b105d0be3cf5f0efb9805c1"}},{"ruleId":"D1","level":"warning","message":{"text":"aac_splice._read_audio_track (cyclomatic 37): aac_splice._read_audio_track has cyclomatic complexity 37 (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":"invokeai/app/util/aac_splice.py"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bf887f3346a4df907e17692cc995e85124ef2f42394b55151c97c0608eb2ba7"}},{"ruleId":"D1","level":"warning","message":{"text":"UseDefaultSettingsButton.UseDefaultSettingsButton (cyclomatic 37): UseDefaultSettingsButton.UseDefaultSettingsButton has cyclomatic complexity 37 (threshold 15). Most of this is not in the body itself: 3 of the 37 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 62, 51, 56, \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":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a84c4665d758ee46faa02230ef21cda3354aded3556ce7148c9b39a364ed5c8"}},{"ruleId":"D1","level":"warning","message":{"text":"runtime.createQueueItemBackendSubmission (cyclomatic 37): runtime.createQueueItemBackendSubmission has cyclomatic complexity 37 (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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9dbb0fa42e4e304e1880e1a928bd39f8fca5a1b52443ed559abdb8202e182d4"}},{"ruleId":"D1","level":"warning","message":{"text":"VideoReferenceListField.ReferenceCard (cyclomatic 37): VideoReferenceListField.ReferenceCard has cyclomatic complexity 37 (threshold 15). Most of this is not in the body itself: 15 of the 37 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 216, 132, 141, \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":"invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"06c2589adb5f26087a1434a08628ecd04167c92583f56f3d045de40262f4f2c7"}},{"ruleId":"D1","level":"warning","message":{"text":"validation.isValidLoopLinkageConnection (cyclomatic 37): validation.isValidLoopLinkageConnection has cyclomatic complexity 37 (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":"invokeai/frontend/webv2/src/features/workflow/core/validation.ts"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ca992438aacf7edff21175b4ccd51e06d39a227bb92a2a5ab0954c0119fcced"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowLibraryDialog.WorkflowLibraryDialog (cyclomatic 37): WorkflowLibraryDialog.WorkflowLibraryDialog has cyclomatic complexity 37 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 20 belong to 10 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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDialog.tsx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd5eecca261aabd6fe9da5fb5823627499678d28cd15d1370fe498863b7a7291"}},{"ruleId":"D1","level":"warning","message":{"text":"FilterResultController.commit (cyclomatic 37): FilterResultController.commit has cyclomatic complexity 37 (threshold 15). Of this number, 34 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/filterResultController.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"90bb8ddfc349112446ceb23f98d729ec3a94524dc389d96d43954236056d1ff7"}},{"ruleId":"D1","level":"warning","message":{"text":"layerRasterizer.createLayerRasterizer.getOrStartLayerRasterization (cyclomatic 37): layerRasterizer.createLayerRasterizer.getOrStartLayerRasterization has cyclomatic complexity 37 (threshold 15). Most of this is not in the body itself: 13 of the 37 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 151, 120). 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/layerRasterizer.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"82c6e1f1fea3d0245a9fd08220ea79078e43c15369ebdf43bd6069139789c2cb"}},{"ruleId":"D1","level":"warning","message":{"text":"ChildExecutionCapability.create_dependency (cyclomatic 36): ChildExecutionCapability.create_dependency 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":"invokeai/app/services/shared/execution_engine/child.py"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"58c6c1d9d03b87b8e67131242b812535dbebae9359df3a138583e910d28f6f2f"}},{"ruleId":"D1","level":"warning","message":{"text":"graph_if_runtime._get_if_iteration_paths_with_ancestry (cyclomatic 36): graph_if_runtime._get_if_iteration_paths_with_ancestry 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":"invokeai/app/services/shared/graph_if_runtime.py"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eb05a9461e7f8f5d18881e38a3cef658445b12136fa8ed56b79ce51e8d41552"}},{"ruleId":"D1","level":"warning","message":{"text":"denoise.denoise (cyclomatic 36): denoise.denoise 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":"invokeai/backend/flux2/denoise.py"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ed370e106ab9e12fb77b76621bae1deb860cdd52e095a2c91d503aef5026ac5"}},{"ruleId":"D1","level":"warning","message":{"text":"ProtectedRoute.ProtectedRoute (cyclomatic 36): ProtectedRoute.ProtectedRoute has cyclomatic complexity 36 (threshold 15). Most of this is not in the body itself: 11 of the 36 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 114, 100, 42, \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":"invokeai/frontend/webv1/src/features/auth/components/ProtectedRoute.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2ba828c4f28324e76e8782136be70d1647f25811f2ca60d3ae03350b1dcef47"}},{"ruleId":"D1","level":"warning","message":{"text":"MergeLayerController.mergeSelected (cyclomatic 36): MergeLayerController.mergeSelected has cyclomatic complexity 36 (threshold 15). Of this number, 32 points are the body\u0027s own statements and 4 belong to 4 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca09b019810fd647becb3ff59b11ce156343dea55d4a5319fd7d3aef00755b93"}},{"ruleId":"D1","level":"warning","message":{"text":"RasterExportController.rasterize (cyclomatic 36): RasterExportController.rasterize has cyclomatic complexity 36 (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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/rasterExportController.ts"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3e9008cd3c12bd2aa19d81189ee0b2e745c499639d7aad0e053d1439a0d6423"}},{"ruleId":"D1","level":"warning","message":{"text":"Krea2DenoiseInvocation._run_diffusion (cyclomatic 35): Krea2DenoiseInvocation._run_diffusion has cyclomatic complexity 35 (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":"invokeai/app/invocations/krea2/krea2_denoise.py"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8a67cc8288883a0db630ab5ec6643ce8e9b442d5663be498a94f7ddd1b19fce"}},{"ruleId":"D1","level":"warning","message":{"text":"CanvasEntityBufferObjectRenderer.renderBufferObject (cyclomatic 35): CanvasEntityBufferObjectRenderer.renderBufferObject 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityBufferObjectRenderer.ts"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"d23b2093d1aec2cc1a59fa3ee7718c1a171b4bddddfa6aecf0cc120722331681"}},{"ruleId":"D1","level":"warning","message":{"text":"modelSettingsIO.validateImportData (cyclomatic 35): modelSettingsIO.validateImportData 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/modelSettingsIO.ts"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"038378ec152c4b5667339ce9422db99d92d91a6c376dacc12ad0dac699a44572"}},{"ruleId":"D1","level":"warning","message":{"text":"buildNodesGraph.buildNodesGraph (cyclomatic 35): buildNodesGraph.buildNodesGraph has cyclomatic complexity 35 (threshold 15). Most of this is not in the body itself: 1 of the 35 points is its own statement and the rest belongs to 8 function literals inside it that branch (lines 130, 68, 211, \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildNodesGraph.ts"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3e3510e1c729ccd97960a5ac184472d8d694fcf61ed37365002b9fc60a346bd"}},{"ruleId":"D1","level":"warning","message":{"text":"measure-architecture-performance.runSample (cyclomatic 35): measure-architecture-performance.runSample has cyclomatic complexity 35 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 12 belong to 10 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":"invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"01103c6a6e5ccafefac1a1afd50ab085d2c89ef167c28fb296f1a531ba9e4661"}},{"ruleId":"D1","level":"warning","message":{"text":"GallerySettingField.GallerySettingField (cyclomatic 35): GallerySettingField.GallerySettingField has cyclomatic complexity 35 (threshold 15). Most of this is not in the body itself: 9 of the 35 points are its own statements and the rest belongs to one function literal inside it that branches (line 15). 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":"invokeai/frontend/webv2/src/features/gallery/ui/GallerySettingField.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"28248278a5a1805f9efbb7c40581895760e9d992e306fde84bb42f7e1bc07f03"}},{"ruleId":"D1","level":"warning","message":{"text":"GalleryBoardMenu.GalleryBoardMenu (cyclomatic 35): GalleryBoardMenu.GalleryBoardMenu has cyclomatic complexity 35 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 13 belong to 10 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"46b5da0a8372be56364a469bff8ecc4545161e9ce7842a5a0f5c0d6b64794ec2"}},{"ruleId":"D1","level":"warning","message":{"text":"InvocationFlowNode.InputFieldRow (cyclomatic 35): InvocationFlowNode.InputFieldRow has cyclomatic complexity 35 (threshold 15). Of this number, 33 points are the body\u0027s own statements and 2 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.tsx"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"01804ca374b767114d29f07ead5f2c5fb6a69f2139ab52487d8f0d1da8909119"}},{"ruleId":"D1","level":"warning","message":{"text":"indexedDbDraftStore.createIndexedDbProjectDraftStore.retargetAcknowledgedCopy (cyclomatic 35): indexedDbDraftStore.createIndexedDbProjectDraftStore.retargetAcknowledgedCopy has cyclomatic complexity 35 (threshold 15). Most of this is not in the body itself: 14 of the 35 points are its own statements and the rest belongs to one function literal inside it that branches (line 1025). 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":991}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a00ef6698cf555837f0d1eece10cea2cdb35a6f99ec2d656af3d99462d6d268"}},{"ruleId":"D1","level":"warning","message":{"text":"createCanvasEngine.createCanvasEngine (cyclomatic 35): createCanvasEngine.createCanvasEngine has cyclomatic complexity 35 (threshold 15). Most of this is not in the body itself: 1 of the 35 points is its own statement and the rest belongs to 13 function items inside it that branch (a function literal at line 129, resolveUploadProjectId, uploadImage, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/createCanvasEngine.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"9692df2f214eefed254944b5e739b45a7b834f314003b38d2f1a2d5d2cbbe151"}},{"ruleId":"D1","level":"warning","message":{"text":"WanVideoDenoiseInvocation._run_diffusion (cyclomatic 34): WanVideoDenoiseInvocation._run_diffusion 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":"invokeai/app/invocations/wan/wan_video_denoise.py"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"896def4b5fbf4106346b8cfcc8152e9be021b80d83d7ee174b8b660a10f0e289"}},{"ruleId":"D1","level":"warning","message":{"text":"PixDiT_T2I.forward (cyclomatic 34): PixDiT_T2I.forward 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":"invokeai/backend/pid/_src/networks/pixeldit_official.py"},"region":{"startLine":1413}}}],"partialFingerprints":{"codehealthFindingId/v1":"27e9b2920b629e3ed2bc96cb586caade678a174aa8535efb4b6d8a0303a4668d"}},{"ruleId":"D1","level":"warning","message":{"text":"StagingAreaApi.onItemsChangedEvent (cyclomatic 34): StagingAreaApi.onItemsChangedEvent has cyclomatic complexity 34 (threshold 15). Of this number, 32 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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/state.ts"},"region":{"startLine":460}}}],"partialFingerprints":{"codehealthFindingId/v1":"742fe5d9adee2109aa2a799e025df958b2969ef312e24e16d695a86d8ddeccff"}},{"ruleId":"D1","level":"warning","message":{"text":"baseGenerationPolicies.getSettingsWithCompatibleModelSelections (cyclomatic 34): baseGenerationPolicies.getSettingsWithCompatibleModelSelections has cyclomatic complexity 34 (threshold 15). Of this number, 32 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":"invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts"},"region":{"startLine":1461}}}],"partialFingerprints":{"codehealthFindingId/v1":"7edbb682816b9d838db44aa50b2c9216263e3ab218a265f04a9966fde76b2e33"}},{"ruleId":"D1","level":"warning","message":{"text":"CallSavedWorkflowSyncRuntime.CallSavedWorkflowSyncRuntime::reconcile (cyclomatic 34): CallSavedWorkflowSyncRuntime.CallSavedWorkflowSyncRuntime::reconcile 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/CallSavedWorkflowSyncRuntime.tsx"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ac3a8b1a0ba11f2a86a2526a0d51087b810dee9ba0de4e086ebf0fc7bd55525"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowLibraryThumbnail.WorkflowLibraryThumbnail (cyclomatic 34): WorkflowLibraryThumbnail.WorkflowLibraryThumbnail has cyclomatic complexity 34 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 12 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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryThumbnail.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d2695e44995a1a4105ec8a49728783e7ecffb286c2a320cfdfc5e3ef7bc227c"}},{"ruleId":"D1","level":"warning","message":{"text":"HsvWheelPicker.HsvWheelPicker (cyclomatic 34): HsvWheelPicker.HsvWheelPicker has cyclomatic complexity 34 (threshold 15). Most of this is not in the body itself: 7 of the 34 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 62, 171, 189, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/HsvWheelPicker.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7566530df9948bc41484d7061356bf03e557116a1cd5c70c42073291e3284f0"}},{"ruleId":"D1","level":"warning","message":{"text":"layerPanelRows.navigateTree (cyclomatic 34): layerPanelRows.navigateTree 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerPanelRows.ts"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fe90b3cc5a38880e4191a39aff73b7b162ebb8b945d929037c1e7cc817213d0"}},{"ruleId":"D1","level":"warning","message":{"text":"OverviewPane.ConnectedOverview (cyclomatic 34): OverviewPane.ConnectedOverview has cyclomatic complexity 34 (threshold 15). Most of this is not in the body itself: 1 of the 34 points is its own statement and the rest belongs to 15 function literals inside it that branch (lines 266, 153, 83, \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/OverviewPane.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"35b1fc80bfa093bb7b7795635f00b52543b7e8d16b813da62f4f9c3e03784d33"}},{"ruleId":"D1","level":"warning","message":{"text":"MergeLayerController.mergeVisible (cyclomatic 34): MergeLayerController.mergeVisible has cyclomatic complexity 34 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 7 belong to 2 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"42ba6f925fc1489fec30f33ac7d1b6cf2430bbf753fbafcd73a71f5f4806e094"}},{"ruleId":"D1","level":"warning","message":{"text":"projectFile.importProjectFile (cyclomatic 34): projectFile.importProjectFile has cyclomatic complexity 34 (threshold 15). Of this number, 33 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":"invokeai/frontend/webv2/src/workbench/projects/projectFile.ts"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4f55615747994829f40ecd5644f6f3a71e9454513a5c5e9af1f4d235f618515"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkbenchShell.WorkbenchShell (cyclomatic 34): WorkbenchShell.WorkbenchShell has cyclomatic complexity 34 (threshold 15). Most of this is not in the body itself: 10 of the 34 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 220, 146, 172, \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":"invokeai/frontend/webv2/src/workbench/shell/WorkbenchShell.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"73a63acc6c13a1bf5b4ac85d5a712768a0edd006bb5472a66e4ddf91554b503f"}},{"ruleId":"D1","level":"warning","message":{"text":"WanModelLoaderInvocation.invoke (cyclomatic 33): WanModelLoaderInvocation.invoke 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":"invokeai/app/invocations/wan/wan_model_loader.py"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcd8c0b5cd5a0236a23b8fca30151abc9a36fbb8afb58db7289657f9859c92bb"}},{"ruleId":"D1","level":"warning","message":{"text":"OpenAIProvider.generate (cyclomatic 33): OpenAIProvider.generate 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":"invokeai/app/services/external_generation/providers/openai.py"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"910f7ac7eb75c55164e7aad18f45d5f279aeea67c3a0f78499f411d46d344902"}},{"ruleId":"D1","level":"warning","message":{"text":"SeedreamProvider.generate (cyclomatic 33): SeedreamProvider.generate 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":"invokeai/app/services/external_generation/providers/seedream.py"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"53e2e09e15527e88f61bd68b071e37ab8df33c68ea8d54a594765c2e127ea56a"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelInstallService._enqueue_remote_download (cyclomatic 33): ModelInstallService._enqueue_remote_download 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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":2185}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3e52cd627f8954bef6a7dbac19bba2826cf6906eb70848d2bc91b4258efd8a8"}},{"ruleId":"D1","level":"warning","message":{"text":"denoise.denoise (cyclomatic 33): denoise.denoise 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":"invokeai/backend/flux/denoise.py"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e81a0388c9005fad236b78851db38fffe3e2e07563c6bcf5b25c9078bf584ca"}},{"ruleId":"D1","level":"warning","message":{"text":"hidiffusion_utils.hidiffusion_patch (cyclomatic 33): hidiffusion_utils.hidiffusion_patch 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":"invokeai/backend/stable_diffusion/hidiffusion_utils.py"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1acb4cb55d351c96685e7fb93e5f78a99a7b0a514dc96f07f151045ba129e30"}},{"ruleId":"D1","level":"warning","message":{"text":"ControlNetModel.__init__ (cyclomatic 33): ControlNetModel.__init__ has cyclomatic complexity 33 (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":"invokeai/backend/util/hotfixes.py"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"3249572c01911a3a3d2a4d733f52ca325811fd5c7702e24b067c00a63a205c94"}},{"ruleId":"D1","level":"warning","message":{"text":"ToolWidthPicker.ToolWidthPicker (cyclomatic 33): ToolWidthPicker.ToolWidthPicker has cyclomatic complexity 33 (threshold 15). Most of this is not in the body itself: 3 of the 33 points are its own statements and the rest belongs to 16 function literals inside it that branch (lines 388, 314, 233, \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolWidthPicker.tsx"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe133361f2698e6ee3208105baa225941488e85eb36f7d407a791668b639015d"}},{"ruleId":"D1","level":"warning","message":{"text":"galleryBoardGroups.getGalleryBoardGroups (cyclomatic 33): galleryBoardGroups.getGalleryBoardGroups has cyclomatic complexity 33 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 15 belong to 9 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":"invokeai/frontend/webv2/src/features/gallery/ui/galleryBoardGroups.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ae0fea4612fb563b20e6db5688d0c8df351b4da3c3a444d7e36ae1bdcbb476f"}},{"ruleId":"D1","level":"warning","message":{"text":"settings.normalizeUpscaleWidgetValues (cyclomatic 33): settings.normalizeUpscaleWidgetValues has cyclomatic complexity 33 (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":"invokeai/frontend/webv2/src/features/upscale/core/settings.ts"},"region":{"startLine":785}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca0cbf86fefc69297ab1321920d883f5317c0bda470f100ecbab2ca2b8bf96ed"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowWidgetChrome.WorkflowDialogHost (cyclomatic 33): WorkflowWidgetChrome.WorkflowDialogHost has cyclomatic complexity 33 (threshold 15). Most of this is not in the body itself: 6 of the 33 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 382, 367, 480, \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":"invokeai/frontend/webv2/src/features/workflow/ui/WorkflowWidgetChrome.tsx"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae54f7f4a7499b86a12a493d05268f86484be36d1064eeac8d21e45be1b00258"}},{"ruleId":"D1","level":"warning","message":{"text":"outputImages.visitOutputImageNames (cyclomatic 33): outputImages.visitOutputImageNames has cyclomatic complexity 33 (threshold 15). Most of this is not in the body itself: 15 of the 33 points are its own statements and the rest belongs to 4 function items inside it that branch (visitWorkflowReturnValue, visitImageField, visitImageCollection, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/core/outputImages.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b0ffdf07d6fce4cf72c4ca7aeb7eab7bfcaffb7f464cabffdfc42e2522f9afa"}},{"ruleId":"D1","level":"warning","message":{"text":"canvasProjectMutations.patchLayerConfig (cyclomatic 33): canvasProjectMutations.patchLayerConfig 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":"invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts"},"region":{"startLine":536}}}],"partialFingerprints":{"codehealthFindingId/v1":"185355b4d948d978fa050f34711c026d195723d5e5b53393a71d7de0f8a412c5"}},{"ruleId":"D1","level":"warning","message":{"text":"RunLayerWorkflowDialog.RunLayerWorkflowDialog (cyclomatic 33): RunLayerWorkflowDialog.RunLayerWorkflowDialog has cyclomatic complexity 33 (threshold 15). Most of this is not in the body itself: 13 of the 33 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 349, 315, 250, \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/RunLayerWorkflowDialog.tsx"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"892ffe2023e4c9298101b68d40a2ddf5a130b6efd7df05f410e74f973fa6f3e6"}},{"ruleId":"D1","level":"warning","message":{"text":"maskOutline.traceMaskOutlinePath (cyclomatic 33): maskOutline.traceMaskOutlinePath has cyclomatic complexity 33 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 10 belong to 3 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/selection/maskOutline.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cc40dd21d53fa0b8bc8f9296b8c591bddbff5cc5e1be41c18622516c5266537"}},{"ruleId":"D1","level":"warning","message":{"text":"selectObjectSession.createSelectObjectSession.runRequest (cyclomatic 33): selectObjectSession.createSelectObjectSession.runRequest has cyclomatic complexity 33 (threshold 15). Most of this is not in the body itself: 13 of the 33 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 286, 348). 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/selectObjectSession.ts"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"be0ba354f496ed4db92b83f2cf924a5fc0e8037f6e57b751c0a6b556fe2fdea3"}},{"ruleId":"D1","level":"warning","message":{"text":"revealGalleryItem.revealGalleryItem (cyclomatic 33): revealGalleryItem.revealGalleryItem has cyclomatic complexity 33 (threshold 15). Most of this is not in the body itself: 2 of the 33 points are its own statements and the rest belongs to 2 function items inside it that branch (a function literal at line 69, isCurrent). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/revealGalleryItem.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"047a541a8acf73efef1bdf4fc6e593b9d0e4a00b9cb2611af4283b5c9424d491"}},{"ruleId":"D1","level":"warning","message":{"text":"TextOptions.TextFontSettings (cyclomatic 33): TextOptions.TextFontSettings has cyclomatic complexity 33 (threshold 15). Most of this is not in the body itself: 7 of the 33 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 637, 680, 705, \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/TextOptions.tsx"},"region":{"startLine":566}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2794e34c63ffad62dc2bb35a009942c6c2384e35524cdc8f032a4ca683972e6"}},{"ruleId":"D1","level":"warning","message":{"text":"InvokeAdjustImageHuePlusInvocation.invoke (cyclomatic 32): InvokeAdjustImageHuePlusInvocation.invoke 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":"invokeai/app/invocations/composition-nodes.py"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fd9754ff5e3bbce3589b3e732a4f5bf9999a324a80cecdee2c2ecac6f98fb87"}},{"ruleId":"D1","level":"warning","message":{"text":"Qwen3EncoderCheckpointLoader._load_from_singlefile (cyclomatic 32): Qwen3EncoderCheckpointLoader._load_from_singlefile 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":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":1189}}}],"partialFingerprints":{"codehealthFindingId/v1":"90440069310c12ec167bb9a5e10bb5e40da0c58617cc78eaf495ace2263cd353"}},{"ruleId":"D1","level":"warning","message":{"text":"validators.getRegionalGuidanceWarnings (cyclomatic 32): validators.getRegionalGuidanceWarnings has cyclomatic complexity 32 (threshold 15). Of this number, 29 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":"invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"68056c360c9d4473838b5849b26ce04ec62c453f9d6b6d84ee23de9cecd77233"}},{"ruleId":"D1","level":"warning","message":{"text":"AddNodeCmdk.NodeCommandList (cyclomatic 32): AddNodeCmdk.NodeCommandList has cyclomatic complexity 32 (threshold 15). Most of this is not in the body itself: 3 of the 32 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 426, 514, 486, \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"626bc376448076636572586ed7d8a7d2054bc827ea4deb56a21654cec6df621f"}},{"ruleId":"D1","level":"warning","message":{"text":"Picker.Picker (cyclomatic 32): Picker.Picker has cyclomatic complexity 32 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 16 belong to 6 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":"invokeai/frontend/webv2/src/platform/ui/Picker.tsx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea94ea0b107f2056c4b907b178c341b5ee04a23f81c9736b4d7c4808c3445244"}},{"ruleId":"D1","level":"warning","message":{"text":"indexedDbDraftStore.createIndexedDbProjectDraftStore.reconcileUnloadJournal (cyclomatic 32): indexedDbDraftStore.createIndexedDbProjectDraftStore.reconcileUnloadJournal has cyclomatic complexity 32 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 16 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":784}}}],"partialFingerprints":{"codehealthFindingId/v1":"de14b091ce678b0e8bf40304ec5819957078bbe5677abd6319d0246f63ed61d8"}},{"ruleId":"D1","level":"warning","message":{"text":"indexedDbDraftStore.createIndexedDbProjectDraftStore.stage (cyclomatic 32): indexedDbDraftStore.createIndexedDbProjectDraftStore.stage 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":1275}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3b32ada56703f59cc03fdfa3a1ee4e5563f425a3a32f046171616d6911491e9"}},{"ruleId":"D1","level":"warning","message":{"text":"LayerChildRow.LayerChildRowComponent (cyclomatic 32): LayerChildRow.LayerChildRowComponent has cyclomatic complexity 32 (threshold 15). Most of this is not in the body itself: 13 of the 32 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 160, 136, 181, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerChildRow.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"7813451250b37cde704b058076d201c1795c2b77c15c73694c2e8417fc334c46"}},{"ruleId":"D1","level":"warning","message":{"text":"LayerGroupContextMenu.LayerGroupContextMenu (cyclomatic 32): LayerGroupContextMenu.LayerGroupContextMenu has cyclomatic complexity 32 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 10 belong to 5 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerGroupContextMenu.tsx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ac88fcc5aa6591a6b267f4aca9fb906d41edf7e33d00cdcca0f8648c3c79e4d"}},{"ruleId":"D1","level":"warning","message":{"text":"store.normalizeWorkbenchPreferences (cyclomatic 32): store.normalizeWorkbenchPreferences has cyclomatic complexity 32 (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":"invokeai/frontend/webv2/src/workbench/settings/store.ts"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7ab9464c847e6739f3bcfa8579533224c7fb892e01a5a21992d66385d5fe854"}},{"ruleId":"D1","level":"warning","message":{"text":"GeneratedResultController.commit (cyclomatic 32): GeneratedResultController.commit has cyclomatic complexity 32 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 8 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/generatedResultController.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dd09a4fc6192b9147955547259a2917cf7e51f5f8612c517009a1097cb28ac0"}},{"ruleId":"D1","level":"warning","message":{"text":"FluxDenoiseInvocation._run_diffusion (cyclomatic 31): FluxDenoiseInvocation._run_diffusion has cyclomatic complexity 31 (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":"invokeai/app/invocations/flux/flux_denoise.py"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ba27ec5dd0e4fa53512dd03e138b9e81051f45f67e727335387fe7a62504067"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelInstallService._restore_incomplete_installs (cyclomatic 31): ModelInstallService._restore_incomplete_installs 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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":489}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c40c0481d7f811ffb548fb0e8f66784e88a38e6e6d2b38eb890deb38d5b5e0e"}},{"ruleId":"D1","level":"warning","message":{"text":"h264_splice._read_video_stbl (cyclomatic 31): h264_splice._read_video_stbl has cyclomatic complexity 31 (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":"invokeai/app/util/h264_splice.py"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"b09e85e33ab51608a56d56862395b54c3c84a12bae992cc22ada78879c5fdf09"}},{"ruleId":"D1","level":"warning","message":{"text":"AdministratorSetup.AdministratorSetup (cyclomatic 31): AdministratorSetup.AdministratorSetup has cyclomatic complexity 31 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 7 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"72af99e995dc62bbf4b173d47807d7e64ccee0823cc0226cc5afbb4c40da6c19"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelInstallQueue.ModelInstallQueue (cyclomatic 31): ModelInstallQueue.ModelInstallQueue has cyclomatic complexity 31 (threshold 15). Most of this is not in the body itself: 11 of the 31 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 90, 127, 137, \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueue.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"afe68e4e198579611599e1f40a96ed6333eba9c444f234c26a4115bf565b806b"}},{"ruleId":"D1","level":"warning","message":{"text":"validateConnectionTypes.validateConnectionTypes (cyclomatic 31): validateConnectionTypes.validateConnectionTypes has cyclomatic complexity 31 (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":"invokeai/frontend/webv1/src/features/nodes/store/util/validateConnectionTypes.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb5188a031f2efda260d00213db085f0a51838570b28107b076867275bac0f41"}},{"ruleId":"D1","level":"warning","message":{"text":"validation.validateConnection (cyclomatic 31): validation.validateConnection has cyclomatic complexity 31 (threshold 15). Of this number, 28 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":"invokeai/frontend/webv2/src/features/workflow/core/validation.ts"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb586bf3f5a18a0436c16447201699a1c97a405a7bf32d15083b15acdd2a58e2"}},{"ruleId":"D1","level":"warning","message":{"text":"durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject (cyclomatic 31): durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject 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. This shape REPEATS in the file: 4 other methods here (durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::stageProject, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject::pushHalves, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject::reconcile, \u2026) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 5 times rather than 5 independent problems. Splitting this body alone leaves the other 4 exactly as they are. Where these are variations on one operation, the change that clears all 5 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":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":1330}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2152b1d5d1cda2dfcc84be15bfcfa2d9960929581dd1db048393a3c7699faf4"}},{"ruleId":"D1","level":"warning","message":{"text":"ToolStripFlyout.ToolFamilyButton (cyclomatic 31): ToolStripFlyout.ToolFamilyButton has cyclomatic complexity 31 (threshold 15). Most of this is not in the body itself: 4 of the 31 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 116, 149, 94, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/ToolStripFlyout.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5c2d9f5ddaa095bffef96de42ab32890e417a4873f0dfc35cee69e23fef0ad0"}},{"ruleId":"D1","level":"warning","message":{"text":"layerTreeDrop.projectLayerDrop (cyclomatic 31): layerTreeDrop.projectLayerDrop 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerTreeDrop.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"15e21f72c5c6a40e614c3fc4dd1992841f0d00cdbb1f77bad8f8a02637aa6b53"}},{"ruleId":"D1","level":"warning","message":{"text":"CropLayerController.crop (cyclomatic 31): CropLayerController.crop has cyclomatic complexity 31 (threshold 15). Of this number, 30 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/cropLayerController.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"31e2f529eab0fbfdf0080e9701736abce347e077caec85e1616346ef50240ecf"}},{"ruleId":"D1","level":"warning","message":{"text":"promptAttention.groupTerminals (cyclomatic 30): promptAttention.groupTerminals has cyclomatic complexity 30 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 3 belong to one function item 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":"invokeai/frontend/webv1/src/common/util/promptAttention.ts"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3a85658c02e05c5852071aa3dab3e45f739801bae959bd0fc432a5d6b21df47"}},{"ruleId":"D1","level":"warning","message":{"text":"CanvasToolModule.onKeyDown (cyclomatic 30): CanvasToolModule.onKeyDown 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts"},"region":{"startLine":796}}}],"partialFingerprints":{"codehealthFindingId/v1":"c15034efadfd3a44618ac277401aafe5cb3f78397498a3f012db31b4d7e4b755"}},{"ruleId":"D1","level":"warning","message":{"text":"run-project-file-journey.executeProjectFileJourney (cyclomatic 30): run-project-file-journey.executeProjectFileJourney has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 5 of the 30 points are its own statements and the rest belongs to 9 function items inside it that branch (stopPreview, a function literal at line 1039, a function literal at line 1107, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/run-project-file-journey.mjs"},"region":{"startLine":902}}}],"partialFingerprints":{"codehealthFindingId/v1":"531b4d7d6bec61316669d88a2e3958ba0531bee560a32556f1fa5c820bccd693"}},{"ruleId":"D1","level":"warning","message":{"text":"dependencyPolicy.checkDependency (cyclomatic 30): dependencyPolicy.checkDependency has cyclomatic complexity 30 (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":"invokeai/frontend/webv2/src/architecture/dependencyPolicy.ts"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe1406c05f771c5e9172040870b0d0571170b4b87c27f1c79d164ed0d7e2fec8"}},{"ruleId":"D1","level":"warning","message":{"text":"useGalleryGridHotkeys.useGalleryGridHotkeys (cyclomatic 30): useGalleryGridHotkeys.useGalleryGridHotkeys has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 1 of the 30 points is its own statement and the rest belongs to 6 function items inside it that branch (a function literal at line 205, a function literal at line 137, getRangeAnchorKey, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryGridHotkeys.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa108bb0d3cd384b068c6fb581b603f1dd235981c2c5c850868fe016308963e6"}},{"ruleId":"D1","level":"warning","message":{"text":"holdLease.startIntermediatesHoldLease (cyclomatic 30): holdLease.startIntermediatesHoldLease has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 1 of the 30 points is its own statement and the rest belongs to 10 function items inside it that branch (sendOnce, bodyFor, send, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/intermediates/holdLease.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b46216c1f1a16b3114b20452c2dd13194cfd28ce030b4e748afc9b2d278b4f8"}},{"ruleId":"D1","level":"warning","message":{"text":"graph.buildMiniMaxH3VideoGraph (cyclomatic 30): graph.buildMiniMaxH3VideoGraph 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, 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":"invokeai/frontend/webv2/src/features/video/core/graph.ts"},"region":{"startLine":438}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6d8338ac053bfce32f9694fd4b968c634ff0229a79ed1550dc21bd8e763c6ed"}},{"ruleId":"D1","level":"warning","message":{"text":"validation.validateConnectionTypes (cyclomatic 30): validation.validateConnectionTypes has cyclomatic complexity 30 (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":"invokeai/frontend/webv2/src/features/workflow/core/validation.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbe2e2c2bf56793d0003fe2b21d844ae399ab2962f0746311f3b3f513d7dc18a"}},{"ruleId":"D1","level":"warning","message":{"text":"callSavedWorkflow.syncCallSavedWorkflowFields (cyclomatic 30): callSavedWorkflow.syncCallSavedWorkflowFields has cyclomatic complexity 30 (threshold 15). Of this number, 27 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":"invokeai/frontend/webv2/src/features/workflow/core/callSavedWorkflow.ts"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"15afcdb29fbc4d1b13122ba9e145f179b3626c7e77d118fb3833ec4a36a8ebb5"}},{"ruleId":"D1","level":"warning","message":{"text":"buildGraph.getProjectGraphReadiness (cyclomatic 30): buildGraph.getProjectGraphReadiness 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":"invokeai/frontend/webv2/src/features/workflow/core/buildGraph.ts"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"432a3dde5b0a413e7ddd8ebbbbe37cefdf4f9bc582a73a85741048df047437f7"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectWorkflowsView.ProjectWorkflowDetailPanel (cyclomatic 30): ProjectWorkflowsView.ProjectWorkflowDetailPanel has cyclomatic complexity 30 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 13 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":"invokeai/frontend/webv2/src/features/workflow/ui/library/ProjectWorkflowsView.tsx"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c6413d8c23261b6d06b2f2b379336c25053333e62a517cc11255917ae666338"}},{"ruleId":"D1","level":"warning","message":{"text":"draftStore.isProjectDraftWriterClaim (cyclomatic 30): draftStore.isProjectDraftWriterClaim has cyclomatic complexity 30 (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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"c05f79f8101ca798ac15cc0b5a7f70f50c696c92d3fb7603782c2b3d4ca2e345"}},{"ruleId":"D1","level":"warning","message":{"text":"indexedDbDraftStore.createIndexedDbProjectDraftStore.deleteCorrupt (cyclomatic 30): indexedDbDraftStore.createIndexedDbProjectDraftStore.deleteCorrupt has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 1 of the 30 points is its own statement and the rest belongs to one function literal inside it that branches (line 559). 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":557}}}],"partialFingerprints":{"codehealthFindingId/v1":"cedbfeabb9b974d79b8161b2e88a354cbacb7ad6a9e17d4b448d7020b55d6453"}},{"ruleId":"D1","level":"warning","message":{"text":"paintTool.resolveTarget (cyclomatic 30): paintTool.resolveTarget 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/paintTool.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"794d8bc7d0288561fb2aa83ad18966f4af40a6f428087267fbf5598849957a21"}},{"ruleId":"D1","level":"warning","message":{"text":"shapeTool.createShapeTool.commitPixels (cyclomatic 30): shapeTool.createShapeTool.commitPixels has cyclomatic complexity 30 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 3 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/shapeTool.ts"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"4be900d67a7a6f102459db6ff1e0d5ff76f78c9e3fd1a1a49103a19717198e38"}},{"ruleId":"D1","level":"warning","message":{"text":"generationComposite.composeForGeneration (cyclomatic 30): generationComposite.composeForGeneration has cyclomatic complexity 30 (threshold 15). Of this number, 26 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/generationComposite.ts"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0c83df6bf4cc9b8a9df33bcf05a563710698e169c95fdd75b93eb4dedb56189"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelInstallService._install_path_with_info_claimed (cyclomatic 29): ModelInstallService._install_path_with_info_claimed 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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":1038}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3b0b31870f833b7e96bed9250e35807900a70b830b2da199b2a3b7fd00051dd"}},{"ruleId":"D1","level":"warning","message":{"text":"_ExecutionNodeBuilder._create_nested_iterate_body_iteration (cyclomatic 29): _ExecutionNodeBuilder._create_nested_iterate_body_iteration 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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":1017}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d4a315eb41a00388098bd246400c4449160b4322af9a1df70a225666e13b724"}},{"ruleId":"D1","level":"warning","message":{"text":"Graph._is_for_connection_valid (cyclomatic 29): Graph._is_for_connection_valid 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":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":1353}}}],"partialFingerprints":{"codehealthFindingId/v1":"53497433cb12674f24e269c918440038e7a328809446d9fedd35291478ebf83f"}},{"ruleId":"D1","level":"warning","message":{"text":"TextToolOptions.FontSelect (cyclomatic 29): TextToolOptions.FontSelect has cyclomatic complexity 29 (threshold 15). Most of this is not in the body itself: 1 of the 29 points is its own statement and the rest belongs to 14 function literals inside it that branch (lines 123, 265, 137, \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"d987aad0731bc79f6912609479db6d55a83e58f968a90374e1610d046a6aa827"}},{"ruleId":"D1","level":"warning","message":{"text":"buildGraph.compileProjectGraph (cyclomatic 29): buildGraph.compileProjectGraph has cyclomatic complexity 29 (threshold 15). Of this number, 28 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":"invokeai/frontend/webv2/src/features/workflow/core/buildGraph.ts"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"efcf2866e8933f5beffff68e95f30ecc7b1489a8ea25f4ce0681a216fc26e79d"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowFieldInput.SavedWorkflowInput (cyclomatic 29): WorkflowFieldInput.SavedWorkflowInput has cyclomatic complexity 29 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 10 belong to 5 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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":1675}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bf5e3c468582ce7a17d50b144591fbc0476ec242e8744af58efbd494ab5eaa1"}},{"ruleId":"D1","level":"warning","message":{"text":"MergeLayerController.mergeDown (cyclomatic 29): MergeLayerController.mergeDown has cyclomatic complexity 29 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 5 belong to 4 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee39d314cf13be1f33ad58ddd88844778823004b62b5578f713de4047e493d42"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsEntryView.SettingsEntryView (cyclomatic 29): SettingsEntryView.SettingsEntryView 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":"invokeai/frontend/webv2/src/workbench/settings/SettingsEntryView.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"41afbeda046c3c7b978856961979647999d9a9ba32907431d396f3b7000d023a"}},{"ruleId":"D1","level":"warning","message":{"text":"LTX2DenoiseInvocation.invoke (cyclomatic 28): LTX2DenoiseInvocation.invoke has cyclomatic complexity 28 (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":"invokeai/app/invocations/ltx2/ltx2_denoise.py"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"716daee7c3058a3962079529a053cf90b877d84a6206dae885cd2080641c3bf0"}},{"ruleId":"D1","level":"warning","message":{"text":"MiniMaxH3DenoiseInvocation.invoke (cyclomatic 28): MiniMaxH3DenoiseInvocation.invoke has cyclomatic complexity 28 (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":"invokeai/app/invocations/minimax_h3/minimax_h3_denoise.py"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"42fe4fe56437cd0f595627a7aac6414561aaf955b99dcb2b83df84149bcc5aa4"}},{"ruleId":"D1","level":"warning","message":{"text":"ExtractVideoRangeInvocation.invoke (cyclomatic 28): ExtractVideoRangeInvocation.invoke has cyclomatic complexity 28 (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":"invokeai/app/invocations/video_frame_extract_range.py"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"d99a9922de19987139b7dec9c8bf119665e2ae9f2076280f1d90ba0fc364452d"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelInstallService._clear_pending_jobs (cyclomatic 28): ModelInstallService._clear_pending_jobs 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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":782}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cf3b8c891e616f3e33df0fba2a1ad46fa9cd349c1953d6c11d9ecb9d9c5a94d"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphExecutionState._record_effect_streams (cyclomatic 28): GraphExecutionState._record_effect_streams 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1698}}}],"partialFingerprints":{"codehealthFindingId/v1":"42e1eac10bc553814205c529c7f468e00ba4c097f68df4ca42313469f8886570"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphExecutionState.apply (cyclomatic 28): GraphExecutionState.apply 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":3153}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9d2c382788b94d1c2b78ec9d6914291f7fe3d935e31a0fe29c80a3cd61b424b"}},{"ruleId":"D1","level":"warning","message":{"text":"graph_if_dependencies._can_use_fresh_mixed_if_iterate_collect (cyclomatic 28): graph_if_dependencies._can_use_fresh_mixed_if_iterate_collect has cyclomatic complexity 28 (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":"invokeai/app/services/shared/graph_if_dependencies.py"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8b93ecbff298668241d120e425273143654677948e5f400cab6a620f48b271e"}},{"ruleId":"D1","level":"warning","message":{"text":"Flux2CheckpointModel._load_from_singlefile (cyclomatic 28): Flux2CheckpointModel._load_from_singlefile 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":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":1261}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6b422ad6a46f183bb147769179ced26ef5e9ebb7a50d801f0474eb0e09694ba"}},{"ruleId":"D1","level":"warning","message":{"text":"LoRALoader._load_model (cyclomatic 28): LoRALoader._load_model has cyclomatic complexity 28 (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":"invokeai/backend/model_manager/load/model_loaders/lora.py"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"e60fd9e151761400ce364bdf46c5ad3b9b47eb996af73fc297162f49fd34a1ba"}},{"ruleId":"D1","level":"warning","message":{"text":"Qwen3EncoderGGUFLoader._load_from_gguf (cyclomatic 28): Qwen3EncoderGGUFLoader._load_from_gguf 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":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":1496}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e50155f1ff9b5858fa1e85a9b6dc27685a22a93561df3314c37e4a45ea196d7"}},{"ruleId":"D1","level":"warning","message":{"text":"ControlNetModel.forward (cyclomatic 28): ControlNetModel.forward 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":"invokeai/backend/util/hotfixes.py"},"region":{"startLine":570}}}],"partialFingerprints":{"codehealthFindingId/v1":"77506138bd6ef460115914ce81f4b880a455ecf46ddc3d2bece9612bc6b109c8"}},{"ruleId":"D1","level":"warning","message":{"text":"DeleteBoardModal.DeleteBoardModal (cyclomatic 28): DeleteBoardModal.DeleteBoardModal has cyclomatic complexity 28 (threshold 15). Most of this is not in the body itself: 9 of the 28 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 105, 123, 154, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"e72bcab2fc30f41fb3976c047dafd9438b53b04040d6bb01c5875e7957c44054"}},{"ruleId":"D1","level":"warning","message":{"text":"buildQwenImageGraph.buildQwenImageGraph (cyclomatic 28): buildQwenImageGraph.buildQwenImageGraph has cyclomatic complexity 28 (threshold 15). Of this number, 25 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"f52fc77a70ba0a6234034954910d395749a648e935c762f10a1149ba0cc1d38a"}},{"ruleId":"D1","level":"warning","message":{"text":"GalleryPickerGrid.GalleryPickerGrid (cyclomatic 28): GalleryPickerGrid.GalleryPickerGrid has cyclomatic complexity 28 (threshold 15). Most of this is not in the body itself: 9 of the 28 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 386, 281, 322, \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":"invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerGrid.tsx"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8017b7bdc9fe91976f4f618fcad15382733cb3dddb5c08fb3c299de8477b6ea"}},{"ruleId":"D1","level":"warning","message":{"text":"GalleryBoardRow.GalleryBoardRow (cyclomatic 28): GalleryBoardRow.GalleryBoardRow has cyclomatic complexity 28 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 12 belong to 8 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardRow.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"de0fcda27ded969ff0aaca6fee6db0377b48fd4e58bf6c82febbc9693a0f9306"}},{"ruleId":"D1","level":"warning","message":{"text":"modelSettingsIO.validateImportData (cyclomatic 28): modelSettingsIO.validateImportData 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":"invokeai/frontend/webv2/src/features/models/core/modelSettingsIO.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"4344a9a6490f54d9dd0fdc20b3c72a9d1d4949860b7c2ed0ed24e629e40db269"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelEditForm.ModelEditForm (cyclomatic 28): ModelEditForm.ModelEditForm has cyclomatic complexity 28 (threshold 15). Most of this is not in the body itself: 9 of the 28 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 157, 134, 103, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/detail/ModelEditForm.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"350453c9b4771598eb204ea75a49393cb4788f77d9f9a1a9c1fe558838a8858a"}},{"ruleId":"D1","level":"warning","message":{"text":"InstallJobRow.InstallJobRow (cyclomatic 28): InstallJobRow.InstallJobRow 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, 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":"invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallJobRow.tsx"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fe31cd5a00d281b117b16e14499bcf6fc6cf980f25511a8110a463849ffe946"}},{"ruleId":"D1","level":"warning","message":{"text":"runtime.createQueueRuntime.handleUnadoptedRerunSettled (cyclomatic 28): runtime.createQueueRuntime.handleUnadoptedRerunSettled has cyclomatic complexity 28 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 12 belong to 4 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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":1672}}}],"partialFingerprints":{"codehealthFindingId/v1":"28165a3cdb7e0bd6ca9e3cdaf6c05f957015646c6a3aedc11ba6f78697a43ed4"}},{"ruleId":"D1","level":"warning","message":{"text":"coordinator.createQueueCoordinator.reconcile (cyclomatic 28): coordinator.createQueueCoordinator.reconcile has cyclomatic complexity 28 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 12 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":"invokeai/frontend/webv2/src/features/queue/runtime/coordinator.ts"},"region":{"startLine":1043}}}],"partialFingerprints":{"codehealthFindingId/v1":"f69a3a50a6e15fc19c806ac458accb4689aee38204a152e714a83c560bf044d1"}},{"ruleId":"D1","level":"warning","message":{"text":"settings.syncUpscaleWidgetValuesWithModels (cyclomatic 28): settings.syncUpscaleWidgetValuesWithModels 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, 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":"invokeai/frontend/webv2/src/features/upscale/core/settings.ts"},"region":{"startLine":860}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e3d9fed4913a0606ecfb3d5fa47c4f3dc9cb0f04476b059a385ede33a2aca2d"}},{"ruleId":"D1","level":"warning","message":{"text":"graphToDocument.previewGraphToDocument (cyclomatic 28): graphToDocument.previewGraphToDocument 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":"invokeai/frontend/webv2/src/features/workflow/core/graphToDocument.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"3495a8e93d27d94107d618b8ec537dc6378a31ebd188a3427729220b63a02e3e"}},{"ruleId":"D1","level":"warning","message":{"text":"durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::hydrateProjectWithDraft (cyclomatic 28): durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::hydrateProjectWithDraft 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. This shape REPEATS in the file: 4 other methods here (durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::stageProject, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject::pushHalves, \u2026) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 5 times rather than 5 independent problems. Splitting this body alone leaves the other 4 exactly as they are. Where these are variations on one operation, the change that clears all 5 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":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":2142}}}],"partialFingerprints":{"codehealthFindingId/v1":"00eed6c457b7c7c5f5b0c7c17a9608977d9f6cfb626877b64a232791220742e4"}},{"ruleId":"D1","level":"warning","message":{"text":"documentIndex.deriveIndexForValueEdit (cyclomatic 28): documentIndex.deriveIndexForValueEdit has cyclomatic complexity 28 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 7 belong to 2 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentIndex.ts"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ffe44aa9795881819036ec483ee5aa6953ad7dfb1c436bef82019b95272e561"}},{"ruleId":"D1","level":"warning","message":{"text":"PsdExportController.export (cyclomatic 28): PsdExportController.export has cyclomatic complexity 28 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 8 belong to 2 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/psdExportController.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fb679d8c8b6312fead0fc8e5dc6c760dce785dccb4a5c5f0fc2194186724ae5"}},{"ruleId":"D1","level":"warning","message":{"text":"rasterSnapshotCapture.createRasterSnapshotCapture.captureRasterSnapshot (cyclomatic 28): rasterSnapshotCapture.createRasterSnapshotCapture.captureRasterSnapshot has cyclomatic complexity 28 (threshold 15). Of this number, 27 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/rasterSnapshotCapture.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"6133fe5dc2c6b14e3b4270333ee3cc78150d5bb9145d42b0411c6e847ca8594e"}},{"ruleId":"D1","level":"warning","message":{"text":"paletteQueryModel.derivePaletteQueryModel (cyclomatic 28): paletteQueryModel.derivePaletteQueryModel has cyclomatic complexity 28 (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":"invokeai/frontend/webv2/src/workbench/palette/paletteQueryModel.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a225e57669b3cf2be1e368567b26620299891eb2cbeecf8afcda35c223d1e4a"}},{"ruleId":"D1","level":"warning","message":{"text":"StatusBar.CompactBottomWidget (cyclomatic 28): StatusBar.CompactBottomWidget has cyclomatic complexity 28 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 9 belong to 5 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":"invokeai/frontend/webv2/src/workbench/shell/StatusBar.tsx"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5fbf3593189a02318afd756c68486b0376b9e82b8cdfd2644ce2bee305fe8ae"}},{"ruleId":"D1","level":"warning","message":{"text":"QwenImageDenoiseInvocation._run_diffusion (cyclomatic 27): QwenImageDenoiseInvocation._run_diffusion 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":"invokeai/app/invocations/qwen_image/qwen_image_denoise.py"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"a186e528e1395026233db9becc03d2fe7096a9060bd945d0b948065a2b927a2a"}},{"ruleId":"D1","level":"warning","message":{"text":"ChildDependencyRecord._validate_relationship (cyclomatic 27): ChildDependencyRecord._validate_relationship has cyclomatic complexity 27 (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":"invokeai/app/services/shared/execution_engine/child.py"},"region":{"startLine":479}}}],"partialFingerprints":{"codehealthFindingId/v1":"160925052e5debda1ab13db7c1cf07f328814a8bbfbffc1f6fbfcfa0299019e4"}},{"ruleId":"D1","level":"warning","message":{"text":"graph_loop_topology._recognize_nested_iterate_sequence (cyclomatic 27): graph_loop_topology._recognize_nested_iterate_sequence 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":"invokeai/app/services/shared/graph_loop_topology.py"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5080c3b447169c411bc9ba00102ca1cc1f1f70b0c57b6438b9a702fec4e6cff"}},{"ruleId":"D1","level":"warning","message":{"text":"_ExecutionNodeBuilder._create_nested_for_body_iteration (cyclomatic 27): _ExecutionNodeBuilder._create_nested_for_body_iteration 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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":894}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ebdf4454a3433b6f61244adaaf93ed832315b3a09471a4f9a037e19d0012dff"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelCache.put (cyclomatic 27): ModelCache.put has cyclomatic complexity 27 (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":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":928}}}],"partialFingerprints":{"codehealthFindingId/v1":"477cf803bb1ee9841965f22236559a3c46bf07e61d93dd952ed737de55889537"}},{"ruleId":"D1","level":"warning","message":{"text":"loaders.sdnq_sd_loader (cyclomatic 27): loaders.sdnq_sd_loader 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":"invokeai/backend/quantization/sdnq/loaders.py"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"b72f9def98d68dd85fbfe8a9195a772607fbec783cabb22fd229e21c0a985d19"}},{"ruleId":"D1","level":"warning","message":{"text":"setDefaultSettings.addSetDefaultSettingsListener (cyclomatic 27): setDefaultSettings.addSetDefaultSettingsListener has cyclomatic complexity 27 (threshold 15). Most of this is not in the body itself: 1 of the 27 points is its own statement and the rest belongs to one function literal inside it that branches (line 37). 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":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/setDefaultSettings.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"9165da78f7f4369f20ac8ff178c5e4352bf5554cbdd89e7b363619ff7ae8e6fe"}},{"ruleId":"D1","level":"warning","message":{"text":"CurrentImagePreview.CurrentImagePreview (cyclomatic 27): CurrentImagePreview.CurrentImagePreview has cyclomatic complexity 27 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 12 belong to 3 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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"001fe9d8ee590c733842f290e3ec687c5d55c2c91adb82c19b35668801de4479"}},{"ruleId":"D1","level":"warning","message":{"text":"connectorTopology.getConnectorDeletionSpliceConnections (cyclomatic 27): connectorTopology.getConnectorDeletionSpliceConnections has cyclomatic complexity 27 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 9 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":"invokeai/frontend/webv1/src/features/nodes/store/util/connectorTopology.ts"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc40876404d45b30f7d719f11cf1d5adefc1d5cb18d3d3732ff8b2e7f9369846"}},{"ruleId":"D1","level":"warning","message":{"text":"buildSDXLGraph.buildSDXLGraph (cyclomatic 27): buildSDXLGraph.buildSDXLGraph has cyclomatic complexity 27 (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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd236c504250d3f48a8828ad67305922f91f759924c8956411bfe966cd5e9e9d"}},{"ruleId":"D1","level":"warning","message":{"text":"buildZImageGraph.buildZImageGraph (cyclomatic 27): buildZImageGraph.buildZImageGraph has cyclomatic complexity 27 (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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1bda3815db5367843aa52c9160a70417369eb9e16b12d035b3698b4c8c9c615"}},{"ruleId":"D1","level":"warning","message":{"text":"parseSchema.parseSchema (cyclomatic 27): parseSchema.parseSchema has cyclomatic complexity 27 (threshold 15). Most of this is not in the body itself: 1 of the 27 points is its own statement and the rest belongs to 5 function literals inside it that branch (lines 120, 200, 108, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/schema/parseSchema.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"5622b23db576d319de64e1cf665a8c62071ae62262659c4aa0a202c0298fdb93"}},{"ruleId":"D1","level":"warning","message":{"text":"GeneratePresetsPopover.GeneratePresetsPopover (cyclomatic 27): GeneratePresetsPopover.GeneratePresetsPopover has cyclomatic complexity 27 (threshold 15). Most of this is not in the body itself: 12 of the 27 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 190, 166, 238, \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":"invokeai/frontend/webv2/src/features/generation/ui/GeneratePresetsPopover.tsx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"dda9a9e591fbbffba1dca8bff7272c1daaa501da748322f2fdf9b9b8b77999fa"}},{"ruleId":"D1","level":"warning","message":{"text":"runtime.createQueueRuntime.initialize (cyclomatic 27): runtime.createQueueRuntime.initialize has cyclomatic complexity 27 (threshold 15). Most of this is not in the body itself: 5 of the 27 points are its own statements and the rest belongs to 3 function items inside it that branch (initializeProjects, a function literal at line 2419, a function literal at line 2438). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":2373}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d07831c5c16a318f3363ce6f0a676019c712746271368f11fc402f710853edd"}},{"ruleId":"D1","level":"warning","message":{"text":"templates.parseFieldType (cyclomatic 27): templates.parseFieldType has cyclomatic complexity 27 (threshold 15). Of this number, 26 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":"invokeai/frontend/webv2/src/features/workflow/data/templates.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"680403c57351d5dd806346dadf10918597e7fb243dec43cbbadb33ceeeb65c88"}},{"ruleId":"D1","level":"warning","message":{"text":"NodeFieldControl.NodeFieldControl (cyclomatic 27): NodeFieldControl.NodeFieldControl has cyclomatic complexity 27 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 3 belong to 3 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":"invokeai/frontend/webv2/src/features/workflow/ui/linear/NodeFieldControl.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef2f501366871384ac914ef6ed90a095d778485005db379d60ed9621b5251160"}},{"ruleId":"D1","level":"warning","message":{"text":"GeneratorFieldInput.GeneratorFieldInput (cyclomatic 27): GeneratorFieldInput.GeneratorFieldInput has cyclomatic complexity 27 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 7 belong to 5 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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bddd3587e1d4760dd75f1aacf21818c1f82c251ec0c2820d28808e45b5842fa"}},{"ruleId":"D1","level":"warning","message":{"text":"draftStore.createMemoryProjectDraftStore.retargetAcknowledgedCopy (cyclomatic 27): draftStore.createMemoryProjectDraftStore.retargetAcknowledgedCopy 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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":1355}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1c8df934e9d5c91972228f84bca6553cfe46ff870936ccc70dd02a4f583875a"}},{"ruleId":"D1","level":"warning","message":{"text":"restoreProjectMedia.restoreProjectMedia (cyclomatic 27): restoreProjectMedia.restoreProjectMedia has cyclomatic complexity 27 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 8 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":"invokeai/frontend/webv2/src/workbench/projects/invk/restoreProjectMedia.ts"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ac1fa6cb1101440f18c9d611e7b2c12694f417232acb04a32a77886991a6bdc"}},{"ruleId":"D1","level":"warning","message":{"text":"PreferencesPage.PreferencesPage (cyclomatic 27): PreferencesPage.PreferencesPage has cyclomatic complexity 27 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 8 belong to 6 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":"invokeai/frontend/webv2/src/workbench/settings/PreferencesPage.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d61d912c8383dbca60791ab854e891d86f51976d75e1b309a0f18c7684efd0f"}},{"ruleId":"D1","level":"warning","message":{"text":"LayerFilterControls.FilterParamField (cyclomatic 27): LayerFilterControls.FilterParamField has cyclomatic complexity 27 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 6 belong to 4 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerFilterControls.tsx"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"da494104ccec71a5ffa940296f0f5f55623bd8c60cb6ada79bb6d4f8b6da9bad"}},{"ruleId":"D1","level":"warning","message":{"text":"recall_parameters.update_recall_parameters (cyclomatic 26): recall_parameters.update_recall_parameters 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":"invokeai/app/api/routers/recall_parameters.py"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c9ae1afc181147a082a1203b9a7c9fd8b4b4f02079280e10d83c60f8888a83b"}},{"ruleId":"D1","level":"warning","message":{"text":"QwenImage21DenoiseInvocation._run_diffusion (cyclomatic 26): QwenImage21DenoiseInvocation._run_diffusion has cyclomatic complexity 26 (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":"invokeai/app/invocations/qwen_image_2_1/qwen_image_2_1_denoise.py"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba15b5ce92c0029a29788e7c2b3681580f60d43d21eb0953839aa70d13ce8c62"}},{"ruleId":"D1","level":"warning","message":{"text":"graph_iterate_planner._get_body_iterate_collect_fan_in (cyclomatic 26): graph_iterate_planner._get_body_iterate_collect_fan_in 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":"invokeai/app/services/shared/graph_iterate_planner.py"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"934010bc83ffc95db3ab09d56425ec366f32ce2694840a48f49f53bf45e47a7b"}},{"ruleId":"D1","level":"warning","message":{"text":"graph_loop_topology._recognize_nested_iterate_chain (cyclomatic 26): graph_loop_topology._recognize_nested_iterate_chain has cyclomatic complexity 26 (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":"invokeai/app/services/shared/graph_loop_topology.py"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"83e8c5edbe605c5d5cc87ea7acf1a99a96b41ecdb5ac84a2b20d4f1d790ed539"}},{"ruleId":"D1","level":"warning","message":{"text":"_ExecutionNodeBuilder.create_nested_for_return (cyclomatic 26): _ExecutionNodeBuilder.create_nested_for_return 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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8ab80c0ab9e785fc6798f02e5404bd8d967c3f8b66f1b29d0089f4c9b734594"}},{"ruleId":"D1","level":"warning","message":{"text":"calibrate_flux_vae_working_memory.main (cyclomatic 26): calibrate_flux_vae_working_memory.main 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":"scripts/calibrate_flux_vae_working_memory.py"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"c06ed35697eb88a9ec2e58bda69aef3d8f2e9490cf54ea66e510bfb122c6ff3f"}},{"ruleId":"D1","level":"warning","message":{"text":"GalleryImageGridPaged.GalleryImageGridPaged (cyclomatic 26): GalleryImageGridPaged.GalleryImageGridPaged has cyclomatic complexity 26 (threshold 15). Most of this is not in the body itself: 3 of the 26 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 36, 84, 67, \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":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGridPaged.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"a20f74428348831cd319f1b5b64d6fe9c6183adef8fdc285fbd94d2699763f1f"}},{"ruleId":"D1","level":"warning","message":{"text":"RelatedModels.RelatedModels (cyclomatic 26): RelatedModels.RelatedModels has cyclomatic complexity 26 (threshold 15). Most of this is not in the body itself: 5 of the 26 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 162, 220, 246, \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/RelatedModels.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"39874aa8b2573d53b9245e6bbe4caf132ae1afcf9c410b60d8f21c075c9c4b77"}},{"ruleId":"D1","level":"warning","message":{"text":"QueueItemComponent.QueueItemComponent (cyclomatic 26): QueueItemComponent.QueueItemComponent has cyclomatic complexity 26 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 11 belong to 5 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":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueItemComponent.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa2a90ccb40c737fb64fff9fc5cc3967a3f2fc7703d63120f96534f3eb34b3d3"}},{"ruleId":"D1","level":"warning","message":{"text":"HotkeyListItem.HotkeyItem (cyclomatic 26): HotkeyListItem.HotkeyItem has cyclomatic complexity 26 (threshold 15). Most of this is not in the body itself: 3 of the 26 points are its own statements and the rest belongs to 8 function items inside it that branch (a function literal at line 151, renderHotkeyKeys, a function literal at line 116, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/HotkeyListItem.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f0b3ef2e4e854f0f8562f4f430894bcc9abbf77e403156d2f295900cb5bd6dc"}},{"ruleId":"D1","level":"warning","message":{"text":"index.dynamicBaseQuery (cyclomatic 26): index.dynamicBaseQuery has cyclomatic complexity 26 (threshold 15). Of this number, 24 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":"invokeai/frontend/webv1/src/services/api/index.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fd6643e45de885ef95b64c049bc7632f119b04075424f193d93e3346149ba73"}},{"ruleId":"D1","level":"warning","message":{"text":"react.createDeferredFontRuntime (cyclomatic 26): react.createDeferredFontRuntime has cyclomatic complexity 26 (threshold 15). Most of this is not in the body itself: 1 of the 26 points is its own statement and the rest belongs to 13 function items inside it that branch (a function literal at line 107, a function literal at line 132, a function literal at line 156, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/fonts/react.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"29e913e67fd3cdf8a3972ec9327fc63529bc16d0970b8d95838a7311fc6520c4"}},{"ruleId":"D1","level":"warning","message":{"text":"semanticImageQuery.parseGallerySemanticReference (cyclomatic 26): semanticImageQuery.parseGallerySemanticReference 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":"invokeai/frontend/webv2/src/features/gallery/core/semanticImageQuery.ts"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ffcd4e5234c940940f33417b943de0011f742f30c82fe81bbdd18b15eeb8b30"}},{"ruleId":"D1","level":"warning","message":{"text":"SystemPromptsField.SystemPromptsField (cyclomatic 26): SystemPromptsField.SystemPromptsField has cyclomatic complexity 26 (threshold 15). Most of this is not in the body itself: 12 of the 26 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 141, 204, 130, \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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/SystemPromptsField.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"33c3c5e2a90e161dcdb038783e37df81419b0eb84c76be1996d52e432def8650"}},{"ruleId":"D1","level":"warning","message":{"text":"ClearDialog.ClearDialog (cyclomatic 26): ClearDialog.ClearDialog has cyclomatic complexity 26 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/intermediates/ui/ClearDialog.tsx"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb919e6db048f49fab7ec419611a709cddd8a23ebe5f05a98f0d51f8a081c149"}},{"ruleId":"D1","level":"warning","message":{"text":"templates.buildInputTemplate (cyclomatic 26): templates.buildInputTemplate has cyclomatic complexity 26 (threshold 15). Of this number, 25 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":"invokeai/frontend/webv2/src/features/workflow/data/templates.ts"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cb5cc9951b2a18ae2190f785a6108cc03a330b22438724a1cecd85706794937"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowFieldInput.VideoFrameIndexInput (cyclomatic 26): WorkflowFieldInput.VideoFrameIndexInput has cyclomatic complexity 26 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 7 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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":1148}}}],"partialFingerprints":{"codehealthFindingId/v1":"097f39bff6f1fc33ab7163b804eae6cb0c421ed77d1ca7e7b523ee2581692347"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowFieldInput.WorkflowFieldInput (cyclomatic 26): WorkflowFieldInput.WorkflowFieldInput has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":1815}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eb522c7d42c30aaf43c4e42143effad12a6a347680b90b0de819de7de988e1d"}},{"ruleId":"D1","level":"warning","message":{"text":"layerPanelState.reconcileLayerPanelState (cyclomatic 26): layerPanelState.reconcileLayerPanelState 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":"invokeai/frontend/webv2/src/workbench/layerPanelState.ts"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"00d46f7518924478f137c2ef2c1091e04c0f70ec962d651b531a024ff2af8eee"}},{"ruleId":"D1","level":"warning","message":{"text":"MissingFontsDialog.RecoveryRow (cyclomatic 26): MissingFontsDialog.RecoveryRow has cyclomatic complexity 26 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 13 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/MissingFontsDialog.tsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfb0c45f158312c8177d1f4749a61f74fd5b209c34da4f7e4b47beb5512653f2"}},{"ruleId":"D1","level":"warning","message":{"text":"InvokeImageBlendInvocation.image_convert_with_xform (cyclomatic 25): InvokeImageBlendInvocation.image_convert_with_xform 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":"invokeai/app/invocations/composition-nodes.py"},"region":{"startLine":449}}}],"partialFingerprints":{"codehealthFindingId/v1":"f37324960e9ce9eb9ba0794cbfc657fa35a78c789d32dbc166ffde9d6e2ccaa5"}},{"ruleId":"D1","level":"warning","message":{"text":"InvokeImageCompositorInvocation.invoke (cyclomatic 25): InvokeImageCompositorInvocation.invoke has cyclomatic complexity 25 (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":"invokeai/app/invocations/composition-nodes.py"},"region":{"startLine":1312}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc74e9cadaceb33f13329f0977244c47ac97c72a756a99339fa75ef08273a819"}},{"ruleId":"D1","level":"warning","message":{"text":"fonts_parsing.parse_font_bytes (cyclomatic 25): fonts_parsing.parse_font_bytes has cyclomatic complexity 25 (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":"invokeai/app/services/fonts/fonts_parsing.py"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb288965f277081048583db926c0b0058787acae5d048484b86fbe276bce4d88"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelInstallService._remove_stale_install_source_claims_locked (cyclomatic 25): ModelInstallService._remove_stale_install_source_claims_locked has cyclomatic complexity 25 (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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b14ac4ca32224a16527704c3f0403f06108a822e90ee72f8f25d77768f05bce"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphExecutionState._build_execution_tokens (cyclomatic 25): GraphExecutionState._build_execution_tokens has cyclomatic complexity 25 (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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":3027}}}],"partialFingerprints":{"codehealthFindingId/v1":"9576f2ac6ea7844f2b9021e07aee709b250ad193422721a3f1e3e06d880f5268"}},{"ruleId":"D1","level":"warning","message":{"text":"_ExecutionNodeBuilder._get_sibling_iterate_if_collect_branches (cyclomatic 25): _ExecutionNodeBuilder._get_sibling_iterate_if_collect_branches has cyclomatic complexity 25 (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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":1844}}}],"partialFingerprints":{"codehealthFindingId/v1":"b12257dd4906763c766905638735dd5279a54718f644d0cc8f11c3a8adbcb728"}},{"ruleId":"D1","level":"warning","message":{"text":"MistralEncoderCheckpointLoader._load_text_encoder (cyclomatic 25): MistralEncoderCheckpointLoader._load_text_encoder has cyclomatic complexity 25 (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":"invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py"},"region":{"startLine":1174}}}],"partialFingerprints":{"codehealthFindingId/v1":"6386b642c1d2bcde77ae6b407610efe11dacf0b6a00448d5dee1e5a607c8971b"}},{"ruleId":"D1","level":"warning","message":{"text":"Qwen3EncoderSDNQLoader._load_from_sdnq (cyclomatic 25): Qwen3EncoderSDNQLoader._load_from_sdnq has cyclomatic complexity 25 (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":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":1701}}}],"partialFingerprints":{"codehealthFindingId/v1":"744f170517a68b7e300835027bda6ee20fdf384b2a8b606aea29afd50294e379"}},{"ruleId":"D1","level":"warning","message":{"text":"loaders._infer_quantization_type (cyclomatic 25): loaders._infer_quantization_type has cyclomatic complexity 25 (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":"invokeai/backend/quantization/sdnq/loaders.py"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"f846ab73421228f057392cd5a00db01ee01f946a1e08059b522f301a682f7b1e"}},{"ruleId":"D1","level":"warning","message":{"text":"SyncModelsDialog.SyncModelsDialog (cyclomatic 25): SyncModelsDialog.SyncModelsDialog has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 6 of the 25 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 56, 80, 111, \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/SyncModelsDialog.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"56c2c49131051190967f3763834d197b7ca9c7a52a2aa76ae5f8346f6b166ed7"}},{"ruleId":"D1","level":"warning","message":{"text":"useConnection.useConnection (cyclomatic 25): useConnection.useConnection has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 1 of the 25 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 33, 108). 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":"invokeai/frontend/webv1/src/features/nodes/hooks/useConnection.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"4032c59a63ec1500dc97e3a6380f94327a7fe5451ac728ee4ef78af30b3e3bab"}},{"ruleId":"D1","level":"warning","message":{"text":"addOutpaint.addOutpaint (cyclomatic 25): addOutpaint.addOutpaint has cyclomatic complexity 25 (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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"777c1463767ed0b18cb0ab475d4036fec62f99d311b485ab061d9575e7f93ac1"}},{"ruleId":"D1","level":"warning","message":{"text":"run-graph._runGraph (cyclomatic 25): run-graph._runGraph has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 6 of the 25 points are its own statements and the rest belongs to 6 function items inside it that branch (a function literal at line 327, onQueueItemStatusChanged, a function literal at line 216, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/run-graph.ts"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b059651d3f2f2cb9c56bb15d6c5ab2d49c79353f0d7b1e7c8b183cb2a06c2ab"}},{"ruleId":"D1","level":"warning","message":{"text":"tsSourceAnalysis.collectModuleReferences::visit (cyclomatic 25): tsSourceAnalysis.collectModuleReferences::visit has cyclomatic complexity 25 (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":"invokeai/frontend/webv2/src/architecture/tsSourceAnalysis.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ae7a087694a09531577420108eedcc15993bb166cd7c306dc07a26075d1a8ee"}},{"ruleId":"D1","level":"warning","message":{"text":"selection.getGalleryNavigationStep (cyclomatic 25): selection.getGalleryNavigationStep has cyclomatic complexity 25 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 7 belong to 2 function items inside it that branch. To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/core/selection.ts"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"107f5b1fc55edc955b00ffde926c2ed20124706e7b84603d180d4b06a900a0b2"}},{"ruleId":"D1","level":"warning","message":{"text":"queries.ensureLifecycle (cyclomatic 25): queries.ensureLifecycle has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 7 of the 25 points are its own statements and the rest belongs to 5 function items inside it that branch (a function literal at line 361, a function literal at line 316, pruneListing, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/data/queries.ts"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d20b3394d3add56723e6d322a200fccc93c855f0ce52b5f43a4ae0a1f36b39f"}},{"ruleId":"D1","level":"warning","message":{"text":"InstallQueueBar.InstallQueueBar (cyclomatic 25): InstallQueueBar.InstallQueueBar has cyclomatic complexity 25 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 3 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":"invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallQueueBar.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4ea0a3faa879a9b1e4549471a5abf43a1ba798cf23e5aac62a32d4f5b16ce17"}},{"ruleId":"D1","level":"warning","message":{"text":"runtime.createQueueRuntime.synchronizeRunPersistence (cyclomatic 25): runtime.createQueueRuntime.synchronizeRunPersistence has cyclomatic complexity 25 (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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":1923}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddd0a31451071989e09367a00e0650ef394c5a6e0e533b297eae3000782d3e2a"}},{"ruleId":"D1","level":"warning","message":{"text":"graph.buildWanVideoGraph (cyclomatic 25): graph.buildWanVideoGraph 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":"invokeai/frontend/webv2/src/features/video/core/graph.ts"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"51bc600ea1e4c5fef77f23236f7239950f757c5edacf6471bdcf3a018d55e7ab"}},{"ruleId":"D1","level":"warning","message":{"text":"forLoops.validateForLoopGraph::supportsNestedIterateBody (cyclomatic 25): forLoops.validateForLoopGraph::supportsNestedIterateBody has cyclomatic complexity 25 (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. This shape REPEATS in the file: 2 other methods here (forLoops.validateForLoopGraph, forLoops.validateForLoopGraph::getSupportedNestedForBody) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 3 times rather than 3 independent problems. Splitting this body alone leaves the other 2 exactly as they are. Where these are variations on one operation, the change that clears all 3 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":"invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccfbbb63bd2c0a4c13cc666eff5a27827112719f8080dd01e507b73bc96e4e88"}},{"ruleId":"D1","level":"warning","message":{"text":"normalize.normalizeValue (cyclomatic 25): normalize.normalizeValue 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, 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":"invokeai/frontend/webv2/src/platform/logging/normalize.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"33cd77dfb6968365f0efcf1d9eaa6b8626d5ed2c27674a27b5f19782f0e852a9"}},{"ruleId":"D1","level":"warning","message":{"text":"HsvBoxPicker.HsvBoxPicker (cyclomatic 25): HsvBoxPicker.HsvBoxPicker has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 8 of the 25 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 106, 127, 48, \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":"invokeai/frontend/webv2/src/platform/ui/HsvBoxPicker.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf343c99ba01b0d7ecd6bf9df3ae5f0808d2610b627b51a9e3b10773ab3d0d56"}},{"ruleId":"D1","level":"warning","message":{"text":"StagingBar.StagingBar (cyclomatic 25): StagingBar.StagingBar has cyclomatic complexity 25 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 6 belong to 2 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/StagingBar.tsx"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b389fa010cc1b5212a01243bb1cb059f75d5d2729a947a7df9f11ab49c00fff"}},{"ruleId":"D1","level":"warning","message":{"text":"SelectionPixelController.edit (cyclomatic 25): SelectionPixelController.edit has cyclomatic complexity 25 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 3 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/selectionPixelController.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"6093e3bcfd6fe7fa029a574135d7df5e37e84b57125d110c60768e02d4b98abc"}},{"ruleId":"D1","level":"warning","message":{"text":"StagedResultController.commit (cyclomatic 25): StagedResultController.commit has cyclomatic complexity 25 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 12 belong to 5 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/stagedResultController.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"25c0e56f17963f65a4f1c41b575939f019469a2a36cdcb10d64b07e68c12cfbf"}},{"ruleId":"D1","level":"warning","message":{"text":"filterOperationSession.createFilterOperationSession.commit (cyclomatic 25): filterOperationSession.createFilterOperationSession.commit 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/filterOperationSession.ts"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f38477a280d6d55af73b5625fc6fb8d4fe45b5df01e5c01c8ea0f5dd9ac549e"}},{"ruleId":"D1","level":"warning","message":{"text":"widgetDnd.resolveWidgetDragEnd (cyclomatic 25): widgetDnd.resolveWidgetDragEnd has cyclomatic complexity 25 (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":"invokeai/frontend/webv2/src/workbench/widgetDnd.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"068dbc49c30bdb5caaf571a149ac515d57ab2b9ee6e399f73124fbcf7c1136b1"}},{"ruleId":"D1","level":"warning","message":{"text":"ClusterStrengthField.ClusterStrengthField (cyclomatic 25): ClusterStrengthField.ClusterStrengthField has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 10 of the 25 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 139, 67, 110, \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":"invokeai/frontend/webv2/src/workbench/widgets/image-map/ClusterStrengthField.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"25d265d91e357c91a00b2b43aa5620e410031defbae79bd821d8340225d947a3"}},{"ruleId":"D1","level":"warning","message":{"text":"ReferenceImageSettings.ReferenceImageEditor (cyclomatic 25): ReferenceImageSettings.ReferenceImageEditor has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 11 of the 25 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 278, 328, 291, \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/ReferenceImageSettings.tsx"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"dea6ef217b32e540733132cc2f9487865de900878d41df91af0a362574178f99"}},{"ruleId":"D1","level":"warning","message":{"text":"video_recall.resolve_video_recall_parameters (cyclomatic 24): video_recall.resolve_video_recall_parameters 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":"invokeai/app/api/routers/video_recall.py"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"28a93cf9a4fe9347bb8166d8f84809e2306b5fa0ef1b1a5e6abaff98af7ebf39"}},{"ruleId":"D1","level":"warning","message":{"text":"fields.InputField (cyclomatic 24): fields.InputField has cyclomatic complexity 24 (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. This is NOT this file\u0027s highest cyclomatic complexity: fields.migrate_model_ui_type (cyclomatic 27) 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":"invokeai/app/invocations/fields.py"},"region":{"startLine":916}}}],"partialFingerprints":{"codehealthFindingId/v1":"a30d52850e3c29a9bf623307d23886f61df6dbfa399d0b142ee42310ccc00954"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphExecutionState._coerce_execution_ref (cyclomatic 24): GraphExecutionState._coerce_execution_ref has cyclomatic complexity 24 (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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":2310}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9469aa84c223da831ff8b5207b0051fc7d0f17d81123152043749a8c91ae7c3"}},{"ruleId":"D1","level":"warning","message":{"text":"graph_if_dependencies._can_use_fresh_literal_if_iterate_collect (cyclomatic 24): graph_if_dependencies._can_use_fresh_literal_if_iterate_collect has cyclomatic complexity 24 (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":"invokeai/app/services/shared/graph_if_dependencies.py"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"b63e99553ea9d49832d3c58ca2a1b94bd4934b2626def11ef15415e2f79cce96"}},{"ruleId":"D1","level":"warning","message":{"text":"user_management._modify_user_interactive (cyclomatic 24): user_management._modify_user_interactive 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":"invokeai/app/util/user_management.py"},"region":{"startLine":449}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b99686e8a4df23e20ae67c264423baee89ed04bc2f881a95d1528b60c7811d2"}},{"ruleId":"D1","level":"warning","message":{"text":"promptAST.parseTokens::tryParseUnquotedPromptFunction (cyclomatic 24): promptAST.parseTokens::tryParseUnquotedPromptFunction 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. This shape REPEATS in the file: 2 other methods here (promptAST.parseTokens::tryParsePromptFunction, promptAST.parseTokens::parseGroup) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 3 times rather than 3 independent problems. Splitting this body alone leaves the other 2 exactly as they are. Where these are variations on one operation, the change that clears all 3 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":"invokeai/frontend/webv1/src/common/util/promptAST.ts"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"67648c14b5ead3df184f2c962a875d9ba148bc7cfb00083f6473fb2a1dba153c"}},{"ruleId":"D1","level":"warning","message":{"text":"Flow.Flow (cyclomatic 24): Flow.Flow has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 3 of the 24 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 284, 342, 111, \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c7e4702b4db90df3bfbcf046402b5d72b88c9b851fa2e35622dcf43ea6bddd8"}},{"ruleId":"D1","level":"warning","message":{"text":"addInpaint.addInpaint (cyclomatic 24): addInpaint.addInpaint 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"79d3ad4318e622d5c356ff7674be2f707620304a6fc63838d0f762f429de8374"}},{"ruleId":"D1","level":"warning","message":{"text":"buildKrea2Graph.buildKrea2Graph (cyclomatic 24): buildKrea2Graph.buildKrea2Graph has cyclomatic complexity 24 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 7 belong to 2 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f22b24236615c7d54a839f2a7bfec075df66741652f9233fb32e886e7d7ac5c"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsImageStorageMaintenance.SettingsImageStorageMaintenance (cyclomatic 24): SettingsImageStorageMaintenance.SettingsImageStorageMaintenance has cyclomatic complexity 24 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 12 belong to 5 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageStorageMaintenance.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"53ea90b1ff6bb0b6a0cd39535468885d9aabd65b4c3a9498f8512a2d1e92d8bf"}},{"ruleId":"D1","level":"warning","message":{"text":"galleryStateView.getGallerySelectedImageQuery (cyclomatic 24): galleryStateView.getGallerySelectedImageQuery has cyclomatic complexity 24 (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":"invokeai/frontend/webv2/src/features/gallery/ui/galleryStateView.ts"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5944cf685597cf00405c34700904bc2b5deaadc4767ba15e6ae230dcbffa748"}},{"ruleId":"D1","level":"warning","message":{"text":"PositivePromptActions.ExpandPromptButton (cyclomatic 24): PositivePromptActions.ExpandPromptButton has cyclomatic complexity 24 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 7 belong to 3 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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c7f686a41b5a9c90097367f00d4727ff66edf242609cb920929c0e20526faf9"}},{"ruleId":"D1","level":"warning","message":{"text":"PromptTextarea.PromptTextarea (cyclomatic 24): PromptTextarea.PromptTextarea has cyclomatic complexity 24 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 10 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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTextarea.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5e91e7368800633f41492d03125960b69ddb857ef882aadc99dfd7b6f7cf43f"}},{"ruleId":"D1","level":"warning","message":{"text":"settings.syncGenerateWidgetValuesWithModels (cyclomatic 24): settings.syncGenerateWidgetValuesWithModels has cyclomatic complexity 24 (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":"invokeai/frontend/webv2/src/features/generation/core/settings.ts"},"region":{"startLine":623}}}],"partialFingerprints":{"codehealthFindingId/v1":"c485997f271b6ca28077ea202c4ab636286f0cad5e0939f8c0f7fbdcfbb36454"}},{"ruleId":"D1","level":"warning","message":{"text":"dynamicPromptSyntax.scanDynamicPromptSyntax (cyclomatic 24): dynamicPromptSyntax.scanDynamicPromptSyntax has cyclomatic complexity 24 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 2 belong to 2 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":"invokeai/frontend/webv2/src/features/generation/core/prompt/dynamicPromptSyntax.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa38c92f5cb70937cd10ab8e17649857fb01c90c9d9a67d137011dc0b82d2c93"}},{"ruleId":"D1","level":"warning","message":{"text":"ExternalProviderKeyCards.ExternalProviderKeyCard (cyclomatic 24): ExternalProviderKeyCards.ExternalProviderKeyCard has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 10 of the 24 points are its own statements and the rest belongs to 6 function items inside it that branch (handleSave, a function literal at line 127, a function literal at line 186, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/credentials/ExternalProviderKeyCards.tsx"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"3451155e0ba0d06e572baa8dc016b29964721a640383eace39fbfb24536db51e"}},{"ruleId":"D1","level":"warning","message":{"text":"settings.sanitizeVideoReferences (cyclomatic 24): settings.sanitizeVideoReferences has cyclomatic complexity 24 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 3 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":"invokeai/frontend/webv2/src/features/video/core/settings.ts"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5af273ba0c8a1a84191a8f8dc917fba049c05cb5d69d929c1a87a34f5b14110"}},{"ruleId":"D1","level":"warning","message":{"text":"workflowJson.parseWorkflowJson (cyclomatic 24): workflowJson.parseWorkflowJson has cyclomatic complexity 24 (threshold 15). Of this number, 23 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":"invokeai/frontend/webv2/src/features/workflow/core/workflowJson.ts"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"83b36251d5473dc98723264294f8a4ac9f1ca0c7063c25b009ef3996bb1930f2"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphPreviewDialog.GraphPreviewDialog (cyclomatic 24): GraphPreviewDialog.GraphPreviewDialog has cyclomatic complexity 24 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 7 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":"invokeai/frontend/webv2/src/features/workflow/ui/graph-preview/GraphPreviewDialog.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"d72476dedd147e46b7d9d2ef5cb5fccc833ec1c29dd61bb81fdaf512db624d77"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowSelectionRequestRuntime.WorkflowSelectionRequestRuntime (cyclomatic 24): WorkflowSelectionRequestRuntime.WorkflowSelectionRequestRuntime has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 1 of the 24 points is its own statement and the rest belongs to 6 function items inside it that branch (a function literal at line 168, a function literal at line 146, getRequestTargets, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowSelectionRequestRuntime.tsx"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"f76ae90374b9a3e23a5bb527af074bca7192074ccc6680c501cf657f6d9b25a5"}},{"ruleId":"D1","level":"warning","message":{"text":"canvasProjectMutations.applyMoves (cyclomatic 24): canvasProjectMutations.applyMoves has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 10 of the 24 points are its own statements and the rest belongs to 7 function items inside it that branch (a function literal at line 342, survivingGroup, a function literal at line 367, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"36099a0672d2111e6fe03d73d5764d4adc2f8ae18081a77e6e77263c9c23bc2d"}},{"ruleId":"D1","level":"warning","message":{"text":"shortcutHints.getCanvasShortcutHints (cyclomatic 24): shortcutHints.getCanvasShortcutHints has cyclomatic complexity 24 (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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/shortcutHints.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"96d1affd0027debdff99c8a91081ce5f7fedda8b0caa45efd475026d134cfe44"}},{"ruleId":"D1","level":"warning","message":{"text":"ImageMapWidgetView.ImageMapWidgetView (cyclomatic 24): ImageMapWidgetView.ImageMapWidgetView 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":"invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapWidgetView.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebcd2d4101baaac2e4004ef6cde3260b3c7951777a333a79bbcf3f81000b7985"}},{"ruleId":"D1","level":"warning","message":{"text":"TransformEditingController.apply (cyclomatic 24): TransformEditingController.apply has cyclomatic complexity 24 (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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/transformEditingController.ts"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b3bd2f769a0d28efa84e7c605a61619d763179397165737181ae7e8d147aa9a"}},{"ruleId":"D1","level":"warning","message":{"text":"psdExport.planPsdExport (cyclomatic 24): psdExport.planPsdExport has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 11 of the 24 points are its own statements and the rest belongs to 2 function items inside it that branch (buildTree, walk). 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/export/psdExport.ts"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa24a538f7b600868a25032c0059590d2b2b75fb9d093e9b9f559d8b5a51c804"}},{"ruleId":"D1","level":"warning","message":{"text":"pointerPipeline.createPointerPipeline.onKeyDown (cyclomatic 24): pointerPipeline.createPointerPipeline.onKeyDown 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/input/pointerPipeline.ts"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c2268bdcc9424d8f02240f2a086229709517f7cbeacc429baae05a987b02a14"}},{"ruleId":"D1","level":"warning","message":{"text":"imageRecall.getRefinerRecall (cyclomatic 24): imageRecall.getRefinerRecall has cyclomatic complexity 24 (threshold 15). Of this number, 23 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. This is NOT this file\u0027s highest cyclomatic complexity: imageRecall.getImageRecallCapabilities (cyclomatic 34) 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":"invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts"},"region":{"startLine":781}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1b593c123887fccccba9b808cdb89f2cb7150172928b7c579c552cddc7b61bb"}},{"ruleId":"D1","level":"warning","message":{"text":"imageMapStore.refreshImageIndexStatus (cyclomatic 24): imageMapStore.refreshImageIndexStatus has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 2 of the 24 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 437, 496). 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":"invokeai/frontend/webv2/src/workbench/image-map/imageMapStore.ts"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d03f05db2366269c8238a04b17820c037ea07af9404acf58db896cc8c938397"}},{"ruleId":"D1","level":"warning","message":{"text":"exportProject.executeInvkExport (cyclomatic 24): exportProject.executeInvkExport has cyclomatic complexity 24 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 9 belong to 3 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":"invokeai/frontend/webv2/src/workbench/projects/invk/exportProject.ts"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"25cf7f87364b7681fd22d445bdcbe3e1725b758ce765bb182f4e4970f78bb71e"}},{"ruleId":"D1","level":"warning","message":{"text":"QueueCluster.QueueCluster (cyclomatic 24): QueueCluster.QueueCluster has cyclomatic complexity 24 (threshold 15). 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, 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":"invokeai/frontend/webv2/src/workbench/shell/topbar/QueueCluster.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"16863c9876fcc718b084dfbe59ebc793def77dfd850b641c0ea1d9a09bb327bb"}},{"ruleId":"D1","level":"warning","message":{"text":"Krea2LoRACollectionLoader.invoke (cyclomatic 23): Krea2LoRACollectionLoader.invoke 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":"invokeai/app/invocations/krea2/krea2_lora_loader.py"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"6156502614743e902fd35d3d6e1b03b66dc2f7d4893ec2d78662a2c1086d32f3"}},{"ruleId":"D1","level":"warning","message":{"text":"graph_loop_topology._recognize_nested_iterate_body (cyclomatic 23): graph_loop_topology._recognize_nested_iterate_body 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":"invokeai/app/services/shared/graph_loop_topology.py"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1d2a6f9f3575dc2a4503d11006efee5faf5c0e2e1260611300f2141dcc40ff8"}},{"ruleId":"D1","level":"warning","message":{"text":"quantized_loading.load_bnb4bit_state_dict (cyclomatic 23): quantized_loading.load_bnb4bit_state_dict 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":"invokeai/backend/ideogram4/quantized_loading.py"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4aa9eabbeba52570bcca8b1f260e7376ac5a625a777f826d2d517ea0425e122"}},{"ruleId":"D1","level":"warning","message":{"text":"flux2_state_dict_utils._convert_flux2_double_block_key (cyclomatic 23): flux2_state_dict_utils._convert_flux2_double_block_key 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":"invokeai/backend/model_manager/load/model_loaders/flux2_state_dict_utils.py"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"9763ca99bb74f0a716f4396a7af662dc2f82920bd24250752d2c6eaaf92379fd"}},{"ruleId":"D1","level":"warning","message":{"text":"Krea2CheckpointModel._load_from_singlefile (cyclomatic 23): Krea2CheckpointModel._load_from_singlefile 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":"invokeai/backend/model_manager/load/model_loaders/krea2.py"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a72dada76b2ca7b69b2bc7ab8bdc29ac6765daf462991bdf725dfa556d3ada7"}},{"ruleId":"D1","level":"warning","message":{"text":"model_util.calc_model_size_by_fs (cyclomatic 23): model_util.calc_model_size_by_fs 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":"invokeai/backend/model_manager/load/model_util.py"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8eb489e86f73d3f8deaed76e95fc8933b0e1b1261f5e93f7545621a47868c05"}},{"ruleId":"D1","level":"warning","message":{"text":"PidDistillModel.generate_samples_from_batch (cyclomatic 23): PidDistillModel.generate_samples_from_batch 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":"invokeai/backend/pid/_src/models/pid_distill_model.py"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"7461f6b84179fe7c1c0b6aaddf91c2750e1715af89095c28f5cfc1f9ebf69485"}},{"ruleId":"D1","level":"warning","message":{"text":"sage_attention._ineligible (cyclomatic 23): sage_attention._ineligible 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":"invokeai/backend/util/sage_attention.py"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc33f5f90ea1e474a98e588f46c25378c85bbcffc1dd3d15b676782db61d2405"}},{"ruleId":"D1","level":"warning","message":{"text":"promptAST.parseTokens::parseGroup (cyclomatic 23): promptAST.parseTokens::parseGroup 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. This shape REPEATS in the file: 2 other methods here (promptAST.parseTokens::tryParsePromptFunction, promptAST.parseTokens::tryParseUnquotedPromptFunction) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 3 times rather than 3 independent problems. Splitting this body alone leaves the other 2 exactly as they are. Where these are variations on one operation, the change that clears all 3 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":"invokeai/frontend/webv1/src/common/util/promptAST.ts"},"region":{"startLine":651}}}],"partialFingerprints":{"codehealthFindingId/v1":"9835a98268cfa60ef4ee2d782c344009c7b8cf3d99f80959877f032fd4a49640"}},{"ruleId":"D1","level":"warning","message":{"text":"ChangeBoardModal.ChangeBoardModal (cyclomatic 23): ChangeBoardModal.ChangeBoardModal 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 4 function literals inside it that branch (lines 87, 59, 182, \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":"invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"46a4fc0c3c1b3df0bd6c1e86c9694e6889d487fcb01b67e2f878866b4e8c1b5a"}},{"ruleId":"D1","level":"warning","message":{"text":"GalleryImageGrid.useKeyboardNavigation (cyclomatic 23): GalleryImageGrid.useKeyboardNavigation has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 1 of the 23 points is its own statement and the rest belongs to one function literal inside it that branches (line 144). 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":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b6b6d5b2591561008d92f5c4343685456f71429bb45d529d54929f62fbea9a2"}},{"ruleId":"D1","level":"warning","message":{"text":"LoRASelect.LoRASelect (cyclomatic 23): LoRASelect.LoRASelect 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 5 function literals inside it that branch (lines 33, 88, 29, \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":"invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"daf3847e7621b76aa069b3c8cdef9989f85b387c9d50676555cb64e7a4c9f053"}},{"ruleId":"D1","level":"warning","message":{"text":"buildAnimaGraph.buildAnimaGraph (cyclomatic 23): buildAnimaGraph.buildAnimaGraph has cyclomatic complexity 23 (threshold 15). Of this number, 22 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f08ef2b68fd0f5985173103f70960fd45345dbd6890e0121937334e92c68327"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelPicker.ModelPicker (cyclomatic 23): ModelPicker.ModelPicker has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 1 of the 23 points is its own statement and the rest belongs to 5 function literals inside it that branch (lines 202, 287, 211, \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":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"69443df63aed14cd0c8710eabba9c61dcbbeecd3ff881df5269a395a8c23cf36"}},{"ruleId":"D1","level":"warning","message":{"text":"QueueItemDetail.QueueItemComponent (cyclomatic 23): QueueItemDetail.QueueItemComponent has cyclomatic complexity 23 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 8 belong to 3 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":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueItemDetail.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"b438da6e062e5c997b517f797b6a8225444d2e5c31cef874ef91f48756c9de75"}},{"ruleId":"D1","level":"warning","message":{"text":"mock-backend.filterGalleryItems (cyclomatic 23): mock-backend.filterGalleryItems has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 1 of the 23 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 577, 616). 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":"invokeai/frontend/webv2/scripts/mock-backend.mjs"},"region":{"startLine":565}}}],"partialFingerprints":{"codehealthFindingId/v1":"5eb1c42a8887866198cfbbbb478e59aecd65f1d397c9469aabc7eb14309d4e0b"}},{"ruleId":"D1","level":"warning","message":{"text":"QueueRuntimeAdapter.QueueRuntimeAdapter (cyclomatic 23): QueueRuntimeAdapter.QueueRuntimeAdapter has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 1 of the 23 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 40, 163, 74, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/app/QueueRuntimeAdapter.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"2704edaa4009dbd9a2dd7b86f44559bcee5af4ebf6af6412f309cd650d87ef62"}},{"ruleId":"D1","level":"warning","message":{"text":"compileCanvasGraph.getCanvasValidationReasons (cyclomatic 23): compileCanvasGraph.getCanvasValidationReasons 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":"invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"d656a028bfd5ec0118df4ce81932ffd8cdac48e12e19fe734e62b2e4bd05f66e"}},{"ruleId":"D1","level":"warning","message":{"text":"UserFormDialog.UserForm (cyclomatic 23): UserFormDialog.UserForm has cyclomatic complexity 23 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 11 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":"invokeai/frontend/webv2/src/features/identity/ui/UserFormDialog.tsx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"822acbd12de2368f27cbd6aee6fb0f85aff4de77f9250b9425e7b2f86a67ac43"}},{"ruleId":"D1","level":"warning","message":{"text":"useCleanupDialog.useCleanupDialog.confirm (cyclomatic 23): useCleanupDialog.useCleanupDialog.confirm has cyclomatic complexity 23 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 9 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":"invokeai/frontend/webv2/src/features/intermediates/ui/useCleanupDialog.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"24757d0fc822037fa6d627484edcaa970c069b009d79c198a642b4f4200e1ee5"}},{"ruleId":"D1","level":"warning","message":{"text":"QueueItemRow.QueueItemRow (cyclomatic 23): QueueItemRow.QueueItemRow has cyclomatic complexity 23 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 4 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":"invokeai/frontend/webv2/src/features/queue/ui/QueueItemRow.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"0683ba1abd9dbe54117fef39809ea7e76de18d82eb5ca122fa8b77f48e1371ea"}},{"ruleId":"D1","level":"warning","message":{"text":"batch.readProperty (cyclomatic 23): batch.readProperty 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":"invokeai/frontend/webv2/src/features/workflow/core/batch.ts"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe93bd1ef4a6cecb832fbef74fa917223fcfdb2a5b0883e30393b73ce926bfdb"}},{"ruleId":"D1","level":"warning","message":{"text":"flowAdapters.toFlowNodes (cyclomatic 23): flowAdapters.toFlowNodes has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 1 of the 23 points is its own statement and the rest belongs to one function literal inside it that branches (line 211). 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/flowAdapters.ts"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dc6a97005c4a9c3e91e23f663b90682683305f886f0e0cf9564df51873e770f"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingControl.SettingControl (cyclomatic 23): SettingControl.SettingControl has cyclomatic complexity 23 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 4 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":"invokeai/frontend/webv2/src/platform/ui/settings/SettingControl.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"f58ae4ebd1c2209428d7327d102725b7df114e1c8fdc926b157959b54b518d25"}},{"ruleId":"D1","level":"warning","message":{"text":"invocation.resolveInvocationRouteInput (cyclomatic 23): invocation.resolveInvocationRouteInput 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":"invokeai/frontend/webv2/src/workbench/invocation.ts"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"c86bbf85f4033b347b39fec6718807ccace49463fc54d92047ac714ac794497c"}},{"ruleId":"D1","level":"warning","message":{"text":"TransformPane.ConnectedTransform (cyclomatic 23): TransformPane.ConnectedTransform has cyclomatic complexity 23 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 9 belong to 3 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/TransformPane.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"b50b1f03b954f348ae8ea7c8e0ad80a56629bc3b0d3ca3915ae82a759810c190"}},{"ruleId":"D1","level":"warning","message":{"text":"documentModel.createDocumentModel::checkReparent (cyclomatic 23): documentModel.createDocumentModel::checkReparent 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. This shape REPEATS in the file: one other method here (documentModel.createDocumentModel::prepareInsert) 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts"},"region":{"startLine":832}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f055beaaebc204ef63fd3bdf04320c67da0f223b1dc2243197762ad29b406f7"}},{"ruleId":"D1","level":"warning","message":{"text":"workbenchState.assembleWorkbenchProject (cyclomatic 23): workbenchState.assembleWorkbenchProject 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":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":1657}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdd042fcbdbab41cc8c4e4ec3c0b1e8f52063cf0077fde94082283ea5dc703c2"}},{"ruleId":"D1","level":"warning","message":{"text":"focusRegions.createWorkbenchFocusController.focusAdjacentRegion (cyclomatic 23): focusRegions.createWorkbenchFocusController.focusAdjacentRegion has cyclomatic complexity 23 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 8 belong to 3 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":"invokeai/frontend/webv2/src/workbench/focusRegions.tsx"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bba7330804e726a779fa8eea4ef52d22e6562a2c03c547f238944da78df87a5"}},{"ruleId":"D1","level":"warning","message":{"text":"VideoConcatInvocation._build_audio_track (cyclomatic 22): VideoConcatInvocation._build_audio_track 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":"invokeai/app/invocations/video_concat.py"},"region":{"startLine":699}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bf808e55fec70b4353f6762e17fca7edfb50062185fa19e444a6e5b81a27a58"}},{"ruleId":"D1","level":"warning","message":{"text":"ExternalGenerationService._validate_request (cyclomatic 22): ExternalGenerationService._validate_request 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":"invokeai/app/services/external_generation/external_generation_default.py"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1f27ed9977693b60533d2f7a970f91585821bb07f11247a39332991c0af356c"}},{"ruleId":"D1","level":"warning","message":{"text":"_ExecutionNodeBuilder._create_serial_nested_iterate_body_iteration (cyclomatic 22): _ExecutionNodeBuilder._create_serial_nested_iterate_body_iteration 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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":771}}}],"partialFingerprints":{"codehealthFindingId/v1":"b31b0c1d1de32e2420a1776782d62309dd66fb4e24b18f74e867fba46723eb2c"}},{"ruleId":"D1","level":"warning","message":{"text":"Graph._validate_type_dependents_after_edge (cyclomatic 22): Graph._validate_type_dependents_after_edge 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":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":792}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4188beab206fff52d37012613c87df96ea781c66de8fb194efd68a40abd81ca"}},{"ruleId":"D1","level":"warning","message":{"text":"sampling.build_ref2va_denoise_state (cyclomatic 22): sampling.build_ref2va_denoise_state 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":"invokeai/backend/minimax_h3/sampling.py"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf5e73ecb576a32e85b425b5cb91437bfa256b0de76793f4906c94abccada60d"}},{"ruleId":"D1","level":"warning","message":{"text":"ZImageDiffusersModel._load_sdnq_text_encoder (cyclomatic 22): ZImageDiffusersModel._load_sdnq_text_encoder 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":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f45d9c8dfe89c8c4bd7fda937c9a74905cb78a15c8ab6a029cb4a24d21ab957"}},{"ruleId":"D1","level":"warning","message":{"text":"nvfp4._find_nvfp4_layers (cyclomatic 22): nvfp4._find_nvfp4_layers has cyclomatic complexity 22 (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":"invokeai/backend/quantization/nvfp4.py"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"549284981a48f0c1327380d7f51f89fa375e29101184f0e889578e2415521858"}},{"ruleId":"D1","level":"warning","message":{"text":"calibrate_flux2_working_memory.report_vae (cyclomatic 22): calibrate_flux2_working_memory.report_vae 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":"scripts/calibrate_flux2_working_memory.py"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b80fa827be28dce56460590b9b34aa5ad1212fb279faefd7194edac0ad4847a"}},{"ruleId":"D1","level":"warning","message":{"text":"useImageUploadButton.useImageUploadButton (cyclomatic 22): useImageUploadButton.useImageUploadButton has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 3 of the 22 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 89, 140, 83, \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":"invokeai/frontend/webv1/src/common/hooks/useImageUploadButton.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f523140de1d96289b67de73a631291e493a3e4a53c7887963ecf4f56ba2ba5d"}},{"ruleId":"D1","level":"warning","message":{"text":"LoginPage.LoginPage (cyclomatic 22): LoginPage.LoginPage has cyclomatic complexity 22 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 9 belong to 3 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":"invokeai/frontend/webv1/src/features/auth/components/LoginPage.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8ffc22c61f4debd5f97a5a65f59cb3839d74eafa68253e4043d4a4f052eafa7"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowFormPreview.WorkflowFormPreview (cyclomatic 22): WorkflowFormPreview.WorkflowFormPreview has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 7 of the 22 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 112, 93, 102). 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"a201b2cd5f1e7f73afba21a7948a637d52522d931e4231aff29b59aeadd8345c"}},{"ruleId":"D1","level":"warning","message":{"text":"CanvasTextToolModule.commitSession (cyclomatic 22): CanvasTextToolModule.commitSession 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasTextToolModule.ts"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8a24986cc6d02f1b21e26966489aec66043242309a164cf1e9321f0f64a6a54"}},{"ruleId":"D1","level":"warning","message":{"text":"CanvasToolModule.syncCursorStyle (cyclomatic 22): CanvasToolModule.syncCursorStyle has cyclomatic complexity 22 (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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"f97227c9f08952a48626ddf33fa3734e32dbf3abc17e56fd53aafeec21b70b01"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelSettingsImportButton.ModelSettingsImportButton (cyclomatic 22): ModelSettingsImportButton.ModelSettingsImportButton has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 1 of the 22 points is its own statement and the rest belongs to 3 function literals inside it that branch (lines 23, 129, 122). 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelSettingsImportButton.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"6648bd98cadb4132f4e6d980af002d43e99531c1fc7dab1df89452b57b08f246"}},{"ruleId":"D1","level":"warning","message":{"text":"GenerateReferenceImagesSection.GenerateReferenceImagesContent (cyclomatic 22): GenerateReferenceImagesSection.GenerateReferenceImagesContent has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 8 of the 22 points are its own statements and the rest belongs to 8 function items inside it that branch (addGalleryImages, a function literal at line 188, a function literal at line 69, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/GenerateReferenceImagesSection.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"a397a43ddd26e6c54cf455b0f255c6d7d22f13199edc19a818f851649bc47534"}},{"ruleId":"D1","level":"warning","message":{"text":"PromptTemplateEditor.PromptTemplateEditor (cyclomatic 22): PromptTemplateEditor.PromptTemplateEditor has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 8 of the 22 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 103, 81, 216, \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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplateEditor.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"a47f04c71bcd6acddc312ddb35255d513318781434fa6a92e44743e3023a6d75"}},{"ruleId":"D1","level":"warning","message":{"text":"videoPolicies.getVideoComponentSectionPolicy (cyclomatic 22): videoPolicies.getVideoComponentSectionPolicy has cyclomatic complexity 22 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 8 belong to 7 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":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":1508}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e80e1d19d54a62a6da948b3b4ae6fa1d138bd360366e1f7959bf5cda410ca45"}},{"ruleId":"D1","level":"warning","message":{"text":"batch.resolveWorkflowGeneratorValue (cyclomatic 22): batch.resolveWorkflowGeneratorValue 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":"invokeai/frontend/webv2/src/features/workflow/core/batch.ts"},"region":{"startLine":555}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bc7fb62a3fdfe3d05c922adfa65707d4692a95c6fe6b1c4e35f22964e027b1e"}},{"ruleId":"D1","level":"warning","message":{"text":"layerWorkflow.buildLayerWorkflowGraph (cyclomatic 22): layerWorkflow.buildLayerWorkflowGraph has cyclomatic complexity 22 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/layerWorkflow.ts"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cf669beb8ef1e4de18082dd13bd504108d7a964cfd70daa146f2665d10f2f2a"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowFieldInput.useMediaUpload.onFileChange (cyclomatic 22): WorkflowFieldInput.useMediaUpload.onFileChange has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 6 of the 22 points are its own statements and the rest belongs to one function literal inside it that branches (line 629). 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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":604}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd7c4a4b24cb5b3f85a712b2cf91bb774ca952367af7433a55345c4b93bfe950"}},{"ruleId":"D1","level":"warning","message":{"text":"PreviewFilmstrip.FilmstripLiveThumb (cyclomatic 22): PreviewFilmstrip.FilmstripLiveThumb has cyclomatic complexity 22 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 6 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFilmstrip.tsx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c21d154414599b13267f405b05b2c0c2972638bf2aa1ad169df6c9fbd9bb486"}},{"ruleId":"D1","level":"warning","message":{"text":"workbenchState.removeGalleryItemsFromAllProjects (cyclomatic 22): workbenchState.removeGalleryItemsFromAllProjects has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 3 of the 22 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 3020, 3058, 3005, \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":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":2996}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1d8918cad57ab1b80960ba8774a93752d13703038b669b7a48d527d93d10e68"}},{"ruleId":"D1","level":"warning","message":{"text":"PixelEditController.begin (cyclomatic 22): PixelEditController.begin has cyclomatic complexity 22 (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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/controlPixelController.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"da6267b8e08a2112e4ab28434ce77235798447561a9560793231bad2f76db1d0"}},{"ruleId":"D1","level":"warning","message":{"text":"StructuralLayerController.beginPreview (cyclomatic 22): StructuralLayerController.beginPreview has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 2 of the 22 points are its own statements and the rest belongs to 7 function items inside it that branch (a function literal at line 225, a function literal at line 257, flushPending, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/structuralLayerController.ts"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bc830ba4815c8d37bfdb37f4e0fa107ae42cf9ce136e0f7565fdace41aab7cb"}},{"ruleId":"D1","level":"warning","message":{"text":"fontLoader.createFontLoader.track (cyclomatic 22): fontLoader.createFontLoader.track has cyclomatic complexity 22 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 10 belong to 3 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/fontLoader.ts"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ec1778c449fdd23fcf3770a269d48217295987c4b557b8b46169f5b0282c669"}},{"ruleId":"D1","level":"warning","message":{"text":"imageRecall.getMetadataModelTuning (cyclomatic 22): imageRecall.getMetadataModelTuning has cyclomatic complexity 22 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 3 belong to one function item 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. This is NOT this file\u0027s highest cyclomatic complexity: imageRecall.getImageRecallCapabilities (cyclomatic 34) 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":"invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"691c7c8d970d4ef4c18f66f1b170ad22dcc64f76ca6692a4c24e58ebd41bceff"}},{"ruleId":"D1","level":"warning","message":{"text":"ImageContextMenu.SingleItemMenuItems (cyclomatic 22): ImageContextMenu.SingleItemMenuItems has cyclomatic complexity 22 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 6 belong to 6 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":"invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f954a5d563ddba3bca0e95304e697d12a5a32ea4e39c8fa77151ed2958e5dd9"}},{"ruleId":"D1","level":"warning","message":{"text":"videoRecallRuntime.createVideoRecallRuntime::apply (cyclomatic 22): videoRecallRuntime.createVideoRecallRuntime::apply 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":"invokeai/frontend/webv2/src/workbench/image-actions/videoRecallRuntime.ts"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"e08b44446b58d7bbd40740fbd9909586b5170ba8b4d25d08a9ffcbf7cf723aac"}},{"ruleId":"D1","level":"warning","message":{"text":"CommandPaletteDialog.CommandPaletteContent (cyclomatic 22): CommandPaletteDialog.CommandPaletteContent has cyclomatic complexity 22 (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":"invokeai/frontend/webv2/src/workbench/palette/CommandPaletteDialog.tsx"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"b551c5be8ad572ced6eca9f3799e59a60733b19a403244abaefadbf1c079d4a8"}},{"ruleId":"D1","level":"warning","message":{"text":"queueRunJournal.createIndexedDbQueueRunJournal.record (cyclomatic 22): queueRunJournal.createIndexedDbQueueRunJournal.record has cyclomatic complexity 22 (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":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRunJournal.ts"},"region":{"startLine":381}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f10f51becd76a2ac1e4d58c8da554f48d924843946ef1f41a5502d9c06a05dc"}},{"ruleId":"D1","level":"warning","message":{"text":"AdjustmentSettings.CurvesEditor (cyclomatic 22): AdjustmentSettings.CurvesEditor has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 1 of the 22 points is its own statement and the rest belongs to 8 function literals inside it that branch (lines 552, 526, 582, \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/AdjustmentSettings.tsx"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"79946d9994228bcfeec0decf34a0e17433a4a96d2365df875ec26247785fdf1d"}},{"ruleId":"D1","level":"warning","message":{"text":"MiniMaxH3ReferenceConditioningInvocation.invoke (cyclomatic 21): MiniMaxH3ReferenceConditioningInvocation.invoke 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":"invokeai/app/invocations/minimax_h3/minimax_h3_reference.py"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a771026623821dc85fff5a1ceeb6070ca211acddd42ed69a56148f09a0b5b66"}},{"ruleId":"D1","level":"warning","message":{"text":"ExecutionPlan.from_snapshot (cyclomatic 21): ExecutionPlan.from_snapshot 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":"invokeai/app/services/shared/execution_engine/scheduler.py"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ee19bd2f21fb499d0e16e1a3445bf11758712a0663b90b2a01e929eaf6ba61f"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphExecutionState._record_continuation_effects (cyclomatic 21): GraphExecutionState._record_continuation_effects 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1841}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe4feacb3d857f5e23b99990111847e9d5439dc9ef4a405edf11b4cb11cfbb3c"}},{"ruleId":"D1","level":"warning","message":{"text":"graph_if_runtime._get_effective_iteration_paths_for_edge (cyclomatic 21): graph_if_runtime._get_effective_iteration_paths_for_edge 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":"invokeai/app/services/shared/graph_if_runtime.py"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"61e0087066d098d23b748f59db58bb60a8e223bb047d030b5b433bcea8161a76"}},{"ruleId":"D1","level":"warning","message":{"text":"denoise.denoise (cyclomatic 21): denoise.denoise 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":"invokeai/backend/ltx2/denoise.py"},"region":{"startLine":621}}}],"partialFingerprints":{"codehealthFindingId/v1":"187b2f49fb2820dc62b15c44f3b064d7c15d63aae75f27522a5f80f75b042192"}},{"ruleId":"D1","level":"warning","message":{"text":"TextLLMPipeline.run (cyclomatic 21): TextLLMPipeline.run 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":"invokeai/backend/text_llm_pipeline.py"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ad64aa6276840a53296bb1d368356b0914c99b519360437bbeaa3a1ec467d9a"}},{"ruleId":"D1","level":"warning","message":{"text":"addArchivedOrDeletedBoardListener.addArchivedOrDeletedBoardListener (cyclomatic 21): addArchivedOrDeletedBoardListener.addArchivedOrDeletedBoardListener has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 1 of the 21 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 64, 26, 47, \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":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/addArchivedOrDeletedBoardListener.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"f250769069a0c4e8756eae2dc140d601017990f02228c46ebcf334a732d371a2"}},{"ruleId":"D1","level":"warning","message":{"text":"Picker.useKeyboardNavigation (cyclomatic 21): Picker.useKeyboardNavigation has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 1 of the 21 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 407, 438, 470, \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":"invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"f84d75a879a2e717e62a18a76a1a61f8390c0fee24ee485216303744d15613b5"}},{"ruleId":"D1","level":"warning","message":{"text":"RasterLayerCurvesAdjustmentsGraph.RasterLayerCurvesAdjustmentsGraph (cyclomatic 21): RasterLayerCurvesAdjustmentsGraph.RasterLayerCurvesAdjustmentsGraph has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 1 of the 21 points is its own statement and the rest belongs to 9 function literals inside it that branch (lines 260, 306, 369, \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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"58a02331a62690f2b721449e28e57469898982899161272bc43910590374eb47"}},{"ruleId":"D1","level":"warning","message":{"text":"needsPixelBbox.objectStateNeedsPixelBbox (cyclomatic 21): needsPixelBbox.objectStateNeedsPixelBbox has cyclomatic complexity 21 (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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/needsPixelBbox.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c7365802d0406c7e1ff5e7821673398765c84a10561d678d37c54f4fac1cb9a"}},{"ruleId":"D1","level":"warning","message":{"text":"PromptTriggerSelect.PromptTriggerSelect (cyclomatic 21): PromptTriggerSelect.PromptTriggerSelect has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 1 of the 21 points is its own statement and the rest belongs to 8 function literals inside it that branch (lines 67, 100, 140, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/PromptTriggerSelect.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"234f11cf5c4ed748299a4433cbf94f97ba0d07e6aa672a70246d1c1609288179"}},{"ruleId":"D1","level":"warning","message":{"text":"tsSourceAnalysis.collectTypographyLiterals::collectValue (cyclomatic 21): tsSourceAnalysis.collectTypographyLiterals::collectValue 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":"invokeai/frontend/webv2/src/architecture/tsSourceAnalysis.ts"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6d88956fdef181a424115a8e549e77c349b270fb20d554099fdb3377cf6da7f"}},{"ruleId":"D1","level":"warning","message":{"text":"settings.normalizeReferenceImageConfig (cyclomatic 21): settings.normalizeReferenceImageConfig 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":"invokeai/frontend/webv2/src/features/generation/core/settings.ts"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac256311d7621c79123037278a89e49b43c522ef188f298c5d7632293c10fafb"}},{"ruleId":"D1","level":"warning","message":{"text":"graph.buildFlux2Graph (cyclomatic 21): graph.buildFlux2Graph 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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":745}}}],"partialFingerprints":{"codehealthFindingId/v1":"bce78d4a9672286ba2498f18c724db89cea2d1b5d8a5a61f9693186a00ec5a16"}},{"ruleId":"D1","level":"warning","message":{"text":"GenerateRenderSection.GenerateRenderSection::renderFields (cyclomatic 21): GenerateRenderSection.GenerateRenderSection::renderFields 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":"invokeai/frontend/webv2/src/features/generation/ui/GenerateRenderSection.tsx"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"101d8240d02e483b1e9b1fdbb36793f90bf925aa46c8fe3a2ad84cd808ade602"}},{"ruleId":"D1","level":"warning","message":{"text":"WildcardsPanel.WildcardsPanel (cyclomatic 21): WildcardsPanel.WildcardsPanel has cyclomatic complexity 21 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 6 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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardsPanel.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7064cd8696cd23648c937012701d14a3db97fb2542258248962f04bfc704df9"}},{"ruleId":"D1","level":"warning","message":{"text":"connectors.resolveLoopLinkagePath (cyclomatic 21): connectors.resolveLoopLinkagePath has cyclomatic complexity 21 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/connectors.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e90086f6483da945ff0a7f86ef6c86a1a5dae9c52651e7c23f3aa81eb26ca17"}},{"ruleId":"D1","level":"warning","message":{"text":"fields.getWorkflowFieldInvalidReason (cyclomatic 21): fields.getWorkflowFieldInvalidReason 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":"invokeai/frontend/webv2/src/features/workflow/core/fields.ts"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"95982956b9a8b171a3f22dd2c55e71c00d6d5086744343c90778214e8f486f5f"}},{"ruleId":"D1","level":"warning","message":{"text":"modelRequirements.extractWorkflowModelRequirements (cyclomatic 21): modelRequirements.extractWorkflowModelRequirements has cyclomatic complexity 21 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 6 belong to one function item 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":"invokeai/frontend/webv2/src/features/workflow/core/modelRequirements.ts"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe29c57b0757099c372775eeb1141be2e02897268443e1f60592ddde010ec279"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowFieldInput.MediaInput (cyclomatic 21): WorkflowFieldInput.MediaInput has cyclomatic complexity 21 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":964}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c65b5e9288454917d4e0f786357187ead0d2ffd487c84d1d55b511b2099ad2e"}},{"ruleId":"D1","level":"warning","message":{"text":"ColorPicker.ColorPicker (cyclomatic 21): ColorPicker.ColorPicker has cyclomatic complexity 21 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 6 belong to 4 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":"invokeai/frontend/webv2/src/platform/ui/ColorPicker.tsx"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1d0cae67f018fdd4ffdf24c50212ec25356d2713157be7b20a37d35bf1c6a5a"}},{"ruleId":"D1","level":"warning","message":{"text":"indexedDbDraftStore.createIndexedDbProjectDraftStore.readRetargetedCopy (cyclomatic 21): indexedDbDraftStore.createIndexedDbProjectDraftStore.readRetargetedCopy has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 1 of the 21 points is its own statement and the rest belongs to one function literal inside it that branches (line 200). 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"e559de406f89599f47990c54cd74a39541ff07b838620f1b387b6b5ff63e2cb2"}},{"ruleId":"D1","level":"warning","message":{"text":"indexedDbDraftStore.createIndexedDbProjectDraftStore.adopt (cyclomatic 21): indexedDbDraftStore.createIndexedDbProjectDraftStore.adopt 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 one function literal inside it that branches (line 370). 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"dea75d1da5df2028b61586d1fc5ec1363800f08d3b13984d07638f0e84570f00"}},{"ruleId":"D1","level":"warning","message":{"text":"projectHalves.joinProjectDocument (cyclomatic 21): projectHalves.joinProjectDocument has cyclomatic complexity 21 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 5 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/projectHalves.ts"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"e01c8553f08c48ca9fe4d03f596238f5d47f33e68727365f4a8683a57cea69a7"}},{"ruleId":"D1","level":"warning","message":{"text":"ColorPane.ColorPane (cyclomatic 21): ColorPane.ColorPane has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 8 of the 21 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 54, 127, 89, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/ColorPane.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"2eece1820735fd7336506e8e05a2540dcc5e84c54a652ad21a7434ed9ad07dc1"}},{"ruleId":"D1","level":"warning","message":{"text":"workbenchState.isWidgetRegionState (cyclomatic 21): workbenchState.isWidgetRegionState has cyclomatic complexity 21 (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. This is NOT this file\u0027s highest cyclomatic complexity: workbenchState.isLayoutPresetSnapshot (cyclomatic 22) 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":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":2153}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd99582fb4df249bc59b0805cc472569bec8382f3877a86754b7a2a03859e6db"}},{"ruleId":"D1","level":"warning","message":{"text":"workbenchStore.recordDiagnosticForAction (cyclomatic 21): workbenchStore.recordDiagnosticForAction 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":"invokeai/frontend/webv2/src/workbench/workbenchStore.ts"},"region":{"startLine":744}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bf7bfbc46bb9178466402018208e8429aa22c39a5f3dc20258dd0e7fafc40ce"}},{"ruleId":"D1","level":"warning","message":{"text":"PixelEditController.beginMaterialized (cyclomatic 21): PixelEditController.beginMaterialized has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 10 of the 21 points are its own statements and the rest belongs to 4 function items inside it that branch (commit, a function literal at line 407, a function literal at line 431, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/controlPixelController.ts"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f542f61a3f6a6ca99efa770b47d758a95d5d46febbea73e0be33985806bd811"}},{"ruleId":"D1","level":"warning","message":{"text":"selectObjectBridge.createSelectObjectBridge (cyclomatic 21): selectObjectBridge.createSelectObjectBridge has cyclomatic complexity 21 (threshold 15). 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 73, 39, 38). 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/selectObjectBridge.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"6696da97c30ed27edc9d058635c76c87a7a7267e0441f0422f5eb5111e213cb6"}},{"ruleId":"D1","level":"warning","message":{"text":"selectionState.createSelectionState.commit (cyclomatic 21): selectionState.createSelectionState.commit 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionState.ts"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0be7cb737e4844339b60f0244d4afab753f47304e93c1a9538b2befefafa1b7"}},{"ruleId":"D1","level":"warning","message":{"text":"SelectObjectCoordinator.createSelectObjectOperationCoordinator.save (cyclomatic 21): SelectObjectCoordinator.createSelectObjectOperationCoordinator.save 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/SelectObjectCoordinator.ts"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"266fc3d0d4f6dcf136d272aa532a8e343b583d03bd90effef5933c05a7542eb3"}},{"ruleId":"D1","level":"warning","message":{"text":"firstPartyCommands.useRegisterFirstPartyCommands (cyclomatic 21): firstPartyCommands.useRegisterFirstPartyCommands has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 1 of the 21 points is its own statement and the rest belongs to 9 function items inside it that branch (a function literal at line 238, recallSelectedImage, loadSelectedItemWorkflow, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/hotkeys/firstPartyCommands.ts"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"f36c75f125b5b17f64e24325df47918e8fefd6b36d6c9c900ee3e8298d16e3f4"}},{"ruleId":"D1","level":"warning","message":{"text":"executeImageRecall.executeLoadMediaWorkflow (cyclomatic 21): executeImageRecall.executeLoadMediaWorkflow 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":"invokeai/frontend/webv2/src/workbench/image-actions/executeImageRecall.ts"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e263f47588212a76382c7f66ac4bb0188f726d4ff7132d392cb7fdebf52bd65"}},{"ruleId":"D1","level":"warning","message":{"text":"GenerationDevicesSettings.GenerationDevicesSettings (cyclomatic 21): GenerationDevicesSettings.GenerationDevicesSettings has cyclomatic complexity 21 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 7 belong to 5 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":"invokeai/frontend/webv2/src/workbench/settings/GenerationDevicesSettings.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5f453ed3093120accd2b743390ffde890ec74375bcc34217157fed8c9b3f462"}},{"ruleId":"D1","level":"warning","message":{"text":"LayoutPresetStrip.PresetTab (cyclomatic 21): LayoutPresetStrip.PresetTab has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 8 of the 21 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 390, 367, 333, \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":"invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetStrip.tsx"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3afd8059b29e90f0a01a69ad19ce14af74ab2a32be4cd33021ac765539c21fd"}},{"ruleId":"D1","level":"warning","message":{"text":"session_queue.strip_missing_image_results (cyclomatic 20): session_queue.strip_missing_image_results 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":"invokeai/app/api/routers/session_queue.py"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"d806e26e87de7f64e767186484b0c969c8008c60a518e08c5bc814ccbb6a2e6c"}},{"ruleId":"D1","level":"warning","message":{"text":"baseinvocation.validate_fields (cyclomatic 20): baseinvocation.validate_fields 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":"invokeai/app/invocations/baseinvocation.py"},"region":{"startLine":573}}}],"partialFingerprints":{"codehealthFindingId/v1":"89345d899897536cc0ee98918ec2452756cc892327aeee4beb96f4bea9e190a2"}},{"ruleId":"D1","level":"warning","message":{"text":"InvokeImageBlendInvocation.prepare_tensors_from_images (cyclomatic 20): InvokeImageBlendInvocation.prepare_tensors_from_images 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":"invokeai/app/invocations/composition-nodes.py"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"132ae4b87b6296a2a81bd79afd24beea263f3fb24559f55b04cc9e1b71433bd2"}},{"ruleId":"D1","level":"warning","message":{"text":"WanLatentsToVideoInvocation.invoke (cyclomatic 20): WanLatentsToVideoInvocation.invoke 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":"invokeai/app/invocations/vae/wan_latents_to_video.py"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"71d31768a6dcdad389b3276dffa306f4c46f238ac53574b0fbfcdc94592c8a2a"}},{"ruleId":"D1","level":"warning","message":{"text":"ImageIndexService._worker_loop (cyclomatic 20): ImageIndexService._worker_loop 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":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1125}}}],"partialFingerprints":{"codehealthFindingId/v1":"a65bc1d673a94db430e426c01453cda0d40c0d5b24cadb3262abcda106485b87"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelInstallService._install_next_item (cyclomatic 20): ModelInstallService._install_next_item 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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":1667}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d1b82216d64d493fe860545a69d24ecb9dfc8bc7a0b807b91eba4ed9c10abe5"}},{"ruleId":"D1","level":"warning","message":{"text":"DefaultSessionRunner.run_node (cyclomatic 20): DefaultSessionRunner.run_node 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":"invokeai/app/services/session_processor/session_processor_default.py"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fefa3c28fddf62557b122acfbdc80eb1eea187f73394692b4ef92b527d29603"}},{"ruleId":"D1","level":"warning","message":{"text":"workflow_call_batch.build_batch_child_workflow_session_results (cyclomatic 20): workflow_call_batch.build_batch_child_workflow_session_results 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":"invokeai/app/services/session_processor/workflow_call_batch.py"},"region":{"startLine":517}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c6b7f62fd2dd2699f13f1c149b9589d44de9a5d1128a578a08399b1b9714ce8"}},{"ruleId":"D1","level":"warning","message":{"text":"_ExecutionNodeBuilder._materialize_root_if_for_completed_collect_branch (cyclomatic 20): _ExecutionNodeBuilder._materialize_root_if_for_completed_collect_branch 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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":2247}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c4968fa9b834b66b658710b4b8f58eb4b7e2e76be309f45441fc7f151bcf85a"}},{"ruleId":"D1","level":"warning","message":{"text":"graph_scheduler._prepare_deferred_nested_for_body (cyclomatic 20): graph_scheduler._prepare_deferred_nested_for_body 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":"invokeai/app/services/shared/graph_scheduler.py"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"884ce9b7a31f6aa184755f7b9e8d2d1e76398353b795ecf6c69b400cca2ea86a"}},{"ruleId":"D1","level":"warning","message":{"text":"aac_splice.splice_soundtrack (cyclomatic 20): aac_splice.splice_soundtrack 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":"invokeai/app/util/aac_splice.py"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"58b874cf52cf0cad3bb3c60820d1042bf42a8f0ada0ed90bb86c132b089cc3c5"}},{"ruleId":"D1","level":"warning","message":{"text":"Main_Diffusers_LTX2_Config.from_model_on_disk (cyclomatic 20): Main_Diffusers_LTX2_Config.from_model_on_disk 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":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":1960}}}],"partialFingerprints":{"codehealthFindingId/v1":"c97ec464668d10c4c4a54fcba1fcc0b3121da97c538fd009ef7edbdd165300fa"}},{"ruleId":"D1","level":"warning","message":{"text":"ZImageControlTransformer2DModel.forward (cyclomatic 20): ZImageControlTransformer2DModel.forward has cyclomatic complexity 20 (threshold 15). This file\u0027s own header attributes it to another copyright holder, so it is code this repository carries rather than code it wrote: restructuring the body in place forks it from upstream and turns every future re-sync into a manual merge. The performable moves are to leave the body as close to its upstream form as possible and keep it behind a narrow interface of your own, and to re-sync it when upstream changes \u2014 or, if it has already diverged far enough that you maintain it here, adopt it deliberately and then split the body into named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_transformer.py"},"region":{"startLine":451}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3919ff6d61ce218be3c1d9d5dd22a67cf5f15ebe89e8748166ab7d795798f14"}},{"ruleId":"D1","level":"warning","message":{"text":"RefImageImage.RefImageImage (cyclomatic 20): RefImageImage.RefImageImage has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 7 of the 20 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 82, 59, 106, \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":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"34382967556be9e43dba90998ae80db838cc54f5987ba799e1327f68658fd426"}},{"ruleId":"D1","level":"warning","message":{"text":"MainModelDefaultSettings.MainModelDefaultSettings (cyclomatic 20): MainModelDefaultSettings.MainModelDefaultSettings has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 8 of the 20 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 84, 115). 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"5caf2e123424d9551fb0fb6d5a0828e819aa98be121a0d1b190c01a57b94a72f"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsGenerationDevices.SettingsGenerationDevices (cyclomatic 20): SettingsGenerationDevices.SettingsGenerationDevices has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 6 of the 20 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 79, 114, 128, \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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsGenerationDevices.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2da80be70ecf97d6a98433711b9f34ac5577f61061b331f300499595daf4565"}},{"ruleId":"D1","level":"warning","message":{"text":"tsSourceAnalysis.collectPublicExports (cyclomatic 20): tsSourceAnalysis.collectPublicExports 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":"invokeai/frontend/webv2/src/architecture/tsSourceAnalysis.ts"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"913422ffe702bb28a325a88bdf63da49ac3b2c52c6970f299cca74cfc727bb4c"}},{"ruleId":"D1","level":"warning","message":{"text":"galleryStateView.getGalleryStateView (cyclomatic 20): galleryStateView.getGalleryStateView has cyclomatic complexity 20 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/galleryStateView.ts"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"e37dbce41134388f5793e7a61cbe3bdbbbc483b8bce353ff3d2f1f31b24f97e1"}},{"ruleId":"D1","level":"warning","message":{"text":"useGalleryGridSelection.useGalleryGridSelection.selectItemRange (cyclomatic 20): useGalleryGridSelection.useGalleryGridSelection.selectItemRange has cyclomatic complexity 20 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 8 belong to 4 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":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryGridSelection.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1e18c82afa2d0610b94a3ac9a9535d20d72a197e17ed61d92083423dbce01b6"}},{"ruleId":"D1","level":"warning","message":{"text":"addRegionalGuidance.addRegionalGuidance (cyclomatic 20): addRegionalGuidance.addRegionalGuidance 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":"invokeai/frontend/webv2/src/features/generation/core/canvas/addRegionalGuidance.ts"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"1765f537138a49c89f2f789870e91c96cc15eab132a43fdbbf4298e54c9ca7ac"}},{"ruleId":"D1","level":"warning","message":{"text":"baseGenerationPolicies.getBaseComponentSectionPolicy (cyclomatic 20): baseGenerationPolicies.getBaseComponentSectionPolicy has cyclomatic complexity 20 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. 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":"invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts"},"region":{"startLine":915}}}],"partialFingerprints":{"codehealthFindingId/v1":"c24dcb893ca8474980b27c416771b4efb12214055d7f9968767f1dc73cbb8c1b"}},{"ruleId":"D1","level":"warning","message":{"text":"ConditioningRebalanceBars.ConditioningRebalanceBars (cyclomatic 20): ConditioningRebalanceBars.ConditioningRebalanceBars has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 1 of the 20 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 162, 219, 115, \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":"invokeai/frontend/webv2/src/features/generation/ui/shared/ConditioningRebalanceBars.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"f166e325d535ed95bb9aa4b534fbc172dd83559776b7a37c5f0cf6401f12be10"}},{"ruleId":"D1","level":"warning","message":{"text":"GenerateConditioningRebalanceField.GenerateConditioningRebalanceField (cyclomatic 20): GenerateConditioningRebalanceField.GenerateConditioningRebalanceField has cyclomatic complexity 20 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 7 belong to 7 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":"invokeai/frontend/webv2/src/features/generation/ui/GenerateConditioningRebalanceField.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3633247e77ef3a50d67011b13e0e3247206f9c242ec0a9df0515c5ae1a81ad9"}},{"ruleId":"D1","level":"warning","message":{"text":"InstallProgressCell.useInstallProgressCaption (cyclomatic 20): InstallProgressCell.useInstallProgressCaption has cyclomatic complexity 20 (threshold 15). Of this number, 19 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":"invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallProgressCell.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd3b4c41f0664667e85e65bd57a2e79068cefdbf96528abc4c03cfaab51986a1"}},{"ruleId":"D1","level":"warning","message":{"text":"runtime.createQueueRuntime.handleItemsRetried (cyclomatic 20): runtime.createQueueRuntime.handleItemsRetried has cyclomatic complexity 20 (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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":1552}}}],"partialFingerprints":{"codehealthFindingId/v1":"c728782d48accd9227af9a9fab9ca79d912850f1ab311c177603a757dc016cb4"}},{"ruleId":"D1","level":"warning","message":{"text":"formFieldSettings.applyNodeFieldFormSettings (cyclomatic 20): formFieldSettings.applyNodeFieldFormSettings has cyclomatic complexity 20 (threshold 15). 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, 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":"invokeai/frontend/webv2/src/features/workflow/core/formFieldSettings.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"11d6570791185c0f313aa3f6f8f58849e141e7140281058ffde041124ba677a1"}},{"ruleId":"D1","level":"warning","message":{"text":"normalize.serializeErrorAtDepth (cyclomatic 20): normalize.serializeErrorAtDepth 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":"invokeai/frontend/webv2/src/platform/logging/normalize.ts"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"e06a9b7ebe4e03180e19f626d84b09092abc510cce77d071a54d003c4fccc49b"}},{"ruleId":"D1","level":"warning","message":{"text":"durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject::pushHalves (cyclomatic 20): durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject::pushHalves 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. This shape REPEATS in the file: 4 other methods here (durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::stageProject, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject::reconcile, \u2026) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 5 times rather than 5 independent problems. Splitting this body alone leaves the other 4 exactly as they are. Where these are variations on one operation, the change that clears all 5 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":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":1431}}}],"partialFingerprints":{"codehealthFindingId/v1":"036b7b27f721f70a57dfb58c4ae4c6cfea42eca9ac9f11dd99fc4dab35449fa6"}},{"ruleId":"D1","level":"warning","message":{"text":"canvasProjectMutations.applyLayerStackMutation (cyclomatic 20): canvasProjectMutations.applyLayerStackMutation has cyclomatic complexity 20 (threshold 15). Of this number, 19 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":"invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b1d4a6722a0605d0a27e2e707dd2359d67ae0ffd1c212bd74302b20d33d6f88"}},{"ruleId":"D1","level":"warning","message":{"text":"workbenchState.compileInvocationSnapshot (cyclomatic 20): workbenchState.compileInvocationSnapshot 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. This is NOT this file\u0027s highest cyclomatic complexity: workbenchState.isLayoutPresetSnapshot (cyclomatic 22) 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":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":2705}}}],"partialFingerprints":{"codehealthFindingId/v1":"34f8ea3b2f8a94c046b3f039afd5e56c2f8e4f380fb479683b13fd0bf62d98aa"}},{"ruleId":"D1","level":"warning","message":{"text":"FilterOperationCoordinator.createFilterOperationCoordinator.start (cyclomatic 20): FilterOperationCoordinator.createFilterOperationCoordinator.start has cyclomatic complexity 20 (threshold 15). Of this number, 19 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/FilterOperationCoordinator.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"62e28cd203ef26667e9d369a96c23e0215ad09d52b1223f38f3414693c455a91"}},{"ruleId":"D1","level":"warning","message":{"text":"DiagnosticsPanel.DiagnosticsPanel (cyclomatic 20): DiagnosticsPanel.DiagnosticsPanel has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 9 of the 20 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 153, 186, 162, \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":"invokeai/frontend/webv2/src/workbench/diagnostics/DiagnosticsPanel.tsx"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"2adb6edaaa0059d7282d57afaabbe1b56a04b2a1770ca0043311505ef30c012b"}},{"ruleId":"D1","level":"warning","message":{"text":"unloadJournal.scenarios.createUnloadJournalServer (cyclomatic 20): unloadJournal.scenarios.createUnloadJournalServer has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 1 of the 20 points is its own statement and the rest belongs to 6 function items inside it that branch (a function literal at line 124, a function literal at line 50, a function literal at line 97, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"a500774964d003b7ac9911b23d1050c6ca0571c7de27ff49065720d2c4f82c65"}},{"ruleId":"D1","level":"warning","message":{"text":"board_images.remove_images_from_board (cyclomatic 19): board_images.remove_images_from_board has cyclomatic complexity 19 (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":"invokeai/app/api/routers/board_images.py"},"region":{"startLine":303}}}],"partialFingerprints":{"codehealthFindingId/v1":"22741f9108545774671ac4e62c8e5355c120e04faec51979a7378ff8dcbe2b1c"}},{"ruleId":"D1","level":"warning","message":{"text":"model_manager.get_is_installed (cyclomatic 19): model_manager.get_is_installed 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":"invokeai/app/api/routers/model_manager.py"},"region":{"startLine":1550}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ab83e10d096b06e8694b7cb257d7a160c98adabcdabf69fb40517536072da4e"}},{"ruleId":"D1","level":"warning","message":{"text":"ImageIndexService._process_projection (cyclomatic 19): ImageIndexService._process_projection 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":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1575}}}],"partialFingerprints":{"codehealthFindingId/v1":"57ec8da796d1a582bac03cc16cf315ebea9852549dede3275445f7e6db62181a"}},{"ruleId":"D1","level":"warning","message":{"text":"ImageMoveService._complete_partial_filesystem_move (cyclomatic 19): ImageMoveService._complete_partial_filesystem_move 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":"invokeai/app/services/image_moves/image_moves_default.py"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8c72b3da5e420cab4c7e93e391ddca5a02a0bfeb7b3255f06e7645c9aa7ad61"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelInstallService._register_or_install (cyclomatic 19): ModelInstallService._register_or_install 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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":1745}}}],"partialFingerprints":{"codehealthFindingId/v1":"4988d774a883800f82160d49ed6c9c3a7eb45577a1888339df0cfb79e150bd3a"}},{"ruleId":"D1","level":"warning","message":{"text":"DefaultSessionProcessor._process (cyclomatic 19): DefaultSessionProcessor._process 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":"invokeai/app/services/session_processor/session_processor_default.py"},"region":{"startLine":1102}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a29ce1a8a7086377748b554a6e9718aefd9c224df97fada24e7d4f9a5694819"}},{"ruleId":"D1","level":"warning","message":{"text":"ExecutionRef._accept_token_fields (cyclomatic 19): ExecutionRef._accept_token_fields 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":"invokeai/app/services/shared/execution_effects.py"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"2064d5d9fc459c7a6d831e1185f06ee75f25394ef0e73032defc5efb450ddc0b"}},{"ruleId":"D1","level":"warning","message":{"text":"execution_effects.normalize_persisted_execution_effects (cyclomatic 19): execution_effects.normalize_persisted_execution_effects 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":"invokeai/app/services/shared/execution_effects.py"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"4086c37fde145a0ec1df53fd2f44e5521045c7841cc3d99faaf6133a875d8990"}},{"ruleId":"D1","level":"warning","message":{"text":"StreamBuffer._coerce_event (cyclomatic 19): StreamBuffer._coerce_event 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":"invokeai/app/services/shared/execution_engine/primitives.py"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a851c8340994a06c6fdf829cd6e46e3fd50780a123b961812239863f94a0063"}},{"ruleId":"D1","level":"warning","message":{"text":"graph_iterate_planner._get_direct_iterate_collect_fan_in (cyclomatic 19): graph_iterate_planner._get_direct_iterate_collect_fan_in 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":"invokeai/app/services/shared/graph_iterate_planner.py"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"24fc805584328bbfa1dc5811c6327d3cbc8ad021cedaff407159c5c5c242e7b2"}},{"ruleId":"D1","level":"warning","message":{"text":"_ExecutionNodeBuilder._attach_pending_if_inputs (cyclomatic 19): _ExecutionNodeBuilder._attach_pending_if_inputs 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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":1934}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3b5a40dcd9b70dd5c26c010fe9765dbcdea7a5bb13e335c39cb55ceb837af87"}},{"ruleId":"D1","level":"warning","message":{"text":"aac_splice._set_audio_edit (cyclomatic 19): aac_splice._set_audio_edit 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":"invokeai/app/util/aac_splice.py"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"c71539bb3eeb1beb22dead1aba100d3fe7e13491c747425a4a16e7b86c821494"}},{"ruleId":"D1","level":"warning","message":{"text":"h264_splice._sample_locations (cyclomatic 19): h264_splice._sample_locations 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":"invokeai/app/util/h264_splice.py"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4f7c7c498ac4f093a753e4d0aece5651685637f8ce43d67d061152a8d47c716"}},{"ruleId":"D1","level":"warning","message":{"text":"denoise.denoise (cyclomatic 19): denoise.denoise 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":"invokeai/backend/ernie_image/denoise.py"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7efd0105e065102a5309a6885432322e366e1cf1495202134107ac903f3dc15"}},{"ruleId":"D1","level":"warning","message":{"text":"checkpoint_layout.classify_roles (cyclomatic 19): checkpoint_layout.classify_roles 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":"invokeai/backend/ltx2/checkpoint_layout.py"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"bee91149d4e614d0401f40ba3b0d390199991c71daec4b337f1b30341ac723b1"}},{"ruleId":"D1","level":"warning","message":{"text":"StableDiffusionGeneratorPipeline._adjust_memory_efficient_attention (cyclomatic 19): StableDiffusionGeneratorPipeline._adjust_memory_efficient_attention 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":"invokeai/backend/stable_diffusion/diffusers_pipeline.py"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ba9042f27a171ec76428e9b2b5d1bed3cbc43e41135feeb29e368214fe3a872"}},{"ruleId":"D1","level":"warning","message":{"text":"StableDiffusionGeneratorPipeline.step (cyclomatic 19): StableDiffusionGeneratorPipeline.step 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":"invokeai/backend/stable_diffusion/diffusers_pipeline.py"},"region":{"startLine":438}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c4655852ccaaa0715e3ba2d2551e7c6f20249b3e98574359bfa4b565471a882"}},{"ruleId":"D1","level":"warning","message":{"text":"promptAST.parseTokens::tryParsePromptFunction (cyclomatic 19): promptAST.parseTokens::tryParsePromptFunction 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. This shape REPEATS in the file: 2 other methods here (promptAST.parseTokens::tryParseUnquotedPromptFunction, promptAST.parseTokens::parseGroup) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 3 times rather than 3 independent problems. Splitting this body alone leaves the other 2 exactly as they are. Where these are variations on one operation, the change that clears all 3 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":"invokeai/frontend/webv1/src/common/util/promptAST.ts"},"region":{"startLine":407}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c0b9d882b1f93659d94caf39b3ee0073f122448002a4fb4e4f4b26a7d0d629c"}},{"ruleId":"D1","level":"warning","message":{"text":"CanvasEntityGroupList.CanvasEntityGroupList (cyclomatic 19): CanvasEntityGroupList.CanvasEntityGroupList has cyclomatic complexity 19 (threshold 15). Most of this is not in the body itself: 7 of the 19 points are its own statements and the rest belongs to one function literal inside it that branches (line 37). 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityGroupList.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"24143986b67c63068584fb1d0451bbb0f9e39cab52662577e9fa44f8131166c1"}},{"ruleId":"D1","level":"warning","message":{"text":"RasterLayerCurvesAdjustmentsGraph.drawHistogram (cyclomatic 19): RasterLayerCurvesAdjustmentsGraph.drawHistogram 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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d6d25186e15a291e571db7f9abbc04c1e854dd693c42df2f379b25204abafa6"}},{"ruleId":"D1","level":"warning","message":{"text":"RefImageSettings.RefImageSettingsContent (cyclomatic 19): RefImageSettings.RefImageSettingsContent has cyclomatic complexity 19 (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":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbd952e6ac0d6aa825815000dd270a0e8ca6bf73c90c799ebb7c9a2ff5525a80"}},{"ruleId":"D1","level":"warning","message":{"text":"validators.getGlobalReferenceImageWarnings (cyclomatic 19): validators.getGlobalReferenceImageWarnings 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":"invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"521da673cac73d517ce8f9fd4e600de389e8005f48919c456ee3128116f2e4be"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelIdentifierFieldInputComponent.ModelIdentifierFieldInputComponent (cyclomatic 19): ModelIdentifierFieldInputComponent.ModelIdentifierFieldInputComponent 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 3 function literals inside it that branch (lines 43, 34, 19). 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelIdentifierFieldInputComponent.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"9accbac4be49cb5b2f259ee0292ef6a7f80d0c9b8c3270abe1f5a9a99d6532c9"}},{"ruleId":"D1","level":"warning","message":{"text":"dnd-hooks.useBuilderDndMonitor (cyclomatic 19): dnd-hooks.useBuilderDndMonitor 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 2 function literals inside it that branch (lines 224, 223). 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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"c49534174dad9f37b4f3800e8d1fca5f8059c85dbc96e4b7214828c3454d0c05"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowListItem.WorkflowListItem (cyclomatic 19): WorkflowListItem.WorkflowListItem has cyclomatic complexity 19 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 4 belong to 3 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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowListItem.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0de12984c6b82f35179a0a2918dace53de62db2bf7cadc71278e842df1931e2"}},{"ruleId":"D1","level":"warning","message":{"text":"useNodeCopyPaste._pasteSelection (cyclomatic 19): useNodeCopyPaste._pasteSelection has cyclomatic complexity 19 (threshold 15). Most of this is not in the body itself: 6 of the 19 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 122, 59, 87, \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":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeCopyPaste.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"24f4ee096b2a4fa8db2ba8ed76df7ca46c38989d750179e53d1558b457f37fb3"}},{"ruleId":"D1","level":"warning","message":{"text":"fieldValidators.validateNumberFieldCollectionValue (cyclomatic 19): fieldValidators.validateNumberFieldCollectionValue 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":"invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"425bbd2403fcbe1ce0c75e7442ba38a612f1f708f859c71cc264f750adfa0c17"}},{"ruleId":"D1","level":"warning","message":{"text":"fieldValidators.getFieldErrors (cyclomatic 19): fieldValidators.getFieldErrors 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":"invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"2319f878e11e6d86c8c6e7b73b92db1aea671b7350e654071c5eabde6118dc31"}},{"ruleId":"D1","level":"warning","message":{"text":"referenceImage.resolveRatioDrag (cyclomatic 19): referenceImage.resolveRatioDrag 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":"invokeai/frontend/webv2/src/features/generation/core/referenceImage.ts"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"f211441de6b510765fb3030c13c44d1f25504cacbfbf7217b02648d314314580"}},{"ruleId":"D1","level":"warning","message":{"text":"graph.buildSDGraph (cyclomatic 19): graph.buildSDGraph 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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"1439e34a95421632f03667cebac9876060ed5cc79ec31114f0becd915f277699"}},{"ruleId":"D1","level":"warning","message":{"text":"PromptParser.parseQuotedPromptFunction (cyclomatic 19): PromptParser.parseQuotedPromptFunction 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":"invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"74d13aba4036857c4bb71c8eef382ea90be35aaa16edcceb88a29b8c1f5ff381"}},{"ruleId":"D1","level":"warning","message":{"text":"attention.adjustNodes (cyclomatic 19): attention.adjustNodes has cyclomatic complexity 19 (threshold 15). Of this number, 17 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":"invokeai/frontend/webv2/src/features/generation/core/prompt/attention.ts"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"371feede836c770270b533a9254200495a8bd760d854f46b42437a26818e1393"}},{"ruleId":"D1","level":"warning","message":{"text":"WildcardTransferActions.WildcardTransferActions (cyclomatic 19): WildcardTransferActions.WildcardTransferActions has cyclomatic complexity 19 (threshold 15). Most of this is not in the body itself: 3 of the 19 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 102, 62, 140, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardTransferActions.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"94ade4ddf82511f1f1bf88137693cf4cc49b9017de9b6dc7a0ae23848005105a"}},{"ruleId":"D1","level":"warning","message":{"text":"utilityGraph.reconcileUtilityCompletedOutput (cyclomatic 19): utilityGraph.reconcileUtilityCompletedOutput has cyclomatic complexity 19 (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":"invokeai/frontend/webv2/src/features/queue/runtime/utilityGraph.ts"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c2f7c4ec178f1e35d7f1d857ab9446a4afb6f334d734c75b6563b64411779d1"}},{"ruleId":"D1","level":"warning","message":{"text":"settings.clearDeletedVideoMedia (cyclomatic 19): settings.clearDeletedVideoMedia has cyclomatic complexity 19 (threshold 15). Of this number, 17 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":"invokeai/frontend/webv2/src/features/video/core/settings.ts"},"region":{"startLine":1078}}}],"partialFingerprints":{"codehealthFindingId/v1":"57b054edeeeeec3d53b08021b5a6b20a5ccecb71cc39d7d86b1532d8c078f7dd"}},{"ruleId":"D1","level":"warning","message":{"text":"connectors.resolveConnectorDeletionSource (cyclomatic 19): connectors.resolveConnectorDeletionSource has cyclomatic complexity 19 (threshold 15). 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, 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":"invokeai/frontend/webv2/src/features/workflow/core/connectors.ts"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"4714ff7a9905b2ed3c825645307e094d9c95fb522cfed3d4cf524848cb4a0279"}},{"ruleId":"D1","level":"warning","message":{"text":"indexedDbDraftStore.createIndexedDbProjectDraftStore.settleAcknowledgement (cyclomatic 19): indexedDbDraftStore.createIndexedDbProjectDraftStore.settleAcknowledgement has cyclomatic complexity 19 (threshold 15). Most of this is not in the body itself: 6 of the 19 points are its own statements and the rest belongs to one function literal inside it that branches (line 1135). 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":1125}}}],"partialFingerprints":{"codehealthFindingId/v1":"27ad6b7b3656b2e006e1ca73c60e3aca6034d3ff3c343889ce5146ddc7387893"}},{"ruleId":"D1","level":"warning","message":{"text":"assetTransport.createAssetResponseReader (cyclomatic 19): assetTransport.createAssetResponseReader 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 4 function items inside it that branch (a function literal at line 140, refuseTooLarge, cancelReader, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/assetTransport.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f76ce96de17dc4ec6ef6aea8018c192d437761ab02dffaa21288d9a80df2972"}},{"ruleId":"D1","level":"warning","message":{"text":"projectAssets.createOpenProjectsHeldMediaReader (cyclomatic 19): projectAssets.createOpenProjectsHeldMediaReader 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 2 function items inside it that branch (collectParts, a function literal at line 192). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/projectAssets.ts"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"171d17169b729ad4653c208b090f9c4f5401d4bcc1c61b83863b71103245d662"}},{"ruleId":"D1","level":"warning","message":{"text":"persistenceRuntime.createWorkbenchPersistenceRuntime.load (cyclomatic 19): persistenceRuntime.createWorkbenchPersistenceRuntime.load 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":"invokeai/frontend/webv2/src/workbench/persistenceRuntime.ts"},"region":{"startLine":484}}}],"partialFingerprints":{"codehealthFindingId/v1":"a26aedda594cf56914346d0516f6c3058bb392f4184cc7217877892256b3622b"}},{"ruleId":"D1","level":"warning","message":{"text":"runLayerWorkflow.runLayerWorkflow (cyclomatic 19): runLayerWorkflow.runLayerWorkflow 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/runLayerWorkflow.ts"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"38d7ac0cc03301dd8545ae8bc5f344744c89db85e407545c181ca552cc52dcc0"}},{"ruleId":"D1","level":"warning","message":{"text":"documentIndex.updateNodeValues (cyclomatic 19): documentIndex.updateNodeValues has cyclomatic complexity 19 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 7 belong to one function item 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentIndex.ts"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"50456e7124abaf3527dc5d2b8b796ba96bace93bb316d3ddab40b01780345e15"}},{"ruleId":"D1","level":"warning","message":{"text":"workbenchStore.createCommands (cyclomatic 19): workbenchStore.createCommands 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 10 function literals inside it that branch (lines 393, 425, 478, \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":"invokeai/frontend/webv2/src/workbench/workbenchStore.ts"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b553d96192494b46bc7a3df182d08485198492082c1f348f19a867c3bc622b7"}},{"ruleId":"D1","level":"warning","message":{"text":"SelectionImageController.replace (cyclomatic 19): SelectionImageController.replace 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/selectionImageController.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfa55f7a8efc91e851608c7eac2ebbe82ad59a0272d06c424c102113f85f7bd2"}},{"ruleId":"D1","level":"warning","message":{"text":"MaskLayerController.clear (cyclomatic 19): MaskLayerController.clear has cyclomatic complexity 19 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskLayerController.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"7957a34e67dde2c019fdb700ffbefdcd03806f2ecc184aca8ee64e358d3c0611"}},{"ruleId":"D1","level":"warning","message":{"text":"MaskLayerController.invert (cyclomatic 19): MaskLayerController.invert 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskLayerController.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"6400dd2bce28920b6168c8a9aa64db1a08cf7c8f3efc720d632686ff436c1c4a"}},{"ruleId":"D1","level":"warning","message":{"text":"documentMirror.diffValueEdit (cyclomatic 19): documentMirror.diffValueEdit 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentMirror.ts"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a2f3a7d2835b3412c7a6aba4c6bece70e0b6ad59d15769b0fff1fd9d2d9724e"}},{"ruleId":"D1","level":"warning","message":{"text":"engine.createCanvasEngine::getDuplicateRasterPlan (cyclomatic 19): engine.createCanvasEngine::getDuplicateRasterPlan 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts"},"region":{"startLine":2149}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c6096510cbc69e460731c06e6bd70b26c2a312ab530c1d97d283d2370705d36"}},{"ruleId":"D1","level":"warning","message":{"text":"groupSurfaceCache.createGroupSurfaceCache.resolve (cyclomatic 19): groupSurfaceCache.createGroupSurfaceCache.resolve 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/groupSurfaceCache.ts"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"803225e545c1f08da1aed857576bacfb53dd6d3f6b5d1e514f457778702d0dbc"}},{"ruleId":"D1","level":"warning","message":{"text":"selectObjectSession.createSelectObjectSession.update (cyclomatic 19): selectObjectSession.createSelectObjectSession.update has cyclomatic complexity 19 (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":"invokeai/frontend/webv2/src/workbench/canvas-operations/selectObjectSession.ts"},"region":{"startLine":541}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5cddf06edcf5b754e575fc1826cb00afee082d9853e41278eae0adff31a8f74"}},{"ruleId":"D1","level":"warning","message":{"text":"queueRecallCache.createIndexedDbQueueRecallCache.put (cyclomatic 19): queueRecallCache.createIndexedDbQueueRecallCache.put 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, 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":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRecallCache.ts"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"52f14e0f26a69aa4d39658c7a47de9a66c4c7a5d003cff445f7a5569f765ed16"}},{"ruleId":"D1","level":"warning","message":{"text":"MaxQueueHistorySettings.MaxQueueHistorySettings (cyclomatic 19): MaxQueueHistorySettings.MaxQueueHistorySettings has cyclomatic complexity 19 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 6 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/MaxQueueHistorySettings.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf302af26c97a3855dbd0bf4bc9f632e1c5cad0867f9f0b42d5014f3845a0edc"}},{"ruleId":"D1","level":"warning","message":{"text":"videos.ingest_uploaded_video (cyclomatic 18): videos.ingest_uploaded_video 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":"invokeai/app/api/routers/videos.py"},"region":{"startLine":430}}}],"partialFingerprints":{"codehealthFindingId/v1":"26776de035b3bbf27d3b3c15a94885a27e232be7c65ac69cfb771eca7e4c607f"}},{"ruleId":"D1","level":"warning","message":{"text":"SocketIO._handle_queue_event (cyclomatic 18): SocketIO._handle_queue_event 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":"invokeai/app/api/sockets.py"},"region":{"startLine":960}}}],"partialFingerprints":{"codehealthFindingId/v1":"c85356107d1ea00585a4d5eba9cfebd76a4b57e90c28219af1eb923027589d13"}},{"ruleId":"D1","level":"warning","message":{"text":"Flux2KleinLoRACollectionLoader.invoke (cyclomatic 18): Flux2KleinLoRACollectionLoader.invoke 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":"invokeai/app/invocations/flux2/flux2_klein_lora_loader.py"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"d82d1b1fc14ae7ad886d655ad1b64ecd0760c8e0c1a41e35d361518cde161526"}},{"ruleId":"D1","level":"warning","message":{"text":"Krea2LoRALoaderInvocation.invoke (cyclomatic 18): Krea2LoRALoaderInvocation.invoke 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":"invokeai/app/invocations/krea2/krea2_lora_loader.py"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb91b23b88b344d47ce0c160ce59b76c6f738dee15ddda3a31dfbab01e21b73f"}},{"ruleId":"D1","level":"warning","message":{"text":"VideoConcatInvocation.invoke (cyclomatic 18): VideoConcatInvocation.invoke 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":"invokeai/app/invocations/video_concat.py"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"744e4cf9e7a191800626bd397bc364730583ed43ea9d8b71924f87138f9a49bc"}},{"ruleId":"D1","level":"warning","message":{"text":"VideoConcatInvocation._execute_smart_render (cyclomatic 18): VideoConcatInvocation._execute_smart_render 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":"invokeai/app/invocations/video_concat.py"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4dd8965a8c2c66d6c16787b230b571143c692f4041a99de757a5e9b2a1ce3df"}},{"ruleId":"D1","level":"warning","message":{"text":"_ExpertSwapper.get (cyclomatic 18): _ExpertSwapper.get 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":"invokeai/app/invocations/wan/wan_denoise.py"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0d8e7d1c52afc41a641afda4e3c4b01f141b5518f1f8e709d5de8989d2e097e"}},{"ruleId":"D1","level":"warning","message":{"text":"ZImageLoRACollectionLoader.invoke (cyclomatic 18): ZImageLoRACollectionLoader.invoke 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":"invokeai/app/invocations/z_image/z_image_lora_loader.py"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"753e312754445afcfe00b52a079de8feb1884e1e7ea6cb6931d8b14e149eaa6c"}},{"ruleId":"D1","level":"warning","message":{"text":"GalleryMaintenanceService._archive_snapshot_files (cyclomatic 18): GalleryMaintenanceService._archive_snapshot_files 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":"invokeai/app/services/gallery_maintenance/gallery_maintenance_default.py"},"region":{"startLine":734}}}],"partialFingerprints":{"codehealthFindingId/v1":"9264128a2b4019f4cadf4a1da65c7169c9c74c57ecdae8ffd896e317919ad63a"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelInstallService.restart_failed (cyclomatic 18): ModelInstallService.restart_failed 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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":1324}}}],"partialFingerprints":{"codehealthFindingId/v1":"59e71c83e48ab2d16462d7d9e378512df64525898c8926fad7a0e85c336dd6bb"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowCallQueueLifecycle.apply_execution_effects (cyclomatic 18): WorkflowCallQueueLifecycle.apply_execution_effects 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":"invokeai/app/services/session_processor/workflow_call_runtime.py"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3a8c1c003ce29e5b3f955f73079e9e6f72b2f8dfa22cbd8b35bc736300b33a1"}},{"ruleId":"D1","level":"warning","message":{"text":"ChildDependencyRecord._record_completion (cyclomatic 18): ChildDependencyRecord._record_completion 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":"invokeai/app/services/shared/execution_engine/child.py"},"region":{"startLine":638}}}],"partialFingerprints":{"codehealthFindingId/v1":"c378a91c803e6a6bada24e71e5b997f4867430471802b8a92b0e3c5df8944cfd"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphExecutionState._record_iterate_stream (cyclomatic 18): GraphExecutionState._record_iterate_stream 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1625}}}],"partialFingerprints":{"codehealthFindingId/v1":"700224ae743cf6ac674a36510edde7fefb6217b075bade2c610bd80b1b28124c"}},{"ruleId":"D1","level":"warning","message":{"text":"_IfActivationController._branch_sources (cyclomatic 18): _IfActivationController._branch_sources 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":"invokeai/app/services/shared/graph_if_activation.py"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"9df9e15ea7df3b689b6c4ac641a139e8e39104af776c192ca75b486c4bd1a0a7"}},{"ruleId":"D1","level":"warning","message":{"text":"graph_if_runtime._validate_frame_axes (cyclomatic 18): graph_if_runtime._validate_frame_axes 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":"invokeai/app/services/shared/graph_if_runtime.py"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f6cb6bb520f86079eb5918d878fb144908914eb03cdff5e67af4e0888c3b830"}},{"ruleId":"D1","level":"warning","message":{"text":"_ExecutionNodeBuilder._get_known_iteration_path (cyclomatic 18): _ExecutionNodeBuilder._get_known_iteration_path 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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed5425d1ad9bd905156218eb382da3d81a1d3559a2852071055ba73560e870ed"}},{"ruleId":"D1","level":"warning","message":{"text":"LLLiteModuleDiT.forward (cyclomatic 18): LLLiteModuleDiT.forward 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":"invokeai/backend/anima/control_net_lllite.py"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"7924ab75d543285476638d4487869ac2e125caaa5544d1e76561bdc17970422f"}},{"ruleId":"D1","level":"warning","message":{"text":"denoise.build_denoise_state (cyclomatic 18): denoise.build_denoise_state 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":"invokeai/backend/ltx2/denoise.py"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"cba7fac408e3fcd4800cdfeaeee3e6965aa6ad407662250d35124e34e3e712b9"}},{"ruleId":"D1","level":"warning","message":{"text":"main._detect_wan_expert (cyclomatic 18): main._detect_wan_expert 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":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":2653}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ba561d1bed2c67f613e4cf0e57b1b135fb4b403b77e9f4dfa1ed00ded27a9bf"}},{"ruleId":"D1","level":"warning","message":{"text":"pid_decoder._int8_sidecar_keys (cyclomatic 18): pid_decoder._int8_sidecar_keys 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":"invokeai/backend/model_manager/configs/pid_decoder.py"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c7dfb5411f0b388a759e3afe7901841e990aebc591687ef5f7adc9577b30810"}},{"ruleId":"D1","level":"warning","message":{"text":"CachedModelWithPartialLoad.partial_load_to_vram_chunk (cyclomatic 18): CachedModelWithPartialLoad.partial_load_to_vram_chunk 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":"invokeai/backend/model_manager/load/model_cache/cached_model/cached_model_with_partial_load.py"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ca2c72b28a8d26517ad462e3eeaa8a5d32a016687d71bed8dd734248293ffdd"}},{"ruleId":"D1","level":"warning","message":{"text":"Flux2GGUFCheckpointModel._load_from_singlefile (cyclomatic 18): Flux2GGUFCheckpointModel._load_from_singlefile 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":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":1815}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb76a996c5e5be4c72eb262b8fd21672cecab2b1ef0142b6b38c0b7875d9efd9"}},{"ruleId":"D1","level":"warning","message":{"text":"krea2._convert_krea2_native_to_diffusers (cyclomatic 18): krea2._convert_krea2_native_to_diffusers 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":"invokeai/backend/model_manager/load/model_loaders/krea2.py"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"19fd40f0f64a3907742dd44a049fd7ef182aeac24a054133755ef63691a1439d"}},{"ruleId":"D1","level":"warning","message":{"text":"ZImageCheckpointModel._load_from_singlefile (cyclomatic 18): ZImageCheckpointModel._load_from_singlefile 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":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"7728950b3deb698a159c9b2930b63782e1a49625a35ff26d362c21084b47618f"}},{"ruleId":"D1","level":"warning","message":{"text":"sage_attention.install_sage_attention (cyclomatic 18): sage_attention.install_sage_attention 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":"invokeai/backend/util/sage_attention.py"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"e20cb05e4b8b7019c26756b9800247e9ebad94b416104a96802e040983f2e340"}},{"ruleId":"D1","level":"warning","message":{"text":"calibrate_flux2_working_memory.main (cyclomatic 18): calibrate_flux2_working_memory.main 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/calibrate_flux2_working_memory.py"},"region":{"startLine":595}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e01eac1156df1e41d105317d9a7a6cb8c0ee571e6c403401fcd0516318d0342"}},{"ruleId":"D1","level":"warning","message":{"text":"RefImagePreview.RefImagePreview (cyclomatic 18): RefImagePreview.RefImagePreview has cyclomatic complexity 18 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImagePreview.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"c60a7e4e80c8d0cc9577c627ace3ee363db3150c1941c4d74dd58760967101dc"}},{"ruleId":"D1","level":"warning","message":{"text":"CanvasEntityAdapterInpaintMask.sync (cyclomatic 18): CanvasEntityAdapterInpaintMask.sync 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterInpaintMask.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bfa5405c19564d8368c2fac2b231f2647ba463c03d0ae650c8a467c1a5da339"}},{"ruleId":"D1","level":"warning","message":{"text":"CanvasEntityAdapterRasterLayer.sync (cyclomatic 18): CanvasEntityAdapterRasterLayer.sync 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRasterLayer.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff5bdc99b7db9f41d97bef99033a4c9825925b28a158d26dd7f3bfbb0595768a"}},{"ruleId":"D1","level":"warning","message":{"text":"CanvasEntityAdapterRegionalGuidance.sync (cyclomatic 18): CanvasEntityAdapterRegionalGuidance.sync 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRegionalGuidance.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"8953290573e157ad5a4060eb39413f9d7050b566d7820e8ca3deb8d026387dc9"}},{"ruleId":"D1","level":"warning","message":{"text":"validators.getControlLayerWarnings (cyclomatic 18): validators.getControlLayerWarnings 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 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":"invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3bfb2045c210328099aac22b8f7e8f2dd1436bd41c7c8f163278020e3eac965"}},{"ruleId":"D1","level":"warning","message":{"text":"modelSettingsIO.buildExportData (cyclomatic 18): modelSettingsIO.buildExportData has cyclomatic complexity 18 (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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/modelSettingsIO.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"872febff62abd7760c039688988d72abd7d4d271c957b8c7c0bf0f50b817054d"}},{"ruleId":"D1","level":"warning","message":{"text":"graphBuilderUtils.getDenoisingStartAndEnd (cyclomatic 18): graphBuilderUtils.getDenoisingStartAndEnd has cyclomatic complexity 18 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2d3762765ab6b90a7abe448efaade70c55aa1e10b7a23393493bb42f9722758"}},{"ruleId":"D1","level":"warning","message":{"text":"buildFLUXGraph.buildFLUXGraph::addFlux2Features (cyclomatic 18): buildFLUXGraph.buildFLUXGraph::addFlux2Features 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. This shape REPEATS in the file: one other method here (buildFLUXGraph.buildFLUXGraph) 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"967af2ee62d1fdb4023cb5981cbf59ac0caf6e6b44032aea003df5d1b47d565e"}},{"ruleId":"D1","level":"warning","message":{"text":"ParamPositivePrompt.ParamPositivePrompt (cyclomatic 18): ParamPositivePrompt.ParamPositivePrompt has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 5 of the 18 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 199, 291, 163, \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":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"00df1588af562f10eaff9f520db577b7008ae0e20396b44b2e4f832bc5999666"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsGenerationDevices.DeviceTag (cyclomatic 18): SettingsGenerationDevices.DeviceTag has cyclomatic complexity 18 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 5 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsGenerationDevices.tsx"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ac761d0643f8d1fa517389c3c174875abb9bdc7be76c19bf4697a2862b28b27"}},{"ruleId":"D1","level":"warning","message":{"text":"use-collapsible-gridview-panel.useCollapsibleGridviewPanel (cyclomatic 18): use-collapsible-gridview-panel.useCollapsibleGridviewPanel has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 1 of the 18 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 49, 29, 72, \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":"invokeai/frontend/webv1/src/features/ui/layouts/use-collapsible-gridview-panel.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc0c58998d64e1dd4d8a165c6d0cd5456e656f8cb603d843d83af60e38da5592"}},{"ruleId":"D1","level":"warning","message":{"text":"onInvocationComplete.buildOnInvocationComplete::addImagesToGallery (cyclomatic 18): onInvocationComplete.buildOnInvocationComplete::addImagesToGallery 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":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6161e2c6a4ff56c430758dbf0db7fd256ee45cbd9d97aa27d7d7cb1c2041eb9"}},{"ruleId":"D1","level":"warning","message":{"text":"backend.moveGalleryVideoItemsToBoard (cyclomatic 18): backend.moveGalleryVideoItemsToBoard has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 8 of the 18 points are its own statements and the rest belongs to 2 function items inside it that branch (worker, claimNextVideo). 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":"invokeai/frontend/webv2/src/features/gallery/data/backend.ts"},"region":{"startLine":1415}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8b0734c5bf4e9b3f3c437d28a5f70af2936252892b0fcd77dcbe2d98691165d"}},{"ruleId":"D1","level":"warning","message":{"text":"controlValidation.getControlValidationReason (cyclomatic 18): controlValidation.getControlValidationReason 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":"invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.ts"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f9c21097fdc98b9a094aeeadc40add7b6ca6de162a021fd951b72582ee7c4ac"}},{"ruleId":"D1","level":"warning","message":{"text":"compileCanvasGraph.compileCanvasGraph (cyclomatic 18): compileCanvasGraph.compileCanvasGraph has cyclomatic complexity 18 (threshold 15). Of this number, 17 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":"invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts"},"region":{"startLine":728}}}],"partialFingerprints":{"codehealthFindingId/v1":"583e212df9deb12e708f13e27b8a3af61ca93df7a7f36538458269693502ac60"}},{"ruleId":"D1","level":"warning","message":{"text":"sdxlRefiner.getRefinerValidationReasons (cyclomatic 18): sdxlRefiner.getRefinerValidationReasons has cyclomatic complexity 18 (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":"invokeai/frontend/webv2/src/features/generation/core/sdxlRefiner.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"67d65b7807c27d3dd06e790dd98b2c5a0ea36ea0589147311f396e989a9e6aea"}},{"ruleId":"D1","level":"warning","message":{"text":"settings.cloneGenerateWidgetValues (cyclomatic 18): settings.cloneGenerateWidgetValues 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":"invokeai/frontend/webv2/src/features/generation/core/settings.ts"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"399eb7db7cf90ea1148cf7f6d586e1c606c25238601c74661106f29f73f32552"}},{"ruleId":"D1","level":"warning","message":{"text":"graph.buildQwenImageGraph (cyclomatic 18): graph.buildQwenImageGraph 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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":963}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b111ec377b26663d72a7337d6c50c1717ea6dc8e86213d38abcd15182cdd32c"}},{"ruleId":"D1","level":"warning","message":{"text":"PromptParser.parseNodes (cyclomatic 18): PromptParser.parseNodes 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":"invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts"},"region":{"startLine":606}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2b5b42e95c0bb0fe58ef8413e5bd04232acaf15f23e0ea5c85e5d2ac59fc817"}},{"ruleId":"D1","level":"warning","message":{"text":"GenerateDimensionFields.GenerateDimensionFields::renderSection (cyclomatic 18): GenerateDimensionFields.GenerateDimensionFields::renderSection 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":"invokeai/frontend/webv2/src/features/generation/ui/GenerateDimensionFields.tsx"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"70caae6357938b51b6fc6cd20329276b4411444f3a76ee9448028dd7b243311c"}},{"ruleId":"D1","level":"warning","message":{"text":"ReferenceImageCard.ReferenceImageCardBase (cyclomatic 18): ReferenceImageCard.ReferenceImageCardBase has cyclomatic complexity 18 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 2 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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"f684fde218c9e741a8b370d9186a3167f0edb17d27ba2ec7742b6e95bebc9530"}},{"ruleId":"D1","level":"warning","message":{"text":"DefaultSettingsSection.FieldControl (cyclomatic 18): DefaultSettingsSection.FieldControl has cyclomatic complexity 18 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 6 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":"invokeai/frontend/webv2/src/features/models/ui/detail/DefaultSettingsSection.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"10de0d8bafe8df983cf290c417fb1c6835ec69801a83d9058d0aded3ad1e2f38"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelSettingsMenuItems.ModelSettingsMenuItems (cyclomatic 18): ModelSettingsMenuItems.ModelSettingsMenuItems has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 1 of the 18 points is its own statement and the rest belongs to 3 function items inside it that branch (a function literal at line 59, handleExport, handleFileChange). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/detail/ModelSettingsMenuItems.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"6576bc5d2d5547e613a7214b16d7c0fabffc279250706951d32d0005b92d4481"}},{"ruleId":"D1","level":"warning","message":{"text":"generationMeta.extractGenerationMeta (cyclomatic 18): generationMeta.extractGenerationMeta 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":"invokeai/frontend/webv2/src/features/queue/core/generationMeta.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd298c80d476abe7b19f696c2d31cecfed8d3906fc49885ca748798ab32a90f0"}},{"ruleId":"D1","level":"warning","message":{"text":"runtime.createQueueRuntime (cyclomatic 18): runtime.createQueueRuntime has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 1 of the 18 points is its own statement and the rest belongs to 5 function literals inside it that branch (lines 1322, 457, 1305, \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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":430}}}],"partialFingerprints":{"codehealthFindingId/v1":"852f1b4af078c719ce732300c68a4849ac6dd46ef245b1c5bd1b52119906bf65"}},{"ruleId":"D1","level":"warning","message":{"text":"runtime.createQueueRuntime.deliverResultVideos (cyclomatic 18): runtime.createQueueRuntime.deliverResultVideos has cyclomatic complexity 18 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 1 belongs 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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":984}}}],"partialFingerprints":{"codehealthFindingId/v1":"df2239805843d56a438d6518a366ae0c1d0df49ec88dd043b1aebbe3619a6f4f"}},{"ruleId":"D1","level":"warning","message":{"text":"runtime.createQueueRuntime.prepareActiveRuns (cyclomatic 18): runtime.createQueueRuntime.prepareActiveRuns has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 5 of the 18 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 2017, 2000, 2044). 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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":1994}}}],"partialFingerprints":{"codehealthFindingId/v1":"b24cef665a1a5babdfd2eb33cb9d9fbf6c4a3d2bf31d8191971d503fc2f7ff86"}},{"ruleId":"D1","level":"warning","message":{"text":"forLoops.getForLoopBodyBoundaries (cyclomatic 18): forLoops.getForLoopBodyBoundaries 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 3 function literals inside it that branch (lines 216, 254, 218). 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":"invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f17cc06ccbc68ae3cc20cc694892327003b4a3a625cdeea9ecfa0735af42e73"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowFieldInput.WorkflowFieldSnapshot (cyclomatic 18): WorkflowFieldInput.WorkflowFieldSnapshot 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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":2021}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e6932ad7532b0ca6f3a51ad536cc4218280efe2f383fba957a6d591d651d4a7"}},{"ruleId":"D1","level":"warning","message":{"text":"durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject::reconcile (cyclomatic 18): durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject::reconcile has cyclomatic complexity 18 (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. This shape REPEATS in the file: 4 other methods here (durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::stageProject, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject::pushHalves, \u2026) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 5 times rather than 5 independent problems. Splitting this body alone leaves the other 4 exactly as they are. Where these are variations on one operation, the change that clears all 5 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":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":1624}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc38922d0bc6475261b2da3d9c243152ec879181725a208fe4ad676474d1bda8"}},{"ruleId":"D1","level":"warning","message":{"text":"layerChildRows.projectLayerChildRows (cyclomatic 18): layerChildRows.projectLayerChildRows has cyclomatic complexity 18 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerChildRows.ts"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"87fc440d4b72ef3167e71a56b27049013884c94655c33cdddb14c06ebb8030c1"}},{"ruleId":"D1","level":"warning","message":{"text":"adjustments.buildCurveLut (cyclomatic 18): adjustments.buildCurveLut 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/adjustments.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d60855cc8990157f5c2be67b8c3b8c9bad86303b71a53315e88ffecd857a97c"}},{"ruleId":"D1","level":"warning","message":{"text":"canvasDimsSync.createCanvasDimsSync.syncRenderSize (cyclomatic 18): canvasDimsSync.createCanvasDimsSync.syncRenderSize has cyclomatic complexity 18 (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":"invokeai/frontend/webv2/src/workbench/canvasDimsSync.ts"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9857ed0cf2404456e46a32af4d19df4c117d6805e885880a2da04f3e511c461"}},{"ruleId":"D1","level":"warning","message":{"text":"SelectionPixelController.run (cyclomatic 18): SelectionPixelController.run has cyclomatic complexity 18 (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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/selectionPixelController.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b37a6dd03ea13882b576244d6340cd6eb2aa96c518ef0e3f7e53798f9a60ad1"}},{"ruleId":"D1","level":"warning","message":{"text":"LayerMutationController.duplicate (cyclomatic 18): LayerMutationController.duplicate 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d7625eec4263d68a4a246fbb37ed283d1a5482d836aa84257293f9f6efab8ab"}},{"ruleId":"D1","level":"warning","message":{"text":"documentMirror.diffForests (cyclomatic 18): documentMirror.diffForests 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentMirror.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"992dc624ea6e0aa18819edefe89b0ed2f882931e180bf62fc3441f4a37845f65"}},{"ruleId":"D1","level":"warning","message":{"text":"fontLoader.createFontLoader.ensureSource (cyclomatic 18): fontLoader.createFontLoader.ensureSource has cyclomatic complexity 18 (threshold 15). Of this number, 17 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/fontLoader.ts"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac36734dd007f866716fe08f066e4e33b7ad0f23972c325227c7c51898a7f902"}},{"ruleId":"D1","level":"warning","message":{"text":"importGalleryImages.importGalleryImagesToCanvas (cyclomatic 18): importGalleryImages.importGalleryImagesToCanvas has cyclomatic complexity 18 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 1 belongs 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/importGalleryImages.ts"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"b96a070cd481bf8fd90ff8678b6db9bf549d26f1261336cf2fcbc3cd25cd82f0"}},{"ruleId":"D1","level":"warning","message":{"text":"executeVideoRecall.placeVideoImage (cyclomatic 18): executeVideoRecall.placeVideoImage 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":"invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts"},"region":{"startLine":637}}}],"partialFingerprints":{"codehealthFindingId/v1":"deb9987c66358244c768492394cc0becc22ac24de3b9a8cb2e8ba0a1a0a2a252"}},{"ruleId":"D1","level":"warning","message":{"text":"revealExternalGeneration.revealExternalGeneration (cyclomatic 18): revealExternalGeneration.revealExternalGeneration 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 3 function items inside it that branch (mayApplyWhenVisible, standDown, mayApply). 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":"invokeai/frontend/webv2/src/workbench/image-actions/revealExternalGeneration.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3063e0a9a51315d3621603f8af22836f1cc0019e4c1bab555c09f241f9ef010"}},{"ruleId":"D1","level":"warning","message":{"text":"useCommandPaletteController.useCommandPaletteController (cyclomatic 18): useCommandPaletteController.useCommandPaletteController 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":"invokeai/frontend/webv2/src/workbench/palette/useCommandPaletteController.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e7b78b284876ff46180e635a0b870d66c095ad259313b18cb6d9c54c4072c60"}},{"ruleId":"D1","level":"warning","message":{"text":"HotkeysSettingsSection.HotkeyListRow (cyclomatic 18): HotkeysSettingsSection.HotkeyListRow has cyclomatic complexity 18 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 3 belong to 3 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":"invokeai/frontend/webv2/src/workbench/settings/HotkeysSettingsSection.tsx"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff3d4e233e7f80541b55c95e6e929c0cc76ca5acd844dce1bc183094df4ff6bb"}},{"ruleId":"D1","level":"warning","message":{"text":"ImageMapVocabularySettings.ImageMapVocabularySettings (cyclomatic 18): ImageMapVocabularySettings.ImageMapVocabularySettings has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 8 of the 18 points are its own statements and the rest belongs to 6 function items inside it that branch (addTerms, a function literal at line 52, a function literal at line 62, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/ImageMapVocabularySettings.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"31e8e4c61ff6386efb21fafbf7b934ed75785aba90a4286bcfcaa7a2677ebf81"}},{"ruleId":"D1","level":"warning","message":{"text":"WidgetInstanceContextMenu.WidgetInstanceContextMenu (cyclomatic 18): WidgetInstanceContextMenu.WidgetInstanceContextMenu has cyclomatic complexity 18 (threshold 15). Of this number, 11 points are the body\u0027s own statements and 7 belong to 5 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":"invokeai/frontend/webv2/src/workbench/widget-frame/WidgetInstanceContextMenu.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4b530a96adeeb27fb6319dc0201a089c083ac2cfeb61a033bc3675785f60179"}},{"ruleId":"D1","level":"warning","message":{"text":"GenerateCanvasRenderSize.GenerateCanvasRenderSize (cyclomatic 18): GenerateCanvasRenderSize.GenerateCanvasRenderSize has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 7 of the 18 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 153, 127, 101, \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/GenerateCanvasRenderSize.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"01d183c8d6d733bbc5e080c5ba31c83b6da97527da599711ed5e5452d3a1a641"}},{"ruleId":"D1","level":"warning","message":{"text":"useMaskTintEditor.useMaskTintEditor (cyclomatic 18): useMaskTintEditor.useMaskTintEditor has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 1 of the 18 points is its own statement and the rest belongs to 8 function literals inside it that branch (lines 54, 102, 63, \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/color-system/useMaskTintEditor.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd0dd929a96e6ac7629bcc23975de6f1d303fe40fbf8a650c14fc5d74c9dfeaa"}},{"ruleId":"D1","level":"warning","message":{"text":"TextOptions.FontAxisSettings (cyclomatic 18): TextOptions.FontAxisSettings has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 5 of the 18 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 422, 408, 394, \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/TextOptions.tsx"},"region":{"startLine":381}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf894b2e73fec93ce04c322af837063e1f1ee03c2fc4672e4112acce8741a898"}},{"ruleId":"D1","level":"warning","message":{"text":"AnimaLoRACollectionLoader.invoke (cyclomatic 17): AnimaLoRACollectionLoader.invoke 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":"invokeai/app/invocations/anima/anima_lora_loader.py"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"1428462677106f6586dfa1483ef22eb768bc4f436f646f9c7671aa507959b63e"}},{"ruleId":"D1","level":"warning","message":{"text":"FLUXLoRACollectionLoader.invoke (cyclomatic 17): FLUXLoRACollectionLoader.invoke 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":"invokeai/app/invocations/flux/flux_lora_loader.py"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffba9e54af723aee301bb0d2e8736222411c14144ea6d2e7ef03d00f42e5df42"}},{"ruleId":"D1","level":"warning","message":{"text":"ExtractVideoRangeInvocation._write_spliced_range (cyclomatic 17): ExtractVideoRangeInvocation._write_spliced_range 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":"invokeai/app/invocations/video_frame_extract_range.py"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a3da60b953ca146750089f7939f1601e5232e2ff221232312368ed37599c86a"}},{"ruleId":"D1","level":"warning","message":{"text":"run_app.run_app (cyclomatic 17): run_app.run_app 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":"invokeai/app/run_app.py"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebef191ca32225ac279b82523dc8ac11cb038702d2a29c01d15defedeb686a0d"}},{"ruleId":"D1","level":"warning","message":{"text":"FontService._rescan_directory (cyclomatic 17): FontService._rescan_directory 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":"invokeai/app/services/fonts/fonts_default.py"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"80f9ac6dfc9d05cd4e9fe0138bf349cdfba87c1494c43e9170aedeeaa34673a6"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphExecutionState._rehydrate_resolved_if_exec_branches (cyclomatic 17): GraphExecutionState._rehydrate_resolved_if_exec_branches 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":3667}}}],"partialFingerprints":{"codehealthFindingId/v1":"67a3ad2daa74339b46b721d4a6ec8f93a7fe3079514ecc83259a82d6298444b9"}},{"ruleId":"D1","level":"warning","message":{"text":"graph_nested_iterate_planner._prepare_serial_nested_iterate_chain_for_outer (cyclomatic 17): graph_nested_iterate_planner._prepare_serial_nested_iterate_chain_for_outer 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":"invokeai/app/services/shared/graph_nested_iterate_planner.py"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c49a17b5cdd29d995136007916586ff07351dac5e0c62c357b4f671777a6166"}},{"ruleId":"D1","level":"warning","message":{"text":"_GenericGraphSchedulerAdapter.complete (cyclomatic 17): _GenericGraphSchedulerAdapter.complete 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":"invokeai/app/services/shared/graph_scheduler.py"},"region":{"startLine":605}}}],"partialFingerprints":{"codehealthFindingId/v1":"92a3c4cdb3cd7574fafd0cbc29214874e8bd4bb9eeb8c3a613c54f95f74e7e2d"}},{"ruleId":"D1","level":"warning","message":{"text":"workflow_graph_builder._resolve_for_connector_loop_linkage_path (cyclomatic 17): workflow_graph_builder._resolve_for_connector_loop_linkage_path 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":"invokeai/app/services/shared/workflow_graph_builder.py"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0b4bb45feded11667aa6d102178c6b0fd9e91218ee351ebc4b10e1f07d5c042"}},{"ruleId":"D1","level":"warning","message":{"text":"AnimaControlNetLLLite.from_state_dict (cyclomatic 17): AnimaControlNetLLLite.from_state_dict 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":"invokeai/backend/anima/control_net_lllite.py"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"aef58dc303d5163bdb0f2ffd95d1e6c3d0ad0e924255ed70e5d5264b7f594526"}},{"ruleId":"D1","level":"warning","message":{"text":"PromptFormatter.normalize_prompt (cyclomatic 17): PromptFormatter.normalize_prompt has cyclomatic complexity 17 (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":"invokeai/backend/image_util/pngwriter.py"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a893f414449d9052b0544d318ae04051a15d7bf48e831e8640bb8bb4794e80a"}},{"ruleId":"D1","level":"warning","message":{"text":"Config_Base.get_model_discriminator_value (cyclomatic 17): Config_Base.get_model_discriminator_value 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":"invokeai/backend/model_manager/configs/base.py"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ff5f752a425b05ada6828c6a564cd428afc1e2cb793a2dcb036915e59d37cb8"}},{"ruleId":"D1","level":"warning","message":{"text":"z_image._convert_z_image_gguf_to_diffusers (cyclomatic 17): z_image._convert_z_image_gguf_to_diffusers 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":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"26b7d514b6b81edf012535167e4406378618eb6c80d525e3b52cfac369183b72"}},{"ruleId":"D1","level":"warning","message":{"text":"select_hf_files.filter_files (cyclomatic 17): select_hf_files.filter_files 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":"invokeai/backend/model_manager/util/select_hf_files.py"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a2b9ee614f2422f339569e0d903782a7a4bc1e18039221bbb81ef2c0374ec0a"}},{"ruleId":"D1","level":"warning","message":{"text":"TorchDevice.get_generation_devices (cyclomatic 17): TorchDevice.get_generation_devices 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":"invokeai/backend/util/devices.py"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca1271bb2a5272a63d6fd24c625909facb789a3f589ff72fc60bbd6e97a7a2c3"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaImportProcessor.import_image (cyclomatic 17): MediaImportProcessor.import_image 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":"invokeai/frontend/install/import_images.py"},"region":{"startLine":569}}}],"partialFingerprints":{"codehealthFindingId/v1":"24b37fb39af71a3d19b5b42b063d8a9a12d8fdf2197f8b8b92569421f72f076f"}},{"ruleId":"D1","level":"warning","message":{"text":"check_platform_locks.check_torch (cyclomatic 17): check_platform_locks.check_torch 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/check_platform_locks.py"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c3e6e404e9887ae6c2e45b9d39c9287995699bc8bd2cc4188b2c838c950c3f8"}},{"ruleId":"D1","level":"warning","message":{"text":"generate_docs_json._parse_docstring (cyclomatic 17): generate_docs_json._parse_docstring 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/generate_docs_json.py"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e90d8aa3d8032216defe3d7b21eea2c5e6485baea2d41dca5c1f3721e23e037"}},{"ruleId":"D1","level":"warning","message":{"text":"useMediaCookieRefresh.useMediaCookieRefresh (cyclomatic 17): useMediaCookieRefresh.useMediaCookieRefresh 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 99, 136, 151, \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":"invokeai/frontend/webv1/src/features/auth/hooks/useMediaCookieRefresh.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a697424293a8b4f873cad06e653ead635526ed3d939eceff8c41ec20bc4bc54"}},{"ruleId":"D1","level":"warning","message":{"text":"Filter.FilterContentAdvanced (cyclomatic 17): Filter.FilterContentAdvanced has cyclomatic complexity 17 (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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"26ca878aa055d1842e35a9349c3826cec8484f208f69d9347b65e68b4963cf23"}},{"ruleId":"D1","level":"warning","message":{"text":"paramsSlice.applyParamsVersionMigrations (cyclomatic 17): paramsSlice.applyParamsVersionMigrations 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":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":1080}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8ce51094ad12591d2f3ec0c8a907b0530eff7104786cb174afc289ae130178f"}},{"ruleId":"D1","level":"warning","message":{"text":"Editor.createKonvaCropInteractionHandle (cyclomatic 17): Editor.createKonvaCropInteractionHandle 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 4 function literals inside it that branch (lines 446, 434, 466, \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":"invokeai/frontend/webv1/src/features/cropper/lib/editor.ts"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"02408ea089ba96a548665ae71f97f2ada30690bce1353ada3498a9287f3bc18a"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelList.ModelList (cyclomatic 17): ModelList.ModelList has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 6 of the 17 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 63, 99, 153, \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ecd19b34f130a7963b711f5d30d4abffbcd171b1a86d5a89727cd6cf5a9c48b"}},{"ruleId":"D1","level":"warning","message":{"text":"AddNodeCmdk.filter (cyclomatic 17): AddNodeCmdk.filter 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6ddac507f58403f5bc0b83fe2a55f82d6b1f75f39adc9809e0ff1f2addeae77"}},{"ruleId":"D1","level":"warning","message":{"text":"SavedWorkflowFieldInputComponent.SavedWorkflowFieldInputComponent (cyclomatic 17): SavedWorkflowFieldInputComponent.SavedWorkflowFieldInputComponent has cyclomatic complexity 17 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 5 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SavedWorkflowFieldInputComponent.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"671c682c798ee065f3ce07718992d19ea05ca3b21de6f36b13e474bcde1539c2"}},{"ruleId":"D1","level":"warning","message":{"text":"buildSD1Graph.buildSD1Graph (cyclomatic 17): buildSD1Graph.buildSD1Graph 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a96f7a0200ecc30978186e178cfcc599ea0873df7822a90612678486e645479"}},{"ruleId":"D1","level":"warning","message":{"text":"buildWanGraph.buildWanGraph (cyclomatic 17): buildWanGraph.buildWanGraph 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, 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c1c04810ec6f2c39a66ffe5aeb27ba63f3195e52caa6ba91f759fe4d2ae8256"}},{"ruleId":"D1","level":"warning","message":{"text":"UpscaleWarning.UpscaleWarning (cyclomatic 17): UpscaleWarning.UpscaleWarning has cyclomatic complexity 17 (threshold 15). Of this number, 9 points are the body\u0027s own statements and 8 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"68efabb34b79400570894356e258005d866edbab94e9a34bab136a0b1368ccc3"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsModal.SettingsModal (cyclomatic 17): SettingsModal.SettingsModal has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 6 of the 17 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 133, 126, 273). 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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"a80cbfa1def4e787d5a31cdfffb1c335106220432cf9da29407eb271668cdc21"}},{"ruleId":"D1","level":"warning","message":{"text":"settings.getGallerySettings (cyclomatic 17): settings.getGallerySettings 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":"invokeai/frontend/webv2/src/features/gallery/core/settings.ts"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"df2edc6333c6544a15c7e178cff1143e2f61d04b2275dbd93afa499891d7202a"}},{"ruleId":"D1","level":"warning","message":{"text":"GalleryProgressSection.GalleryProgressTile (cyclomatic 17): GalleryProgressSection.GalleryProgressTile has cyclomatic complexity 17 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 3 belong to 3 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryProgressSection.tsx"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a707ffc368548a3a4265b2f939e472e8dae8d53dd1997ae31fd380b2c7108a1"}},{"ruleId":"D1","level":"warning","message":{"text":"VideoModelField.VideoModelField (cyclomatic 17): VideoModelField.VideoModelField has cyclomatic complexity 17 (threshold 15). Of this number, 9 points are the body\u0027s own statements and 8 belong to 4 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":"invokeai/frontend/webv2/src/features/video/ui/VideoModelField.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"50f48040d5d2b996962b8d9651084a4d94e2182e8261deab82f84367214aada2"}},{"ruleId":"D1","level":"warning","message":{"text":"batch.getWorkflowGeneratorPropertyInvalidReason (cyclomatic 17): batch.getWorkflowGeneratorPropertyInvalidReason 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":"invokeai/frontend/webv2/src/features/workflow/core/batch.ts"},"region":{"startLine":401}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ef8421df40cecbe626d837d3a53d323971ca97da2db52ae17e78c9280fa8280"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowLibraryCard.WorkflowLibraryCard (cyclomatic 17): WorkflowLibraryCard.WorkflowLibraryCard 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, 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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryCard.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"917c9561d6eaa5c3cedafb9df1471691ceef3cba2049e693b28c0249c17637a7"}},{"ruleId":"D1","level":"warning","message":{"text":"useEraser.useEraser (cyclomatic 17): useEraser.useEraser has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 2 of the 17 points are its own statements and the rest belongs to 4 function items inside it that branch (eraseSegment, onPointerDownCapture, addPoint, \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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/useEraser.tsx"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"e63bbb1425c9265813535e2b07d4f1653103ad96e62cba8578efebc957e62ece"}},{"ruleId":"D1","level":"warning","message":{"text":"NumericInput.NumericInput (cyclomatic 17): NumericInput.NumericInput has cyclomatic complexity 17 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 5 belong to 3 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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/NumericInput.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"465fd24b28813e3484bb69e51648c1dcee95227bc315f8b697169aeaa9d27108"}},{"ruleId":"D1","level":"warning","message":{"text":"selectorCore.shallowEqual (cyclomatic 17): selectorCore.shallowEqual has cyclomatic complexity 17 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, 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":"invokeai/frontend/webv2/src/platform/state/selectorCore.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"11d1e7d2a76be05bf4fa7aaa827e6b83fa86788525be8b2a235a055e64ca5344"}},{"ruleId":"D1","level":"warning","message":{"text":"FeatureHint.createHintSession.startCorridor (cyclomatic 17): FeatureHint.createHintSession.startCorridor 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 3 function items inside it that branch (isOverCard, a function literal at line 178, a function literal at line 196). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/hints/FeatureHint.tsx"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"86be493f89571c0fa3c156ebf1af9da1f8b7f9b972fe25d5d154fbf62f966802"}},{"ruleId":"D1","level":"warning","message":{"text":"draftStore.decideUnloadJournalEntry (cyclomatic 17): draftStore.decideUnloadJournalEntry has cyclomatic complexity 17 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 1 belongs 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. This is NOT this file\u0027s highest cyclomatic complexity: draftStore.isProjectUnloadJournalEntry (cyclomatic 24) 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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":802}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fb60b2b8ef34346b05e3fb5f393a779fe3a1ef83f42ff35326624d37b479e8b"}},{"ruleId":"D1","level":"warning","message":{"text":"durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::stageProject (cyclomatic 17): durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::stageProject 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. This shape REPEATS in the file: 4 other methods here (durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject::pushHalves, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject::reconcile, \u2026) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 5 times rather than 5 independent problems. Splitting this body alone leaves the other 4 exactly as they are. Where these are variations on one operation, the change that clears all 5 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":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":1066}}}],"partialFingerprints":{"codehealthFindingId/v1":"be9b78136e0aa1d3b92f36fae6f9ba10d930c74b3071c02f12ab819d9a9b608a"}},{"ruleId":"D1","level":"warning","message":{"text":"useStagedResultGallerySave.useStagedResultGallerySave.save (cyclomatic 17): useStagedResultGallerySave.useStagedResultGallerySave.save 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 items inside it that branch (run, a function literal at line 145). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/useStagedResultGallerySave.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d0c6ba8820937eb938ee31c6a5656e7f41ed11da35414521634e7cf50b510d2"}},{"ruleId":"D1","level":"warning","message":{"text":"useLayerStackActions.useLayerStackActions (cyclomatic 17): useLayerStackActions.useLayerStackActions has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 2 of the 17 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 61, 69, 100, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/useLayerStackActions.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa420ebba0e5d68b2a9c18bff45dded9530c4849b130df40e0acd0f37e58db2e"}},{"ruleId":"D1","level":"warning","message":{"text":"LayerSurfaceHost.LayerSurfaceHost (cyclomatic 17): LayerSurfaceHost.LayerSurfaceHost has cyclomatic complexity 17 (threshold 15). Of this number, 10 points are the body\u0027s own statements and 7 belong to 3 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerSurfaceHost.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"89266e4c086d5958fb64f454bf6daa8b6ec31bf7608f28549133032fda16d938"}},{"ruleId":"D1","level":"warning","message":{"text":"LayerSection.resolveChildEditor (cyclomatic 17): LayerSection.resolveChildEditor 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/LayerSection.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"38a082e118140ddbf34a8ade2675e8e8b8e07ed60833460b11f93c1ae44395e2"}},{"ruleId":"D1","level":"warning","message":{"text":"documentModel.createDocumentModel::prepareInsert (cyclomatic 17): documentModel.createDocumentModel::prepareInsert 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. This shape REPEATS in the file: one other method here (documentModel.createDocumentModel::checkReparent) 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts"},"region":{"startLine":530}}}],"partialFingerprints":{"codehealthFindingId/v1":"81a19d5fdc2142bb5e9d3b6d5a3c5388fbe7bd3bdf97037af39e87f3c3d91952"}},{"ruleId":"D1","level":"warning","message":{"text":"compositor.drawCachedLayer (cyclomatic 17): compositor.drawCachedLayer 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositor.ts"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"e32097ba11409e1b63739883357316f727bac52d8583fc0eab3bb47b09d8ad6e"}},{"ruleId":"D1","level":"warning","message":{"text":"ThumbnailController.draw (cyclomatic 17): ThumbnailController.draw 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/thumbnailController.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"819b6455dc899be9c9eda00b43402e4062598e6a9571b97e16d685254a0e68a9"}},{"ruleId":"D1","level":"warning","message":{"text":"ThumbnailController.request (cyclomatic 17): ThumbnailController.request 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/thumbnailController.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"10a35be96b0bfdf2898ebbbe514dc9c33e189b63842ab7a40146c283cc491d27"}},{"ruleId":"D1","level":"warning","message":{"text":"compositeFrame.createCompositeFrame.draw (cyclomatic 17): compositeFrame.createCompositeFrame.draw 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositeFrame.ts"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"78d9ad3319653a430a84e3500e09febc84bedce146f965956a8a17c1d039673c"}},{"ruleId":"D1","level":"warning","message":{"text":"imageRecall.getMetadataConcepts (cyclomatic 17): imageRecall.getMetadataConcepts 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. This is NOT this file\u0027s highest cyclomatic complexity: imageRecall.getImageRecallCapabilities (cyclomatic 34) 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":"invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts"},"region":{"startLine":872}}}],"partialFingerprints":{"codehealthFindingId/v1":"861f8c056f7ac0e4fe87849f7c99d2616be42c59e85355defbbd254f3d9033af"}},{"ruleId":"D1","level":"warning","message":{"text":"usePaletteNavigation.usePaletteNavigation.onSearchKeyDown (cyclomatic 17): usePaletteNavigation.usePaletteNavigation.onSearchKeyDown 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":"invokeai/frontend/webv2/src/workbench/palette/usePaletteNavigation.ts"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e37149f0ef0afd069c57f7c1b4d34227ed9b63219c666b03e0e59a24cd613d6"}},{"ruleId":"D1","level":"warning","message":{"text":"queueRecall.buildQueueRecallValues (cyclomatic 17): queueRecall.buildQueueRecallValues 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":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRecall.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"e67ec7a563fda42778c8df8155bd60b200818403366029e151c034160728e92a"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsDialog.SettingsDialog (cyclomatic 17): SettingsDialog.SettingsDialog has cyclomatic complexity 17 (threshold 15). Of this number, 9 points are the body\u0027s own statements and 8 belong to 5 function literals inside it that branch. To reduce it, 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":"invokeai/frontend/webv2/src/workbench/settings/SettingsDialog.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"b074c77dda1f0d761eb5661adc0ad97989cf47fa6964c9202bdf5589a1c1ed36"}},{"ruleId":"D1","level":"warning","message":{"text":"CenterArea.CenterArea (cyclomatic 17): CenterArea.CenterArea has cyclomatic complexity 17 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 3 belong to 3 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":"invokeai/frontend/webv2/src/workbench/shell/CenterArea.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4dd73735fa557ffb19be290f6ce68b550375cb72fab868c288393b9188d01f0"}},{"ruleId":"D1","level":"warning","message":{"text":"WidgetFrames.WidgetPanelFrame (cyclomatic 17): WidgetFrames.WidgetPanelFrame has cyclomatic complexity 17 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 5 belong to 3 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":"invokeai/frontend/webv2/src/workbench/widget-frame/WidgetFrames.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"e69f486a0711a84c85975802758e28c193a64fc12c4bf6bfb457272184ba9d88"}},{"ruleId":"D1","level":"warning","message":{"text":"QwenImagePiDDecodeInvocation.invoke (cyclomatic 16): QwenImagePiDDecodeInvocation.invoke 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":"invokeai/app/invocations/pid/qwen_image_pid_decode.py"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"2db2153db339c40660036956718f7ebc44e6a5c717d7b0be6f9e458e11ec91be"}},{"ruleId":"D1","level":"warning","message":{"text":"config_default.migrate_v3_config_dict (cyclomatic 16): config_default.migrate_v3_config_dict 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":"invokeai/app/services/config/config_default.py"},"region":{"startLine":570}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ad25d23901d829e39ec56937366dc3015d18d3612d3d45d216a33cd19752f84"}},{"ruleId":"D1","level":"warning","message":{"text":"image_index_common.blobs_to_embeddings (cyclomatic 16): image_index_common.blobs_to_embeddings 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":"invokeai/app/services/image_index/image_index_common.py"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8ac93a60797ea61e5dfb6a5617c192ed1bba5723d5a4c086d4b108a53e61538"}},{"ruleId":"D1","level":"warning","message":{"text":"ImageIndexService._process_batch (cyclomatic 16): ImageIndexService._process_batch 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":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1352}}}],"partialFingerprints":{"codehealthFindingId/v1":"31e8e29c3128fcf807ead11ce0e4a29eab27e7724e8e60a6a81102a391074480"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelInstallService._resume_remote_download (cyclomatic 16): ModelInstallService._resume_remote_download 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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":625}}}],"partialFingerprints":{"codehealthFindingId/v1":"46e00ce774492fe31e12e5dfed6b77b5366fd24f88701ebf8deb9dd570098153"}},{"ruleId":"D1","level":"warning","message":{"text":"images._conditions (cyclomatic 16): images._conditions 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":"invokeai/app/services/shared/database/queries/images.py"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"6966a2412aaef2d1c85610a2ddf6789a6acf91b8c9c7374c982e50b827ff867f"}},{"ruleId":"D1","level":"warning","message":{"text":"ContinuationRecord.transition (cyclomatic 16): ContinuationRecord.transition 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":"invokeai/app/services/shared/execution_engine/primitives.py"},"region":{"startLine":470}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdfabf4d4ebafddf9ed3c242277d6682b99241df5b254df1e17b3d70e5e7aeab"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphExecutionState._validate_for_continuation_output (cyclomatic 16): GraphExecutionState._validate_for_continuation_output 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":2019}}}],"partialFingerprints":{"codehealthFindingId/v1":"e887061dc5bc08ea86d73543cb1abbc88d25ddc0dcbea0ba8eba1e5fa63804db"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphExecutionState._validate_output_owner (cyclomatic 16): GraphExecutionState._validate_output_owner 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":2531}}}],"partialFingerprints":{"codehealthFindingId/v1":"836f4c863a38f1471d1d4b3d9c15cccfdb76c11652c7890cfc143654f19e51d9"}},{"ruleId":"D1","level":"warning","message":{"text":"_ExecutionNodeBuilder._expand_root_if_for_completed_collect_branch (cyclomatic 16): _ExecutionNodeBuilder._expand_root_if_for_completed_collect_branch 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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":2170}}}],"partialFingerprints":{"codehealthFindingId/v1":"11c5ef1a7d5aee476631e24e88e5c9687c38c9171df5db7f7fbc650ee46e82c4"}},{"ruleId":"D1","level":"warning","message":{"text":"graph_nested_iterate_planner._get_exact_nested_iterate_body (cyclomatic 16): graph_nested_iterate_planner._get_exact_nested_iterate_body 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":"invokeai/app/services/shared/graph_nested_iterate_planner.py"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"204cfb0cfb2978ac40b2055d5fb9ce02fea5fd427935dbbf12d8ce5dc016d9b1"}},{"ruleId":"D1","level":"warning","message":{"text":"Graph._get_upstream_collector_ids (cyclomatic 16): Graph._get_upstream_collector_ids 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":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":737}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f170afd96e29db0d120c8f33c0124d3a96fed7b05c5ebd4d93daa296b20ae60"}},{"ruleId":"D1","level":"warning","message":{"text":"graph_validation.are_connection_types_compatible (cyclomatic 16): graph_validation.are_connection_types_compatible 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":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a35a560d97e7a2251b3b67a881e5bd81ee6b1a1330732229d8c1a2a7f8f4059"}},{"ruleId":"D1","level":"warning","message":{"text":"workflow_call_compatibility._get_placeholder_for_annotation (cyclomatic 16): workflow_call_compatibility._get_placeholder_for_annotation 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":"invokeai/app/services/shared/workflow_call_compatibility.py"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0e8f2674b7787042cb8503565fc26abfe2a6f2a7fe775848c4b83ba1da102d0"}},{"ruleId":"D1","level":"warning","message":{"text":"video_thumbnails._iter_video_frames_unbounded (cyclomatic 16): video_thumbnails._iter_video_frames_unbounded 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":"invokeai/app/util/video_thumbnails.py"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"49d246f4e54a022c7f9e0049168da80d815ec6f2a97fab349bc76492657afe04"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelConfigFactory.from_model_on_disk (cyclomatic 16): ModelConfigFactory.from_model_on_disk has cyclomatic complexity 16 (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":"invokeai/backend/model_manager/configs/factory.py"},"region":{"startLine":865}}}],"partialFingerprints":{"codehealthFindingId/v1":"014e75cb25e1372a7db733f2313ad1f6f681d00dbbe49e56ce0fa36005d1a1d7"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelLoader._load_and_cache (cyclomatic 16): ModelLoader._load_and_cache 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":"invokeai/backend/model_manager/load/load_default.py"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"06cfc156a9c3dd58cfc4eac4ca3498e3d5e341088672e7c5ff86f75c5f7cc856"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelCache._log_cache_state (cyclomatic 16): ModelCache._log_cache_state 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":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2655}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bacffdb5030faf65dc8deadb3d216357856e8c33e9df516675a04a059c59495"}},{"ruleId":"D1","level":"warning","message":{"text":"Flux2DiffusersModel._load_model (cyclomatic 16): Flux2DiffusersModel._load_model 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":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":1148}}}],"partialFingerprints":{"codehealthFindingId/v1":"408a4d58a2523bdde5f8319b914521b722eeb144d56d06d41940f2d20f9f1500"}},{"ruleId":"D1","level":"warning","message":{"text":"GenericDiffusersLoader.get_hf_load_class (cyclomatic 16): GenericDiffusersLoader.get_hf_load_class 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":"invokeai/backend/model_manager/load/model_loaders/generic_diffusers.py"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"849b3875248ac4ad4ab11daef7737a1c0f0b5d84598d82808420d88519786d21"}},{"ruleId":"D1","level":"warning","message":{"text":"Ideogram4CheckpointModel._load_model (cyclomatic 16): Ideogram4CheckpointModel._load_model 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":"invokeai/backend/model_manager/load/model_loaders/ideogram4.py"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"730379f1bc7c0e949f9b50bcf687c5a0eba744802e427b0c79efd8e4c664ca33"}},{"ruleId":"D1","level":"warning","message":{"text":"HuggingFaceMetadataFetch.from_id (cyclomatic 16): HuggingFaceMetadataFetch.from_id 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":"invokeai/backend/model_manager/metadata/fetch/huggingface.py"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"caac6965f412fe49e200a690497663c6fe55d469aa7389fd2a401863b2450796"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelSearch._walk_directory (cyclomatic 16): ModelSearch._walk_directory has cyclomatic complexity 16 (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":"invokeai/backend/model_manager/search.py"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bf78b46b782a050fd6b21c1b87ce95df0df6275cca86b6c5c2dbff83fabb061"}},{"ruleId":"D1","level":"warning","message":{"text":"model_util.lora_token_vector_length (cyclomatic 16): model_util.lora_token_vector_length 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":"invokeai/backend/model_manager/util/model_util.py"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"41a794133a3bc3b4b791ec047b074ed71574f89386026efef245a4763986f54f"}},{"ruleId":"D1","level":"warning","message":{"text":"ggml_tensor.dequantize_and_run (cyclomatic 16): ggml_tensor.dequantize_and_run 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":"invokeai/backend/quantization/gguf/ggml_tensor.py"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3cfa5faf2b17dfc0ddb591d44deac6c4262386bfa75d00b6dc21033dbf6434b"}},{"ruleId":"D1","level":"warning","message":{"text":"loaders.gguf_sd_loader (cyclomatic 16): loaders.gguf_sd_loader 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":"invokeai/backend/quantization/gguf/loaders.py"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d48fcb56d7e72999773dac2668e0d3a11b01c901e3941a59fdab99fe1902add"}},{"ruleId":"D1","level":"warning","message":{"text":"calibrate_wan_vae_working_memory._measure (cyclomatic 16): calibrate_wan_vae_working_memory._measure 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":"scripts/calibrate_wan_vae_working_memory.py"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d406db23b033f9a2876440d9d8035265e0f5cee79158950707e4a13f4888414"}},{"ruleId":"D1","level":"warning","message":{"text":"typegen.generateTypes (cyclomatic 16): typegen.generateTypes has cyclomatic complexity 16 (threshold 15). Of this number, 10 points are the body\u0027s own statements and 6 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":"invokeai/frontend/api/scripts/typegen.js"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"802cc7d0734989d3e3e4857b90e8c35850b9b279f3f6363c913f12c324ce7f90"}},{"ruleId":"D1","level":"warning","message":{"text":"promptAttention.selectTerminals (cyclomatic 16): promptAttention.selectTerminals has cyclomatic complexity 16 (threshold 15). 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 370, 396). 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":"invokeai/frontend/webv1/src/common/util/promptAttention.ts"},"region":{"startLine":369}}}],"partialFingerprints":{"codehealthFindingId/v1":"31157f957eeb545e429c9351376940b0271fe0d27963a2143d305cbd7fda8eb0"}},{"ruleId":"D1","level":"warning","message":{"text":"CanvasEntityAdapterControlLayer.sync (cyclomatic 16): CanvasEntityAdapterControlLayer.sync 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterControlLayer.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed179d46f7cf1c56f17aabc0e94be16492a6e0eaeb9692b60d7e84d249168635"}},{"ruleId":"D1","level":"warning","message":{"text":"CanvasEntityTransformer.syncInteractionState (cyclomatic 16): CanvasEntityTransformer.syncInteractionState 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":664}}}],"partialFingerprints":{"codehealthFindingId/v1":"31d26787ea558a8310a8487981ff2ed050db3e392a4009a6b14ebcd2e8d2a06f"}},{"ruleId":"D1","level":"warning","message":{"text":"GalleryImage.buildOnClick (cyclomatic 16): GalleryImage.buildOnClick 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 one function literal inside it that branches (line 42). 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":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2c6f1f81225f3b5e8a16d17cb4e829be3a89a47965da4df623a5c6e1c23ec4d"}},{"ruleId":"D1","level":"warning","message":{"text":"CurrentImageButtons.CurrentImageButtons (cyclomatic 16): CurrentImageButtons.CurrentImageButtons 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, 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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ccd759f62a816e192b9fe2b8526d153a9a1b2e879e3f92660f233ecec75fea7"}},{"ruleId":"D1","level":"warning","message":{"text":"selectedItemReveal.createSelectedItemRevealMachine.sync (cyclomatic 16): selectedItemReveal.createSelectedItemRevealMachine.sync 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, 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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/selectedItemReveal.ts"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f3cd65ddf9238753e744a38b39c83c0e0838aad885043f5d78f0de94a19fe77"}},{"ruleId":"D1","level":"warning","message":{"text":"ExternalProvidersForm.ProviderCard (cyclomatic 16): ExternalProvidersForm.ProviderCard 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 4 function literals inside it that branch (lines 184, 205, 177, \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ExternalProviders/ExternalProvidersForm.tsx"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa58e9a77a470ccb7b40b5aa619d10cf1dc17e7c4f70fb5c6cdbf29926f8be95"}},{"ruleId":"D1","level":"warning","message":{"text":"buildExternalGraph.buildExternalGraph (cyclomatic 16): buildExternalGraph.buildExternalGraph 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d3b313166b9c3dd4ea3ab1f5fb26c8a28b5c47a3b39c0caf62b86411af33da6"}},{"ruleId":"D1","level":"warning","message":{"text":"buildSD3Graph.buildSD3Graph (cyclomatic 16): buildSD3Graph.buildSD3Graph 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"bff5b86108f42a0c66b7bd9543c88bc7c94123afe71a80a969b88649a99c9b88"}},{"ruleId":"D1","level":"warning","message":{"text":"validateWorkflow.refreshCallSavedWorkflowDynamicInputs (cyclomatic 16): validateWorkflow.refreshCallSavedWorkflowDynamicInputs 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":"invokeai/frontend/webv1/src/features/nodes/util/workflow/validateWorkflow.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed479e2e3bedd529c0e589fc8f5a4ec42d812b8bf88e6da328c12800b76583a0"}},{"ruleId":"D1","level":"warning","message":{"text":"ExpandPromptButton.ExpandPromptButton (cyclomatic 16): ExpandPromptButton.ExpandPromptButton has cyclomatic complexity 16 (threshold 15). Of this number, 8 points are the body\u0027s own statements and 8 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"df2a94407914205731cc35adb3192580babc5d3dc35e31ae15a11bef37afe19b"}},{"ruleId":"D1","level":"warning","message":{"text":"readiness.pushWanReasons (cyclomatic 16): readiness.pushWanReasons 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":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"d754cc9543f9e0dfa2d120c2561cea2fe22774c74bd0e947618ff62db30b9856"}},{"ruleId":"D1","level":"warning","message":{"text":"readiness.getReasonsWhyCannotEnqueueWorkflowsTab (cyclomatic 16): readiness.getReasonsWhyCannotEnqueueWorkflowsTab has cyclomatic complexity 16 (threshold 15). Of this number, 13 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":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":642}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cda538b548e9121a9819b519fc8ebca46c91bf8c2798ec086a896651ea11626"}},{"ruleId":"D1","level":"warning","message":{"text":"GalleryWidgetView.GalleryWidgetView (cyclomatic 16): GalleryWidgetView.GalleryWidgetView has cyclomatic complexity 16 (threshold 15). Of this number, 9 points are the body\u0027s own statements and 7 belong to 4 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryWidgetView.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"a56582bc4ce35dd8f434360691a80912c7214b9d27ce0466f4f4500353395544"}},{"ruleId":"D1","level":"warning","message":{"text":"promptFocus.getActiveTriggerQuery (cyclomatic 16): promptFocus.getActiveTriggerQuery 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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/promptFocus.ts"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"586aa0b5b93dbecf98dfd64e9b1578aeb3429d9610ce5f5e12afb88cc4a888ef"}},{"ruleId":"D1","level":"warning","message":{"text":"RelatedModelsSection.RelatedModelsForModel (cyclomatic 16): RelatedModelsSection.RelatedModelsForModel 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 4 function items inside it that branch (handleAdd, handleRemove, a function literal at line 45, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/detail/RelatedModelsSection.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7b464bd2b6200ea0db2ee31034d39fd8a0b6ec6b0c312125942261064e0b68a"}},{"ruleId":"D1","level":"warning","message":{"text":"coordinator.createQueueCoordinator.handleStatusChanged (cyclomatic 16): coordinator.createQueueCoordinator.handleStatusChanged 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":"invokeai/frontend/webv2/src/features/queue/runtime/coordinator.ts"},"region":{"startLine":771}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bf744e28a188cc7f5e6dd8df6519a53cf0f8963ce067f541c48a21a57cab7ce"}},{"ruleId":"D1","level":"warning","message":{"text":"InvocationCacheFooter.InvocationCacheFooter (cyclomatic 16): InvocationCacheFooter.InvocationCacheFooter has cyclomatic complexity 16 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 3 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":"invokeai/frontend/webv2/src/features/queue/ui/InvocationCacheFooter.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea59f68a811afbbff45fa619d53faae7984e01ae6d6e5ef1a05861cc54dba871"}},{"ruleId":"D1","level":"warning","message":{"text":"settings.cloneVideoWidgetValues (cyclomatic 16): settings.cloneVideoWidgetValues 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, 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":"invokeai/frontend/webv2/src/features/video/core/settings.ts"},"region":{"startLine":520}}}],"partialFingerprints":{"codehealthFindingId/v1":"7265141ef80b43e24d1fc95d610931d1a6aab94d16aed575dd771fb8b33801b9"}},{"ruleId":"D1","level":"warning","message":{"text":"document.updateInvocationNodeToTemplate (cyclomatic 16): document.updateInvocationNodeToTemplate 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. This is NOT this file\u0027s highest cyclomatic complexity: document.isFormElementLike (cyclomatic 17) 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":"invokeai/frontend/webv2/src/features/workflow/core/document.ts"},"region":{"startLine":499}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e1cb9f1a8eabf52b91bf972a2b7bd1fa9b7ff1c7169182181ab41f9c6d41394"}},{"ruleId":"D1","level":"warning","message":{"text":"WorkflowLibraryGrid.WorkflowLibraryGrid (cyclomatic 16): WorkflowLibraryGrid.WorkflowLibraryGrid has cyclomatic complexity 16 (threshold 15). Of this number, 11 points are the body\u0027s own statements and 5 belong to 3 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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryGrid.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"04086f822fb0cdff014de079ff61cd6faf1bf07b78bb452e0ed12f440145223e"}},{"ruleId":"D1","level":"warning","message":{"text":"Combobox.Combobox (cyclomatic 16): Combobox.Combobox 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 10 function literals inside it that branch (lines 78, 118, 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":"invokeai/frontend/webv2/src/platform/ui/Combobox.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"04954dfbbefabaf8de7d7e7f5cd71cd2b3dccb294366f4055dcd052c79c506ea"}},{"ruleId":"D1","level":"warning","message":{"text":"ManagerLayout.ManagerLayout::watchFocus::tick (cyclomatic 16): ManagerLayout.ManagerLayout::watchFocus::tick has cyclomatic complexity 16 (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":"invokeai/frontend/webv2/src/platform/ui/ManagerLayout.tsx"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b876c584e74f4858b000120291550a09386d01d72a715fc2b0857da45cc71f8"}},{"ruleId":"D1","level":"warning","message":{"text":"api.settleProjectCreate (cyclomatic 16): api.settleProjectCreate has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 7 of the 16 points are its own statements and the rest belongs to 3 function items inside it that branch (settleConflict, settleUnanswered, classify). 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":"invokeai/frontend/webv2/src/workbench/projects/api.ts"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"953376249ca601e5581bd269a2c90aec9f7cf5b3421529a8d99008c72351ce56"}},{"ruleId":"D1","level":"warning","message":{"text":"ImageMapDataRuntime.attachImageMapDataRuntime (cyclomatic 16): ImageMapDataRuntime.attachImageMapDataRuntime 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 7 function items inside it that branch (refreshProjectionReady, a function literal at line 121, refreshIfLoaded, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapDataRuntime.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc798a98ae7e84ed3598943c14b89f9f5af77a68c120f361af571b027001598d"}},{"ruleId":"D1","level":"warning","message":{"text":"PreviewHeaderActions.PreviewHeaderActions (cyclomatic 16): PreviewHeaderActions.PreviewHeaderActions has cyclomatic complexity 16 (threshold 15). Of this number, 14 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewHeaderActions.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"cce527b28340bccc4cefbb1697b6f7ba0ad48f3b1335e05fa56038b9859b38f4"}},{"ruleId":"D1","level":"warning","message":{"text":"floatingWindows.validateFloatingWidgets (cyclomatic 16): floatingWindows.validateFloatingWidgets has cyclomatic complexity 16 (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":"invokeai/frontend/webv2/src/workbench/floatingWindows.ts"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"523fa4ff6c296c6ed5665599932825151bd898d4ff701b60256a2e6742066083"}},{"ruleId":"D1","level":"warning","message":{"text":"canvasDimsSync.reconcileCanvasDims (cyclomatic 16): canvasDimsSync.reconcileCanvasDims has cyclomatic complexity 16 (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":"invokeai/frontend/webv2/src/workbench/canvasDimsSync.ts"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"815af40016a7338817b246420222825079c0e62d720512bf2c7f3e222cf12042"}},{"ruleId":"D1","level":"warning","message":{"text":"invocationSubmit.submitResolvedInvocation (cyclomatic 16): invocationSubmit.submitResolvedInvocation 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":"invokeai/frontend/webv2/src/workbench/invocationSubmit.ts"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2b1e1a454cb6d92e019f8c07eead93f3358dd2ad33e0af6734ad3179d7e21ab"}},{"ruleId":"D1","level":"warning","message":{"text":"FloatingSelectionController.lift (cyclomatic 16): FloatingSelectionController.lift 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/floatingSelectionController.ts"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"93425e1174f454d6b36f9c152c09cde1163ca584dc2708d8f4e633d4ff6f6d94"}},{"ruleId":"D1","level":"warning","message":{"text":"LayerMutationController.convert (cyclomatic 16): LayerMutationController.convert has cyclomatic complexity 16 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 4 belong to 3 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e0102e4d3bd1493c49b2ec2ff25df7414ab6adfe2456f7f69165437aca71cd8"}},{"ruleId":"D1","level":"warning","message":{"text":"bitmapStore.createBitmapStore.flushPendingUploads (cyclomatic 16): bitmapStore.createBitmapStore.flushPendingUploads has cyclomatic complexity 16 (threshold 15). 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, 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts"},"region":{"startLine":668}}}],"partialFingerprints":{"codehealthFindingId/v1":"a86e9ff86c1b9ec6470fed5457267e4dac00f22974a8dbeba4537661d9ecef3e"}},{"ruleId":"D1","level":"warning","message":{"text":"documentMirror.createDocumentMirror.refresh (cyclomatic 16): documentMirror.createDocumentMirror.refresh 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentMirror.ts"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"d51e32724db7bd7ff497ad66d5d49774b8644ba4f9034788edf4e1da25030e5b"}},{"ruleId":"D1","level":"warning","message":{"text":"SelectObjectCoordinator.createSelectObjectOperationCoordinator.apply (cyclomatic 16): SelectObjectCoordinator.createSelectObjectOperationCoordinator.apply 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/SelectObjectCoordinator.ts"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"c132213ccef284552ee94c7914542504f9675f856bf12b4eaa6273b6c92ec9a1"}},{"ruleId":"D1","level":"warning","message":{"text":"filterGraphs.resolveSettings (cyclomatic 16): filterGraphs.resolveSettings has cyclomatic complexity 16 (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":"invokeai/frontend/webv2/src/workbench/canvas-operations/filterGraphs.ts"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4a44379495eb1de78a51dd76d679b45fe381117f1d4eca57c53cb9434ae6bb3"}},{"ruleId":"D1","level":"warning","message":{"text":"filterGraphs.buildFilterGraph (cyclomatic 16): filterGraphs.buildFilterGraph 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/filterGraphs.ts"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fe677749f2df9af5f87fab859d59475a7f52d2f1a20d10a5a213c81251f9c4e"}},{"ruleId":"D1","level":"warning","message":{"text":"executeImageRecall.executeImageRecall (cyclomatic 16): executeImageRecall.executeImageRecall 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":"invokeai/frontend/webv2/src/workbench/image-actions/executeImageRecall.ts"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"603a81c356049cb109fd995c4850d39ec0318de3a8c857c160e16dfeccb4e982"}},{"ruleId":"D1","level":"warning","message":{"text":"videoRecall.getRecallableReferences (cyclomatic 16): videoRecall.getRecallableReferences 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 one function literal inside it that branches (line 446). 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":"invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bfd51f794a05a6729e007385908b2f01585550de21d0dd67e36e98a8ba80f41"}},{"ruleId":"D1","level":"warning","message":{"text":"entries.buildSettingsEntries (cyclomatic 16): entries.buildSettingsEntries 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 330, 422, 421). 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":"invokeai/frontend/webv2/src/workbench/palette/entries.ts"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"356f9d742bfcfb241a99a51fca16ebf4d75409ad3a9507f709394fdccfe8d222"}},{"ruleId":"D1","level":"warning","message":{"text":"fonts.readEmbeddedFonts (cyclomatic 16): fonts.readEmbeddedFonts 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":"invokeai/frontend/webv2/src/workbench/projects/invk/fonts.ts"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"db45916ca80b0ecdfc34dffaef29da1223f224b3914199a8e0837b5b5180aa44"}},{"ruleId":"D1","level":"warning","message":{"text":"importProject.readInvkArchive (cyclomatic 16): importProject.readInvkArchive 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":"invokeai/frontend/webv2/src/workbench/projects/invk/importProject.ts"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9c8c95d99229ffa020618e48863d5b3e53115d8f743bab23cef0e3eed388036"}},{"ruleId":"D1","level":"warning","message":{"text":"HotkeysSettingsSection.canScopesOverlap (cyclomatic 16): HotkeysSettingsSection.canScopesOverlap 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":"invokeai/frontend/webv2/src/workbench/settings/HotkeysSettingsSection.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"b79022726a0c6d68344f01b5d3dc562dd238620f3d492a54eafeb63137a8b3a8"}},{"ruleId":"D2","level":"warning","message":{"text":"mock-backend.startMockBackend.server (cognitive 888): mock-backend.startMockBackend.server has cognitive complexity 888 (threshold 15). Drivers by points: if/else 244 (489 pts), boolean chains 167, ternaries 67 (164 pts), loops 23 (65 pts), error handling 2 (3 pts) (nesting depth added 385). Of this number, 874 points are the body\u0027s own statements and 14 belong to 11 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":"invokeai/frontend/webv2/scripts/mock-backend.mjs"},"region":{"startLine":937}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5b56772647229168898787ed8a2b7d01a4072294af142e810a9b1a5ae1185dd"}},{"ruleId":"D2","level":"warning","message":{"text":"modelSelected.addModelSelectedListener (cognitive 565): modelSelected.addModelSelectedListener has cognitive complexity 565 (threshold 15). Drivers by points: if/else 145 (452 pts), ternaries 14 (57 pts), boolean chains 48, loops 3 (8 pts) (nesting depth added 355). None of this is in the body itself: all 565 points belong to 9 function literals inside it that branch (lines 100, 739, 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":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"369c910fa29a9f18852913af8f869d8a3bcb40ecb5033ce2b9b57ca9e9c48bb6"}},{"ruleId":"D2","level":"warning","message":{"text":"workbenchState.__workbenchReducerInternal (cognitive 460): workbenchState.__workbenchReducerInternal has cognitive complexity 460 (threshold 15). Drivers by points: ternaries 112 (244 pts), if/else 71 (144 pts), boolean chains 65, loops 3 (6 pts), match/switch 1 (nesting depth added 208). Of this number, 151 points are the body\u0027s own statements and 309 belong to 70 function literals inside it that branch. 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":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":3890}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0d849040e6d9d890455316f9e48aab464a0197f9e09fa23ba34a04e00ecc071"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryImageGrid.GalleryImageGrid (cognitive 445): GalleryImageGrid.GalleryImageGrid has cognitive complexity 445 (threshold 15). Drivers by points: ternaries 92 (201 pts), if/else 89 (144 pts), boolean chains 91, loops 5 (9 pts) (nesting depth added 168). Of this number, 136 points are the body\u0027s own statements and 309 belong to 47 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.tsx"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4c015c40ab073bb0e5c0b29ea40ad3153c6c418828f44f2d36f6f7dce66fa24"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._validate_effects (cognitive 360): GraphExecutionState._validate_effects has cognitive complexity 360 (threshold 15). Drivers by points: if/else 90 (246 pts), ternaries 29 (85 pts), boolean chains 24, error handling 1 (3 pts), loops 2 (nesting depth added 214). 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":2565}}}],"partialFingerprints":{"codehealthFindingId/v1":"8777610352b5c2bd4043ea47bc0aa9b2cea9c240fdbeeb9478841b009f08558d"}},{"ruleId":"D2","level":"warning","message":{"text":"readiness.getReasonsWhyCannotEnqueueCanvasTab (cognitive 300): readiness.getReasonsWhyCannotEnqueueCanvasTab has cognitive complexity 300 (threshold 15). Drivers by points: if/else 128 (274 pts), boolean chains 24, loops 1 (2 pts) (nesting depth added 147). Of this number, 294 points are the body\u0027s own statements and 6 belong to 5 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":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":773}}}],"partialFingerprints":{"codehealthFindingId/v1":"bff510f74e6adacf3e6667d420b51ce18958f6c327b4ca0a9d73fa48924592bb"}},{"ruleId":"D2","level":"warning","message":{"text":"LayersTree.LayersTree (cognitive 272): LayersTree.LayersTree has cognitive complexity 272 (threshold 15). Drivers by points: if/else 96 (125 pts), ternaries 61 (89 pts), boolean chains 53, loops 4 (5 pts) (nesting depth added 58). Of this number, 37 points are the body\u0027s own statements and 235 belong to 49 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayersTree.tsx"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c797fb7ab935ecfd534390cddeecb086a1c07bcf8a5759af955ffe2ff089c6d"}},{"ruleId":"D2","level":"warning","message":{"text":"setEventListeners.setEventListeners (cognitive 257): setEventListeners.setEventListeners has cognitive complexity 257 (threshold 15). Drivers by points: if/else 73 (141 pts), ternaries 16 (68 pts), boolean chains 24, error handling 4 (19 pts), loops 3 (5 pts) (nesting depth added 137). None of this is in the body itself: all 257 points belong to 36 function items inside it that branch (a function literal at line 544, a function literal at line 786, a function literal at line 669, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"44743b33917a5b9f7c2ee4a2dec708d3040daa2aeb7c8eba5e1cfb523512b300"}},{"ruleId":"D2","level":"warning","message":{"text":"recallParameters.buildRecallParametersSettings (cognitive 173): recallParameters.buildRecallParametersSettings has cognitive complexity 173 (threshold 15). Drivers by points: if/else 58 (90 pts), ternaries 28 (55 pts), boolean chains 20, loops 5 (8 pts) (nesting depth added 62). Of this number, 153 points are the body\u0027s own statements and 20 belong to 13 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":"invokeai/frontend/webv2/src/workbench/image-actions/recallParameters.ts"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"085cf6dfdaadd39a0a0fecc1009fcbbdb2b14e289d0bc5c25790f1d0753def97"}},{"ruleId":"D2","level":"warning","message":{"text":"utils.pred_squares (cognitive 163): utils.pred_squares has cognitive complexity 163 (threshold 15). Drivers by points: if/else 20 (81 pts), loops 17 (54 pts), boolean chains 20, error handling 4, ternaries 2 (4 pts) (nesting depth added 100). 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":"invokeai/backend/image_util/mlsd/utils.py"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5a580549aa447a7a6f5f04b0bbb6b697591fd702e1ae73b68934d28a2f4d2ff"}},{"ruleId":"D2","level":"warning","message":{"text":"useImageActions.useImageActions (cognitive 160): useImageActions.useImageActions has cognitive complexity 160 (threshold 15). Drivers by points: if/else 62 (87 pts), ternaries 18 (22 pts), boolean chains 21, error handling 15 (21 pts), loops 9 (nesting depth added 35). None of this is in the body itself: all 160 points belong to 42 function literals inside it that branch (lines 435, 750, 336, \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":"invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"993a551f121518a1806af149a7ba2fb4f549eb4f144c41e3cbc31b906e3cbb50"}},{"ruleId":"D2","level":"warning","message":{"text":"executeVideoRecall.applyVideoRecallMetadata (cognitive 152): executeVideoRecall.applyVideoRecallMetadata has cognitive complexity 152 (threshold 15). Drivers by points: if/else 33 (81 pts), ternaries 12 (43 pts), boolean chains 14, error handling 4 (11 pts), loops 1 (3 pts) (nesting depth added 88). 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":"invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7f32386ea6043d9dbcb49ce7449e26e4129051301ea64325b44edb4e798f801"}},{"ruleId":"D2","level":"warning","message":{"text":"readiness.getReasonsWhyCannotEnqueueGenerateTab (cognitive 150): readiness.getReasonsWhyCannotEnqueueGenerateTab has cognitive complexity 150 (threshold 15). Drivers by points: if/else 62 (124 pts), boolean chains 24, loops 1 (2 pts) (nesting depth added 63). Of this number, 148 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":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"660a22d646bdcdfca85415acc20273a5586b10e7e274aa43daac412c2f5d0b73"}},{"ruleId":"D2","level":"warning","message":{"text":"video_smart_concat.try_build_smart_render_plan (cognitive 147): video_smart_concat.try_build_smart_render_plan has cognitive complexity 147 (threshold 15). Drivers by points: if/else 55 (109 pts), boolean chains 24, loops 7 (11 pts), ternaries 3 (nesting depth added 58). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/video_smart_concat.py"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"45544468c1aed7dd6a9c67eead4acebef3c3b22b508e8ebc492b62ed3ce82793"}},{"ruleId":"D2","level":"warning","message":{"text":"addRegions.addRegions (cognitive 141): addRegions.addRegions has cognitive complexity 141 (threshold 15). Drivers by points: loops 20 (75 pts), if/else 45 (63 pts), boolean chains 3 (nesting depth added 73). 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ec61da856fb72bc25cd4d9956c2e25d1b950d9fbfdf770cc8db3a46108d50d1"}},{"ruleId":"D2","level":"warning","message":{"text":"validateConnection.validateConnection (cognitive 140): validateConnection.validateConnection has cognitive complexity 140 (threshold 15). Drivers by points: if/else 42 (116 pts), boolean chains 13, loops 2 (8 pts), ternaries 1 (3 pts) (nesting depth added 82). Of this number, 133 points are the body\u0027s own statements and 7 belong to 4 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":"invokeai/frontend/webv1/src/features/nodes/store/util/validateConnection.ts"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3c563bfe8fae6fa62c9f1bcc3e51613bf4ab2c386cb2e5c8158644806b2870d"}},{"ruleId":"D2","level":"warning","message":{"text":"canvasHotkeyCommands.executeCanvasHotkeyCommand (cognitive 136): canvasHotkeyCommands.executeCanvasHotkeyCommand has cognitive complexity 136 (threshold 15). Drivers by points: if/else 64 (96 pts), boolean chains 22, ternaries 7 (18 pts) (nesting depth added 43). Of this number, 127 points are the body\u0027s own statements and 9 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHotkeyCommands.ts"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ecadad6d33599981ffa77dc5af776c36e556c08a8bc1b17470693d684462dbe"}},{"ruleId":"D2","level":"warning","message":{"text":"validateWorkflow.validateWorkflow (cognitive 129): validateWorkflow.validateWorkflow has cognitive complexity 129 (threshold 15). Drivers by points: if/else 34 (91 pts), boolean chains 13, loops 7 (12 pts), ternaries 4 (10 pts), error handling 1 (3 pts) (nesting depth added 70). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/workflow/validateWorkflow.ts"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9f4c1fda0ad89c9cbd0aa2c49e47ed19c563aa13e44226b1a88ffecfdf7c637"}},{"ruleId":"D2","level":"warning","message":{"text":"videoPolicies.getVideoValidationReasons (cognitive 126): videoPolicies.getVideoValidationReasons has cognitive complexity 126 (threshold 15). Drivers by points: if/else 41 (61 pts), boolean chains 33, ternaries 13 (27 pts), loops 3 (5 pts) (nesting depth added 36). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":2291}}}],"partialFingerprints":{"codehealthFindingId/v1":"10d586d014e3cc115697e1389416928bbc359bd921682298b1a97b9d86b66c97"}},{"ruleId":"D2","level":"warning","message":{"text":"lora._is_flux2_lora_state_dict (cognitive 124): lora._is_flux2_lora_state_dict has cognitive complexity 124 (threshold 15). Drivers by points: if/else 37 (102 pts), boolean chains 14, loops 6 (8 pts) (nesting depth added 67). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/lora.py"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed462cbeb2a5d542c99036352901aecb5a128168ffd6d137fda3db55d3bafd1e"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryPickerView.GalleryPickerView (cognitive 122): GalleryPickerView.GalleryPickerView has cognitive complexity 122 (threshold 15). Drivers by points: ternaries 37 (66 pts), if/else 22 (31 pts), boolean chains 24, loops 1 (nesting depth added 38). Of this number, 72 points are the body\u0027s own statements and 50 belong to 10 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":"invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerView.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"649838291f048eac1576e5d9437d9d4d3115a901b47888f4c1bd7aafe77de60e"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowEditorView.WorkflowFlow (cognitive 117): WorkflowEditorView.WorkflowFlow has cognitive complexity 117 (threshold 15). Drivers by points: if/else 54 (57 pts), ternaries 29 (31 pts), boolean chains 27, loops 1, match/switch 1 (nesting depth added 5). Of this number, 18 points are the body\u0027s own statements and 99 belong to 48 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, 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"4316f265934352a1254147fed2faf1cf083f34a09a3e8a3aad32914213f05c12"}},{"ruleId":"D2","level":"warning","message":{"text":"LayerContextMenu.LayerMenu (cognitive 117): LayerContextMenu.LayerMenu has cognitive complexity 117 (threshold 15). Drivers by points: ternaries 29 (52 pts), if/else 47 (51 pts), boolean chains 9, match/switch 3, error handling 1 (2 pts) (nesting depth added 28). Most of this is not in the body itself: 9 of the 117 points are its own statements and the rest belongs to 35 function literals inside it that branch (lines 462, 362, 727, \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce438f081d071b67fb4931df207e7c967c6c2bd6ee49185faa426f99d0156500"}},{"ruleId":"D2","level":"warning","message":{"text":"VideoWidgetView.VideoWidgetView (cognitive 115): VideoWidgetView.VideoWidgetView has cognitive complexity 115 (threshold 15). Drivers by points: ternaries 48 (75 pts), boolean chains 26, if/else 14 (nesting depth added 27). Of this number, 87 points are the body\u0027s own statements and 28 belong to 13 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"06fc1e654334f7650f557ce6d5ac11f9516836439919f9ae43709d1b79ee8057"}},{"ruleId":"D2","level":"warning","message":{"text":"ZImageDenoiseInvocation._run_diffusion (cognitive 114): ZImageDenoiseInvocation._run_diffusion has cognitive complexity 114 (threshold 15). Drivers by points: if/else 50 (91 pts), boolean chains 11, ternaries 5 (8 pts), loops 2 (4 pts) (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":"invokeai/app/invocations/z_image/z_image_denoise.py"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fd1838c5a8de8bb2626c43a22117e92fd1b1236b62d5b5aff8ea3d6c07b4a10"}},{"ruleId":"D2","level":"warning","message":{"text":"denoise.denoise (cognitive 113): denoise.denoise has cognitive complexity 113 (threshold 15). Drivers by points: if/else 26 (76 pts), ternaries 9 (31 pts), loops 2 (4 pts), boolean chains 2 (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":"invokeai/backend/flux2/denoise.py"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"78c41da268a3afdfd5337c9b58e542c3a1bf8418c7ff2b06a019195af8b3ade9"}},{"ruleId":"D2","level":"warning","message":{"text":"workbenchState.enqueueCompiledSnapshot (cognitive 110): workbenchState.enqueueCompiledSnapshot has cognitive complexity 110 (threshold 15). Drivers by points: ternaries 51 (100 pts), boolean chains 10 (nesting depth added 49). Of this number, 104 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":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":3538}}}],"partialFingerprints":{"codehealthFindingId/v1":"93bc8274d7a42d4bfd87591a1ec5d68d49cce897d07c67032f1c8d8c2fc4dbca"}},{"ruleId":"D2","level":"warning","message":{"text":"buildFLUXGraph.buildFLUXGraph (cognitive 108): buildFLUXGraph.buildFLUXGraph has cognitive complexity 108 (threshold 15). Drivers by points: if/else 67 (104 pts), boolean chains 19, ternaries 3 (7 pts), loops 2 (6 pts) (nesting depth added 45). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body. This shape REPEATS in the file: one other method here (buildFLUXGraph.buildFLUXGraph::addFlux2Features) 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c3661772931fb4ca586e1411ccfef29d3915d47053b009d6c7b5e27aae7be48"}},{"ruleId":"D2","level":"warning","message":{"text":"videoRecall.buildVideoRecallSettings (cognitive 107): videoRecall.buildVideoRecallSettings has cognitive complexity 107 (threshold 15). Drivers by points: if/else 42 (60 pts), boolean chains 31, ternaries 8 (14 pts), loops 2 (nesting depth added 24). Of this number, 105 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":"invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"b727e13c92b6a07d4a902ab817437648497963a5e1bac76e0670b6cfb70991f4"}},{"ruleId":"D2","level":"warning","message":{"text":"parseFieldType.parseFieldType (cognitive 106): parseFieldType.parseFieldType has cognitive complexity 106 (threshold 15). Drivers by points: if/else 32 (99 pts), boolean chains 7 (nesting depth added 67). Of this number, 97 points are the body\u0027s own statements and 9 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":"invokeai/frontend/webv1/src/features/nodes/util/schema/parseFieldType.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"52d7b0232c17bccc13af7fb6d13af4aeabf3c6bb882918aa51b5e818947ec873"}},{"ruleId":"D2","level":"warning","message":{"text":"batch.planWorkflowBatch (cognitive 103): batch.planWorkflowBatch has cognitive complexity 103 (threshold 15). Drivers by points: if/else 26 (59 pts), ternaries 8 (26 pts), boolean chains 14, loops 3 (4 pts) (nesting depth added 52). Of this number, 95 points are the body\u0027s own statements and 8 belong to 3 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":"invokeai/frontend/webv2/src/features/workflow/core/batch.ts"},"region":{"startLine":681}}}],"partialFingerprints":{"codehealthFindingId/v1":"a17b2834b70ccb038fd62572b8f30e3d21d9149f070059444b5fc69aeec8ef77"}},{"ruleId":"D2","level":"warning","message":{"text":"DownloadQueueService._do_download (cognitive 101): DownloadQueueService._do_download has cognitive complexity 101 (threshold 15). Drivers by points: if/else 39 (70 pts), boolean chains 21, error handling 2 (5 pts), ternaries 3 (4 pts), loops 1 (nesting depth added 35). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/download/download_default.py"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0c2d943133169ea110f7f91670db676cf5eb47992592803082673d13bf967ad"}},{"ruleId":"D2","level":"warning","message":{"text":"InputFieldRenderer.InputFieldRenderer (cognitive 101): InputFieldRenderer.InputFieldRenderer has cognitive complexity 101 (threshold 15). Drivers by points: if/else 62 (98 pts), boolean chains 3 (nesting depth added 36). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"58edc0b3abb090a391b078954b59e4a906b047881f4a3bde808692d91bdc712d"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_if_dependencies._can_use_fresh_flat_if_activation (cognitive 95): graph_if_dependencies._can_use_fresh_flat_if_activation has cognitive complexity 95 (threshold 15). Drivers by points: if/else 26 (69 pts), boolean chains 13, loops 4 (12 pts), error handling 1 (nesting depth added 51). 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":"invokeai/app/services/shared/graph_if_dependencies.py"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d77632dbf9d3ab44a4f4fd04d2d25d77ad1ef934e5c44189b8f9f0b8fac1e38"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionNodeBuilder.prepare (cognitive 95): _ExecutionNodeBuilder.prepare has cognitive complexity 95 (threshold 15). Drivers by points: if/else 18 (37 pts), loops 8 (26 pts), boolean chains 15, ternaries 7 (15 pts), error handling 1 (2 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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":2385}}}],"partialFingerprints":{"codehealthFindingId/v1":"56d96a433c0278ea695a7350689bb214e91e61f18c63584689331b6ddc4ab44e"}},{"ruleId":"D2","level":"warning","message":{"text":"ScrubberField.ScrubberField (cognitive 92): ScrubberField.ScrubberField has cognitive complexity 92 (threshold 15). Drivers by points: if/else 33 (38 pts), ternaries 29 (36 pts), boolean chains 16, error handling 1, match/switch 1 (nesting depth added 12). Of this number, 19 points are the body\u0027s own statements and 73 belong to 28 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":"invokeai/frontend/webv2/src/platform/ui/ScrubberField.tsx"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"6697e08adedbd5e5933e4d6ed59883d20a7a3418d7eea293d06a0ed1c8356eec"}},{"ruleId":"D2","level":"warning","message":{"text":"videoPolicies.getVideoModelSelectionResult (cognitive 88): videoPolicies.getVideoModelSelectionResult has cognitive complexity 88 (threshold 15). Drivers by points: if/else 34 (51 pts), boolean chains 21, ternaries 8 (14 pts), loops 2 (nesting depth added 23). Of this number, 87 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":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":1964}}}],"partialFingerprints":{"codehealthFindingId/v1":"5413bd9792837cf2a7f87466dad1761b7e2bb98121b2f9e8a26d470fadccb8cd"}},{"ruleId":"D2","level":"warning","message":{"text":"hidiffusion.apply_hidiffusion (cognitive 85): hidiffusion.apply_hidiffusion has cognitive complexity 85 (threshold 15). Drivers by points: if/else 21 (50 pts), boolean chains 24, loops 5 (9 pts), ternaries 1 (2 pts) (nesting depth added 34). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/hidiffusion/hidiffusion.py"},"region":{"startLine":2040}}}],"partialFingerprints":{"codehealthFindingId/v1":"71149e32fc4cec7988ebfbeea6d11e56ea41bd62c8189051292eb6795f8b8290"}},{"ruleId":"D2","level":"warning","message":{"text":"runtime.createFontRuntime (cognitive 82): runtime.createFontRuntime has cognitive complexity 82 (threshold 15). Drivers by points: if/else 46 (54 pts), boolean chains 20, loops 7, ternaries 1 (nesting depth added 8). None of this is in the body itself: all 82 points belong to 24 function items inside it that branch (a function literal at line 452, removeState, a function literal at line 509, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/fonts/runtime.ts"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fba5dec1f817cfeebb0062f97110303dcee8198c690d3d387e811757922e5b4"}},{"ruleId":"D2","level":"warning","message":{"text":"forLoops.validateForLoopGraph (cognitive 81): forLoops.validateForLoopGraph has cognitive complexity 81 (threshold 15). Drivers by points: if/else 57 (98 pts), boolean chains 71, loops 18 (29 pts), ternaries 2 (4 pts) (nesting depth added 54). To reduce it, split the body into named stages: move each independent 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: 2 other methods here (forLoops.validateForLoopGraph::supportsNestedIterateBody, forLoops.validateForLoopGraph::getSupportedNestedForBody) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 3 times rather than 3 independent problems. Splitting this body alone leaves the other 2 exactly as they are. Where these are variations on one operation, the change that clears all 3 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":"invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"0eba6b94eb21a6ad9a1012658c55d3010bd83f06a07d116131b44cb5e3b8065e"}},{"ruleId":"D2","level":"warning","message":{"text":"document.applyProjectGraphAction (cognitive 81): document.applyProjectGraphAction has cognitive complexity 81 (threshold 15). Drivers by points: if/else 16 (33 pts), ternaries 14 (30 pts), boolean chains 15, loops 1 (2 pts), match/switch 1 (nesting depth added 34). Of this number, 57 points are the body\u0027s own statements and 24 belong to 9 function literals inside it that branch. 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":"invokeai/frontend/webv2/src/features/workflow/core/document.ts"},"region":{"startLine":907}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e1c693703095dbdaeaf2ecadb36a00d0e0870b125f155eb79d4d864ad9b533c"}},{"ruleId":"D2","level":"warning","message":{"text":"LayerRow.LayerRowComponent (cognitive 81): LayerRow.LayerRowComponent has cognitive complexity 81 (threshold 15). Drivers by points: ternaries 36 (55 pts), boolean chains 14, if/else 12 (nesting depth added 19). Of this number, 62 points are the body\u0027s own statements and 19 belong to 9 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRow.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"86252d4ce89f4e008526dfc320e1cf644586054e73f548d2b6c2d6cb61c53f78"}},{"ruleId":"D2","level":"warning","message":{"text":"PidNet.forward (cognitive 79): PidNet.forward has cognitive complexity 79 (threshold 15). Drivers by points: if/else 26 (44 pts), ternaries 9 (25 pts), boolean chains 7, loops 2 (3 pts) (nesting depth added 35). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pid_net.py"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"96d52acc88b8692c22ba6224ea5a5f2a218a021d782ec18b3107f3ae3e40b0b1"}},{"ruleId":"D2","level":"warning","message":{"text":"AddNodeDialog.AddNodeDialogContent (cognitive 79): AddNodeDialog.AddNodeDialogContent has cognitive complexity 79 (threshold 15). Drivers by points: ternaries 22 (32 pts), if/else 25 (28 pts), boolean chains 14, loops 3 (5 pts) (nesting depth added 15). Of this number, 28 points are the body\u0027s own statements and 51 belong to 13 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/AddNodeDialog.tsx"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f2d8cb8ae1fa772fe3da26fcad28cc04d26fdb7a26e956c921fcb51205830be"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectConflictBanner.ProjectConflictBanner (cognitive 79): ProjectConflictBanner.ProjectConflictBanner has cognitive complexity 79 (threshold 15). Drivers by points: ternaries 25 (54 pts), if/else 11 (15 pts), boolean chains 7, error handling 2 (3 pts) (nesting depth added 34). Of this number, 58 points are the body\u0027s own statements and 21 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":"invokeai/frontend/webv2/src/workbench/shell/ProjectConflictBanner.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c96b5c4d5be51a705f29bc462d3e17881a84076a12993362a951071242b6629"}},{"ruleId":"D2","level":"warning","message":{"text":"PixDiT_T2I.forward (cognitive 78): PixDiT_T2I.forward has cognitive complexity 78 (threshold 15). Drivers by points: if/else 19 (41 pts), ternaries 8 (24 pts), loops 4 (9 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":"invokeai/backend/pid/_src/networks/pixeldit_official.py"},"region":{"startLine":1413}}}],"partialFingerprints":{"codehealthFindingId/v1":"87ca818e1fc230890d963eebe59cd56c4acc1c70c1ddf917dbf02ec6080be0d8"}},{"ruleId":"D2","level":"warning","message":{"text":"select_hf_files._filter_by_variant (cognitive 77): select_hf_files._filter_by_variant has cognitive complexity 77 (threshold 15). Drivers by points: if/else 20 (53 pts), loops 6 (12 pts), boolean chains 9, ternaries 1 (3 pts) (nesting depth added 41). 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":"invokeai/backend/model_manager/util/select_hf_files.py"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb77e1aea351bcf79dbda54c336ca8fbc47d25f98ccec385066505d998971e5a"}},{"ruleId":"D2","level":"warning","message":{"text":"PreviewFrame.PreviewVideo (cognitive 77): PreviewFrame.PreviewVideo has cognitive complexity 77 (threshold 15). Drivers by points: if/else 35 (36 pts), boolean chains 20, ternaries 14 (16 pts), error handling 5 (nesting depth added 3). Most of this is not in the body itself: 11 of the 77 points are its own statements and the rest belongs to 23 function literals inside it that branch (lines 462, 792, 765, \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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5301894d7f4d28b2876bd47993d675d0597d1a9eb3c78bd03bdf812a0e5de44"}},{"ruleId":"D2","level":"warning","message":{"text":"lora._get_flux2_lora_variant (cognitive 76): lora._get_flux2_lora_variant has cognitive complexity 76 (threshold 15). Drivers by points: if/else 27 (64 pts), boolean chains 8, loops 4 (nesting depth added 37). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/lora.py"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"70477572a558601ec45079389ab95712fea82b3a4cd3a1e9cf3bec750435823d"}},{"ruleId":"D2","level":"warning","message":{"text":"forLoops.validateForLoopGraph::getSupportedNestedForBody (cognitive 76): forLoops.validateForLoopGraph::getSupportedNestedForBody has cognitive complexity 76 (threshold 15). Drivers by points: if/else 26 (38 pts), boolean chains 20, loops 9 (16 pts), ternaries 1 (2 pts) (nesting depth added 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. This shape REPEATS in the file: 2 other methods here (forLoops.validateForLoopGraph, forLoops.validateForLoopGraph::supportsNestedIterateBody) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 3 times rather than 3 independent problems. Splitting this body alone leaves the other 2 exactly as they are. Where these are variations on one operation, the change that clears all 3 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":"invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"14a78675fa10c12d2dc0b39e304bad0c7f7ac06f6e992054feab7e3c10283359"}},{"ruleId":"D2","level":"warning","message":{"text":"canvasProjectMutations.applyCanvasProjectMutation (cognitive 76): canvasProjectMutations.applyCanvasProjectMutation has cognitive complexity 76 (threshold 15). Drivers by points: ternaries 24 (50 pts), if/else 7 (14 pts), boolean chains 9, loops 1 (2 pts), match/switch 1 (nesting depth added 34). Of this number, 53 points are the body\u0027s own statements and 23 belong to 8 function literals inside it that branch. 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":"invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts"},"region":{"startLine":669}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a7a939bea5d866c739e4f12f661a51c3489fafc53d71516ac4546748399adc3"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryMaintenanceService._remove_missing_page (cognitive 75): GalleryMaintenanceService._remove_missing_page has cognitive complexity 75 (threshold 15). Drivers by points: if/else 17 (46 pts), error handling 7 (15 pts), boolean chains 7, loops 4 (5 pts), ternaries 1 (2 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":"invokeai/app/services/gallery_maintenance/gallery_maintenance_default.py"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"d538b5622b1230215e3d069adce25f92c29ebdbc50f22541583fdb83b4413e17"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryMediaSlot.GalleryMediaSlot (cognitive 75): GalleryMediaSlot.GalleryMediaSlot has cognitive complexity 75 (threshold 15). Drivers by points: ternaries 32 (50 pts), boolean chains 19, if/else 4 (5 pts), error handling 1 (nesting depth added 19). Of this number, 60 points are the body\u0027s own statements and 15 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":"invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryMediaSlot.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c2b4d0a6faf444e29dcfffa4e11b48ee406b0da95f399364e783d1e126c8690"}},{"ruleId":"D2","level":"warning","message":{"text":"workflow_graph_builder.build_graph_from_workflow (cognitive 74): workflow_graph_builder.build_graph_from_workflow has cognitive complexity 74 (threshold 15). Drivers by points: if/else 24 (52 pts), boolean chains 11, loops 7 (9 pts), ternaries 2 (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":"invokeai/app/services/shared/workflow_graph_builder.py"},"region":{"startLine":367}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ff8b85d9f56e75aac3c7e72a98c0a0a854a7855d251ac8c02f531ca0162c70b"}},{"ruleId":"D2","level":"warning","message":{"text":"IntermediatesManager.IntermediatesManager (cognitive 74): IntermediatesManager.IntermediatesManager has cognitive complexity 74 (threshold 15). Drivers by points: ternaries 33 (45 pts), boolean chains 22, if/else 6 (7 pts) (nesting depth added 13). Of this number, 62 points are the body\u0027s own statements and 12 belong to 8 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":"invokeai/frontend/webv2/src/features/intermediates/ui/IntermediatesManager.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"5032de2976a83b0a6ebec05dee7ef60516c8f976602b666071a3c0ea82b1c537"}},{"ruleId":"D2","level":"warning","message":{"text":"AddModelsView.AddModelsView (cognitive 73): AddModelsView.AddModelsView has cognitive complexity 73 (threshold 15). Drivers by points: ternaries 21 (29 pts), if/else 19 (26 pts), boolean chains 18 (nesting depth added 15). Of this number, 30 points are the body\u0027s own statements and 43 belong to 14 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":"invokeai/frontend/webv2/src/features/models/ui/add-models/AddModelsView.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7d1eb9c5a2ea7ffbd61c8b0791f83a1b26732fea0e6672ac08bbc8692a48869"}},{"ruleId":"D2","level":"warning","message":{"text":"durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject (cognitive 73): durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject has cognitive complexity 73 (threshold 15). Drivers by points: if/else 19 (52 pts), ternaries 3 (11 pts), error handling 2 (5 pts), boolean chains 4, loops 1 (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. This shape REPEATS in the file: 5 other methods here (durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::adoptNewestDraft, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::stageProject, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject::pushHalves, \u2026) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 6 times rather than 6 independent problems. Splitting this body alone leaves the other 5 exactly as they are. Where these are variations on one operation, the change that clears all 6 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":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":1330}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fb40d50aed5ff87df76c2cad56add31d88ba46ae92e1fc2e7eee35535af704a"}},{"ruleId":"D2","level":"warning","message":{"text":"graph.buildLtx2VideoGraph (cognitive 71): graph.buildLtx2VideoGraph has cognitive complexity 71 (threshold 15). Drivers by points: if/else 27 (36 pts), ternaries 20 (24 pts), boolean chains 11 (nesting depth added 13). Of this number, 69 points are the body\u0027s own statements and 2 belong to 2 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, 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":"invokeai/frontend/webv2/src/features/video/core/graph.ts"},"region":{"startLine":654}}}],"partialFingerprints":{"codehealthFindingId/v1":"b425367ba5cff88e2f3c365d324b045313628742e7782180f5f2778d63ed1fc8"}},{"ruleId":"D2","level":"warning","message":{"text":"PreviewWidgetView.PreviewWidgetView (cognitive 71): PreviewWidgetView.PreviewWidgetView has cognitive complexity 71 (threshold 15). Drivers by points: ternaries 23 (31 pts), boolean chains 19, if/else 18 (19 pts), error handling 1 (2 pts) (nesting depth added 10). Of this number, 19 points are the body\u0027s own statements and 52 belong to 15 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewWidgetView.tsx"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"966b9a444f31492b4e105c8cb06867f860b590885e75d43169bff23c54533b39"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_loop_topology._recognize_nested_for_body (cognitive 70): graph_loop_topology._recognize_nested_for_body has cognitive complexity 70 (threshold 15). Drivers by points: if/else 34 (48 pts), boolean chains 15, loops 4 (5 pts), ternaries 1 (2 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":"invokeai/app/services/shared/graph_loop_topology.py"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe3b8290f780be14b87794625cf39d7f0315dbcc6728d18b6509466154119abd"}},{"ruleId":"D2","level":"warning","message":{"text":"utilityGraph.runUtilityGraph (cognitive 70): utilityGraph.runUtilityGraph has cognitive complexity 70 (threshold 15). Drivers by points: if/else 30 (33 pts), ternaries 11 (19 pts), error handling 8 (11 pts), boolean chains 6, loops 1 (nesting depth added 14). Most of this is not in the body itself: 5 of the 70 points are its own statements and the rest belongs to 15 function literals inside it that branch (lines 359, 258, 220, \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":"invokeai/frontend/webv2/src/features/queue/runtime/utilityGraph.ts"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"d98406b66a6ce0a58d49f770a8c4924c89c19493182133809ca1f3ed0359fb01"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageMapPlot.ImageMapPlot (cognitive 70): ImageMapPlot.ImageMapPlot has cognitive complexity 70 (threshold 15). Drivers by points: if/else 32 (36 pts), boolean chains 20, ternaries 14 (nesting depth added 4). Most of this is not in the body itself: 3 of the 70 points are its own statements and the rest belongs to 25 function items inside it that branch (a function literal at line 446, a function literal at line 293, a function literal at line 392, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapPlot.tsx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"79d52c479f8f1afbc4033a19d049dc767cc23f16b2741fe24f0538e4b40e8b73"}},{"ruleId":"D2","level":"warning","message":{"text":"imageRecall.buildImageRecallSettings (cognitive 70): imageRecall.buildImageRecallSettings has cognitive complexity 70 (threshold 15). Drivers by points: if/else 30 (52 pts), boolean chains 15, ternaries 2 (3 pts) (nesting depth added 23). Of this number, 67 points are the body\u0027s own statements and 3 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":"invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts"},"region":{"startLine":1115}}}],"partialFingerprints":{"codehealthFindingId/v1":"87485641425f9f6bb3b2ebffbb8fafabf7ac2facede62bdaa8cc235aaae2569a"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._can_use_generic_for_scheduler (cognitive 69): GraphExecutionState._can_use_generic_for_scheduler has cognitive complexity 69 (threshold 15). Drivers by points: if/else 29 (51 pts), boolean chains 18 (nesting depth added 22). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1251}}}],"partialFingerprints":{"codehealthFindingId/v1":"be8283bc45926f8a030eb4d5d52bc746f782176a195d72c1b7540e42390bd1e0"}},{"ruleId":"D2","level":"warning","message":{"text":"validators.getRegionalGuidanceWarnings (cognitive 69): validators.getRegionalGuidanceWarnings has cognitive complexity 69 (threshold 15). Drivers by points: if/else 28 (67 pts), boolean chains 2 (nesting depth added 39). Of this number, 64 points are the body\u0027s own statements and 5 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":"invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0ceb179ed7b831c8401fca97963ee9125467033b30a70cdc39dbe76d3a5c688"}},{"ruleId":"D2","level":"warning","message":{"text":"layerChildRows.layerChildRowCommand (cognitive 69): layerChildRows.layerChildRowCommand has cognitive complexity 69 (threshold 15). Drivers by points: if/else 20 (39 pts), ternaries 9 (20 pts), boolean chains 8, match/switch 1 (2 pts) (nesting depth added 31). Of this number, 66 points are the body\u0027s own statements and 3 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerChildRows.ts"},"region":{"startLine":507}}}],"partialFingerprints":{"codehealthFindingId/v1":"7aacbe65389286ee28bc0f138c603a19596306c3efd5db8c543e34b983faa9d8"}},{"ruleId":"D2","level":"warning","message":{"text":"WanDenoiseInvocation._run_diffusion (cognitive 68): WanDenoiseInvocation._run_diffusion has cognitive complexity 68 (threshold 15). Drivers by points: if/else 29 (45 pts), ternaries 10 (13 pts), boolean chains 9, loops 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":"invokeai/app/invocations/wan/wan_denoise.py"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"3623bcba72e94434e1e59ac1ab3a9e7ea3a413f5110d498306c2fd4c8e626b6d"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowPublicationHost.WorkflowPublicationHost (cognitive 68): WorkflowPublicationHost.WorkflowPublicationHost has cognitive complexity 68 (threshold 15). Drivers by points: ternaries 26 (32 pts), if/else 16 (17 pts), boolean chains 16, error handling 2, match/switch 1 (nesting depth added 7). Of this number, 27 points are the body\u0027s own statements and 41 belong to 20 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowPublicationHost.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"a05a25e292a839daa47403748ff42bf016223e09eedd0a2a747d8adf1a1ca4ac"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimaDenoiseInvocation._run_diffusion (cognitive 67): AnimaDenoiseInvocation._run_diffusion has cognitive complexity 67 (threshold 15). Drivers by points: if/else 26 (41 pts), loops 7 (13 pts), boolean chains 8, ternaries 3, error handling 1 (2 pts) (nesting depth added 22). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/anima/anima_denoise.py"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ede4a1827fafe344bd734ca70948fe3d123b8604eeec47391b9068d133c63bc"}},{"ruleId":"D2","level":"warning","message":{"text":"GeminiProvider.generate (cognitive 67): GeminiProvider.generate has cognitive complexity 67 (threshold 15). Drivers by points: if/else 27 (52 pts), boolean chains 8, loops 3 (4 pts), ternaries 1 (3 pts) (nesting depth added 28). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/external_generation/providers/gemini.py"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"86421643cf290e253617d90c58d3a8d16d77fedd50bb5f1f177d1d4d5b0b1f2d"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelInstallService._restore_incomplete_installs (cognitive 67): ModelInstallService._restore_incomplete_installs has cognitive complexity 67 (threshold 15). Drivers by points: if/else 22 (50 pts), error handling 4 (10 pts), boolean chains 4, ternaries 1 (2 pts), loops 1 (nesting depth added 35). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":489}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce11af3cc6a467724929a55bf95dbf57251b294fae7e67c3089d33b40d25df90"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasTextOverlay.TextEditor (cognitive 67): CanvasTextOverlay.TextEditor has cognitive complexity 67 (threshold 15). Drivers by points: if/else 36 (38 pts), ternaries 14 (15 pts), boolean chains 14 (nesting depth added 3). Most of this is not in the body itself: 12 of the 67 points are its own statements and the rest belongs to 24 function literals inside it that branch (lines 307, 571, 230, \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"254a16acf4a78e99a30b76bc687cb7e38b4725009e4839edac50c74b43a6a7a4"}},{"ruleId":"D2","level":"warning","message":{"text":"settings.getUpscaleValidationReasons (cognitive 67): settings.getUpscaleValidationReasons has cognitive complexity 67 (threshold 15). Drivers by points: if/else 22 (33 pts), ternaries 9 (18 pts), boolean chains 11, loops 3 (5 pts) (nesting depth added 22). Of this number, 65 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":"invokeai/frontend/webv2/src/features/upscale/core/settings.ts"},"region":{"startLine":948}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2c3f0d35e9af45ecd0edde1af0c6c49c4f4db96a74a5a1f0e496e335f0bb969"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowLibraryDetailPanel.WorkflowLibraryDetailPanel (cognitive 67): WorkflowLibraryDetailPanel.WorkflowLibraryDetailPanel has cognitive complexity 67 (threshold 15). Drivers by points: if/else 19 (27 pts), ternaries 17 (23 pts), boolean chains 9, error handling 5, loops 2 (3 pts) (nesting depth added 15). Of this number, 17 points are the body\u0027s own statements and 50 belong to 14 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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.tsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"5369171e7b2e42e1155c1c8ebea655493547424fefd32635d20d89ba72f76c4d"}},{"ruleId":"D2","level":"warning","message":{"text":"usePreviewNavigation.usePreviewNavigation.navigate (cognitive 67): usePreviewNavigation.usePreviewNavigation.navigate has cognitive complexity 67 (threshold 15). Drivers by points: if/else 27 (43 pts), ternaries 5 (13 pts), boolean chains 7, error handling 2 (3 pts), loops 1 (nesting depth added 25). Most of this is not in the body itself: 8 of the 67 points are its own statements and the rest belongs to 4 function items inside it that branch (a function literal at line 780, stepTo, updatePage, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewNavigation.ts"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5234605830e8a3026da4ea28670fb9531c2e533ef6f3da55bc9df85706e05dd"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._rehydrate_generic_runtime_state (cognitive 66): GraphExecutionState._rehydrate_generic_runtime_state has cognitive complexity 66 (threshold 15). Drivers by points: if/else 19 (48 pts), boolean chains 9, loops 7 (9 pts) (nesting depth added 31). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":3771}}}],"partialFingerprints":{"codehealthFindingId/v1":"c77c4e596cba24efa84e26f10fcb45e88bbe84ca404c1f963d419af98022dccb"}},{"ruleId":"D2","level":"warning","message":{"text":"denoise.denoise (cognitive 66): denoise.denoise has cognitive complexity 66 (threshold 15). Drivers by points: if/else 25 (55 pts), boolean chains 4, ternaries 2 (4 pts), loops 2 (3 pts) (nesting depth added 33). 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":"invokeai/backend/flux/denoise.py"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a7f9c6d8ffc2e7c6b6c026dee1b2e236d4e4d476b68631053c29aa3334b8f3d"}},{"ruleId":"D2","level":"warning","message":{"text":"loaders.sdnq_sd_loader (cognitive 66): loaders.sdnq_sd_loader has cognitive complexity 66 (threshold 15). Drivers by points: if/else 18 (45 pts), ternaries 3 (10 pts), loops 4 (8 pts), boolean chains 3 (nesting depth added 38). 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":"invokeai/backend/quantization/sdnq/loaders.py"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"f960c6430b9379f84e92fb61796e9ee2e43ba8357b7f7ddef83a1d8e144e1c10"}},{"ruleId":"D2","level":"warning","message":{"text":"setDefaultSettings.addSetDefaultSettingsListener (cognitive 66): setDefaultSettings.addSetDefaultSettingsListener has cognitive complexity 66 (threshold 15). Drivers by points: if/else 27 (65 pts), boolean chains 1 (nesting depth added 38). None of this is in the body itself: all 66 points belong to one function literal inside it that branches (line 37). 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":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/setDefaultSettings.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd3f49bb1c7bfea2895986cd5e385d4637520f84cc5425cbc91e7fb7cc75c051"}},{"ruleId":"D2","level":"warning","message":{"text":"FontsPage.FontLibrary (cognitive 66): FontsPage.FontLibrary has cognitive complexity 66 (threshold 15). Drivers by points: ternaries 26 (41 pts), if/else 9 (12 pts), boolean chains 8, error handling 3 (4 pts), loops 1 (nesting depth added 19). Of this number, 27 points are the body\u0027s own statements and 39 belong to 14 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":"invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.tsx"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"485332314b475fe0b73268f5294379ae519a1d109ea6a0fbb792c1efe1520c49"}},{"ruleId":"D2","level":"warning","message":{"text":"GenerateAdvancedFields.GenerateAdvancedFields (cognitive 66): GenerateAdvancedFields.GenerateAdvancedFields has cognitive complexity 66 (threshold 15). Drivers by points: ternaries 22 (40 pts), boolean chains 17, if/else 5 (9 pts) (nesting depth added 22). Of this number, 54 points are the body\u0027s own statements and 12 belong to 5 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":"invokeai/frontend/webv2/src/features/generation/ui/GenerateAdvancedFields.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"851cdd91d95584f0e09316e15e9d248bcb1ad1e40ef17c43d50106209849acf3"}},{"ruleId":"D2","level":"warning","message":{"text":"indexedDbDraftStore.createIndexedDbProjectDraftStore.reconcileUnloadJournal (cognitive 66): indexedDbDraftStore.createIndexedDbProjectDraftStore.reconcileUnloadJournal has cognitive complexity 66 (threshold 15). Drivers by points: ternaries 9 (31 pts), if/else 8 (23 pts), error handling 2 (5 pts), boolean chains 4, loops 2 (3 pts) (nesting depth added 41). Of this number, 29 points are the body\u0027s own statements and 37 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":784}}}],"partialFingerprints":{"codehealthFindingId/v1":"20c87b87960d02edf90028d48c30273a24b7ea87c23bb4f7ac0f5c362085b9ef"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._can_use_generic_two_sibling_nested_for_scheduler (cognitive 65): GraphExecutionState._can_use_generic_two_sibling_nested_for_scheduler has cognitive complexity 65 (threshold 15). Drivers by points: if/else 30 (47 pts), boolean chains 16, loops 2 (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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1050}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfc405566a3b75a4b012b3773548f28426a3658cf1842900d84f09ffd2ba8d5a"}},{"ruleId":"D2","level":"warning","message":{"text":"AddNodeCmdk.NodeCommandList (cognitive 64): AddNodeCmdk.NodeCommandList has cognitive complexity 64 (threshold 15). Drivers by points: if/else 16 (31 pts), ternaries 4 (15 pts), loops 5 (11 pts), boolean chains 7 (nesting depth added 32). Most of this is not in the body itself: 2 of the 64 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 426, 514, 486, \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"04e5f6d6b53207330f2b076d754e95a6a76c71b9b8816cdf525c8e28540bb55a"}},{"ruleId":"D2","level":"warning","message":{"text":"graphCoverage.testing.candidatesForSlot (cognitive 63): graphCoverage.testing.candidatesForSlot has cognitive complexity 63 (threshold 15). Drivers by points: ternaries 8 (48 pts), loops 5 (15 pts) (nesting depth added 50). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/graphCoverage.testing.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"fda9fd78ffe3676ab4c630b195534de3c25dfb051e046b842421469bd47aa8c8"}},{"ruleId":"D2","level":"warning","message":{"text":"video_smart_concat.encode_rgb_frames (cognitive 62): video_smart_concat.encode_rgb_frames has cognitive complexity 62 (threshold 15). Drivers by points: if/else 22 (32 pts), error handling 8 (16 pts), boolean chains 10, loops 3 (4 pts) (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/video_smart_concat.py"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8dedb9e3fdd447dd0b56f23afc0fac2903b9138d5197fafecb7566164152b12"}},{"ruleId":"D2","level":"warning","message":{"text":"maskOutline.traceMaskOutlinePath (cognitive 62): maskOutline.traceMaskOutlinePath has cognitive complexity 62 (threshold 15). Drivers by points: if/else 18 (44 pts), loops 7 (13 pts), boolean chains 5 (nesting depth added 32). Of this number, 51 points are the body\u0027s own statements and 11 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/selection/maskOutline.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"7562e741d9871dd4551175b42fecac3f6bbdac39f4098204c0e048b0486df10f"}},{"ruleId":"D2","level":"warning","message":{"text":"ChildExecutionCapability.create_dependency (cognitive 61): ChildExecutionCapability.create_dependency has cognitive complexity 61 (threshold 15). Drivers by points: if/else 18 (33 pts), boolean chains 9, ternaries 3 (9 pts), loops 5 (8 pts), error handling 1 (2 pts) (nesting depth added 25). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/execution_engine/child.py"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f902f3ae96a27f80888111ab541691dd7aa447015253278e232a3bd41f78a70"}},{"ruleId":"D2","level":"warning","message":{"text":"useCanvasWorkflowIntegrationExecute.useCanvasWorkflowIntegrationExecute.execute (cognitive 61): useCanvasWorkflowIntegrationExecute.useCanvasWorkflowIntegrationExecute.execute has cognitive complexity 61 (threshold 15). Drivers by points: if/else 21 (40 pts), boolean chains 9, ternaries 3 (6 pts), loops 3 (5 pts), error handling 1 (nesting depth added 24). Of this number, 53 points are the body\u0027s own statements and 8 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"906a7dc3dd99ace6457d22d53857885bb3a56320e774b7933a5f5a3420274008"}},{"ruleId":"D2","level":"warning","message":{"text":"StagingAreaApi.onItemsChangedEvent (cognitive 60): StagingAreaApi.onItemsChangedEvent has cognitive complexity 60 (threshold 15). Drivers by points: if/else 21 (45 pts), boolean chains 7, loops 4 (6 pts), ternaries 2 (nesting depth added 26). Of this number, 58 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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/state.ts"},"region":{"startLine":460}}}],"partialFingerprints":{"codehealthFindingId/v1":"17555dad9620952f97af676ac22048cb94a01aee666d6cca80686af15eb32bed"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelInstallQueueItem.ModelInstallQueueItem (cognitive 60): ModelInstallQueueItem.ModelInstallQueueItem has cognitive complexity 60 (threshold 15). Drivers by points: boolean chains 24, if/else 15 (18 pts), ternaries 5 (11 pts), error handling 5, match/switch 2 (nesting depth added 9). Of this number, 26 points are the body\u0027s own statements and 34 belong to 15 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueItem.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"928fa4d460b4342ebcf85cb8a100ef87c84a2c6cb6d988a3b509357194c66fa7"}},{"ruleId":"D2","level":"warning","message":{"text":"useGalleryData.useGalleryData (cognitive 60): useGalleryData.useGalleryData has cognitive complexity 60 (threshold 15). Drivers by points: boolean chains 26, ternaries 23, if/else 8 (11 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryData.ts"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"b09e26b65bfd97d709892b2950716257cff8195efdaf9c814a0fc6872bb187aa"}},{"ruleId":"D2","level":"warning","message":{"text":"OpenAIProvider.generate (cognitive 59): OpenAIProvider.generate has cognitive complexity 59 (threshold 15). Drivers by points: if/else 24 (44 pts), boolean chains 7, ternaries 2 (5 pts), loops 2 (3 pts) (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":"invokeai/app/services/external_generation/providers/openai.py"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"a67f73baac9c16b838beecd9efae7948726f7d9a7637c9c85996812bd9459232"}},{"ruleId":"D2","level":"warning","message":{"text":"promptAttention.groupTerminals (cognitive 59): promptAttention.groupTerminals has cognitive complexity 59 (threshold 15). Drivers by points: if/else 10 (24 pts), loops 9 (21 pts), boolean chains 8, ternaries 2 (6 pts) (nesting depth added 30). Of this number, 55 points are the body\u0027s own statements and 4 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":"invokeai/frontend/webv1/src/common/util/promptAttention.ts"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"fda6d8b1ebb0d1e704bce28de71e1335f9275a4c8031513a46ec8549d697099e"}},{"ruleId":"D2","level":"warning","message":{"text":"useGalleryActions.useGalleryActions (cognitive 59): useGalleryActions.useGalleryActions has cognitive complexity 59 (threshold 15). Drivers by points: if/else 19 (30 pts), boolean chains 11, ternaries 8 (11 pts), error handling 7 (nesting depth added 14). None of this is in the body itself: all 59 points belong to 10 function literals inside it that branch (lines 237, 98, 63, \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":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryActions.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c1e2c6268614c43acc840514ab066da8bd0d4209478f7814aa350bf9a03f27d"}},{"ruleId":"D2","level":"warning","message":{"text":"ReferenceImageCropDialog.ReferenceImageCropDialog (cognitive 59): ReferenceImageCropDialog.ReferenceImageCropDialog has cognitive complexity 59 (threshold 15). Drivers by points: if/else 24 (27 pts), ternaries 11 (18 pts), boolean chains 12, error handling 2 (nesting depth added 10). Most of this is not in the body itself: 7 of the 59 points are its own statements and the rest belongs to 19 function literals inside it that branch (lines 459, 501, 317, \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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"93f2a77b233ceaed25bd68296fb9353e7207a1d14ea7e35a9342fc526a7e8a7c"}},{"ruleId":"D2","level":"warning","message":{"text":"runtime.createQueueRuntime.reconcile (cognitive 59): runtime.createQueueRuntime.reconcile has cognitive complexity 59 (threshold 15). Drivers by points: if/else 23 (35 pts), boolean chains 15, ternaries 2 (4 pts), loops 3, match/switch 1 (2 pts) (nesting depth added 15). Most of this is not in the body itself: 4 of the 59 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 2168, 2121, 2276, \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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":2076}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1ba5a731943751911e794c5819ca776327df7b3ec6c2f203cdc70d28b8349e4"}},{"ruleId":"D2","level":"warning","message":{"text":"FloatingWidgetWindow.FloatingWidgetWindow (cognitive 58): FloatingWidgetWindow.FloatingWidgetWindow has cognitive complexity 58 (threshold 15). Drivers by points: if/else 23 (24 pts), ternaries 24, boolean chains 9, loops 1 (nesting depth added 1). Of this number, 24 points are the body\u0027s own statements and 34 belong to 15 function literals 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":"invokeai/frontend/webv2/src/workbench/widget-frame/FloatingWidgetWindow.tsx"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"131e0923286ffbee65fe31bf41ed234c32b72938c850944591da4c0377aa9e3e"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelInstallService._enqueue_remote_download (cognitive 57): ModelInstallService._enqueue_remote_download has cognitive complexity 57 (threshold 15). Drivers by points: if/else 15 (31 pts), error handling 4 (10 pts), boolean chains 8, loops 3 (6 pts), ternaries 2 (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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":2185}}}],"partialFingerprints":{"codehealthFindingId/v1":"93f89dce62076651682747ab295284cfd325bb83e41cc8e8f33061cc2e104ce6"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_if_runtime._get_if_iteration_paths_with_ancestry (cognitive 57): graph_if_runtime._get_if_iteration_paths_with_ancestry has cognitive complexity 57 (threshold 15). Drivers by points: if/else 17 (31 pts), ternaries 5 (11 pts), boolean chains 10, loops 3 (5 pts) (nesting depth added 22). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_if_runtime.py"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"54e92e7015631feba0d66b17e972897580d032ac98a201275f2f4cfc7a4e41ed"}},{"ruleId":"D2","level":"warning","message":{"text":"InvocationFlowNode.ExpandedInvocationNode (cognitive 57): InvocationFlowNode.ExpandedInvocationNode has cognitive complexity 57 (threshold 15). Drivers by points: ternaries 22 (41 pts), boolean chains 15, if/else 1 (nesting depth added 19). Of this number, 54 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.tsx"},"region":{"startLine":961}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3479bbd0cfe04e19e004634cae3acca7de6db36f175afb155799c5922d1c6ae"}},{"ruleId":"D2","level":"warning","message":{"text":"indexedDbDraftStore.createIndexedDbProjectDraftStore.retargetAcknowledgedCopy (cognitive 57): indexedDbDraftStore.createIndexedDbProjectDraftStore.retargetAcknowledgedCopy has cognitive complexity 57 (threshold 15). Drivers by points: if/else 13 (28 pts), ternaries 6 (18 pts), boolean chains 7, error handling 1 (3 pts), loops 1 (nesting depth added 29). Of this number, 30 points are the body\u0027s own statements and 27 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":991}}}],"partialFingerprints":{"codehealthFindingId/v1":"55a674349813defeff5bf4fa637ee310acbc01949097ea0b4ee8e7dde1a632bd"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelInstallService._install_path_with_info_claimed (cognitive 56): ModelInstallService._install_path_with_info_claimed has cognitive complexity 56 (threshold 15). Drivers by points: if/else 13 (31 pts), error handling 6 (14 pts), boolean chains 5, loops 2 (5 pts), ternaries 1 (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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":1038}}}],"partialFingerprints":{"codehealthFindingId/v1":"89e4a1b6a9b2889cac0b077929aa7a3fc81745350f1d24d4ed08f242fc3ae487"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryItemSearch.GalleryItemSearch (cognitive 56): GalleryItemSearch.GalleryItemSearch has cognitive complexity 56 (threshold 15). Drivers by points: ternaries 21 (31 pts), boolean chains 13, if/else 11, match/switch 1 (nesting depth added 10). Of this number, 28 points are the body\u0027s own statements and 28 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryItemSearch.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"82c2b7bb1136eae8c5c4bacc6d30c19f9d2be51ed834b4ce784bf9c677e798e5"}},{"ruleId":"D2","level":"warning","message":{"text":"video_recall.resolve_video_recall_parameters (cognitive 55): video_recall.resolve_video_recall_parameters has cognitive complexity 55 (threshold 15). Drivers by points: if/else 17 (38 pts), loops 5 (11 pts), ternaries 1 (4 pts), boolean chains 2 (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":"invokeai/app/api/routers/video_recall.py"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"639b5a74f1444525a81981a3dde81cb8c9372d0c3a76187045b93bbc408a82b9"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowFieldRenderer.WorkflowFieldRenderer (cognitive 55): WorkflowFieldRenderer.WorkflowFieldRenderer has cognitive complexity 55 (threshold 15). Drivers by points: if/else 28 (29 pts), ternaries 11 (13 pts), boolean chains 11, loops 1 (2 pts) (nesting depth added 4). Of this number, 19 points are the body\u0027s own statements and 36 belong to 10 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"36ab7437dfbf4aed4e881bf122d77c6fd9e5733804631bf8e9405ff33c48d9d7"}},{"ruleId":"D2","level":"warning","message":{"text":"canvasProjectMutations.patchLayerConfig (cognitive 55): canvasProjectMutations.patchLayerConfig has cognitive complexity 55 (threshold 15). Drivers by points: ternaries 14 (28 pts), if/else 13 (20 pts), boolean chains 7 (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":"invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts"},"region":{"startLine":536}}}],"partialFingerprints":{"codehealthFindingId/v1":"5054a39ecde6fb2815d602843f46ebacad5f0016f56fe8d83b45cd254c8b6c4c"}},{"ruleId":"D2","level":"warning","message":{"text":"compositor.compositeDocument (cognitive 55): compositor.compositeDocument has cognitive complexity 55 (threshold 15). Drivers by points: if/else 16 (29 pts), ternaries 6 (10 pts), boolean chains 8, loops 4 (8 pts) (nesting depth added 21). Of this number, 46 points are the body\u0027s own statements and 9 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositor.ts"},"region":{"startLine":520}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4e911a087d23544c89b27c3f3c816135aff04c3f3d6c4a2a5d1eb2380661710"}},{"ruleId":"D2","level":"warning","message":{"text":"WanModelLoaderInvocation.invoke (cognitive 54): WanModelLoaderInvocation.invoke has cognitive complexity 54 (threshold 15). Drivers by points: if/else 22 (46 pts), boolean chains 7, ternaries 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":"invokeai/app/invocations/wan/wan_model_loader.py"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"64179da5fe6e1c1f89adfce1eb88a29cf585c49ee5568610c6ba87c00caca304"}},{"ruleId":"D2","level":"warning","message":{"text":"calibrate_flux2_working_memory.report_vae (cognitive 54): calibrate_flux2_working_memory.report_vae has cognitive complexity 54 (threshold 15). Drivers by points: ternaries 6 (21 pts), if/else 7 (20 pts), loops 6 (11 pts), boolean chains 2 (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/calibrate_flux2_working_memory.py"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"90574b8b3a21eec9e29e1b20345d47f38954a75603489add901a0ff8ee6c2634"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._record_effect_streams (cognitive 53): GraphExecutionState._record_effect_streams has cognitive complexity 53 (threshold 15). Drivers by points: if/else 12 (28 pts), ternaries 9 (20 pts), boolean chains 4, loops 1 (nesting depth added 27). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1698}}}],"partialFingerprints":{"codehealthFindingId/v1":"0af8957c9fd9fbc3915a37597dcf92e140951eaa2d6a56375c9d838d748c8b02"}},{"ruleId":"D2","level":"warning","message":{"text":"Qwen3EncoderCheckpointLoader._load_from_singlefile (cognitive 53): Qwen3EncoderCheckpointLoader._load_from_singlefile has cognitive complexity 53 (threshold 15). Drivers by points: if/else 22 (35 pts), loops 5 (8 pts), boolean chains 6, error handling 1 (4 pts) (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":1189}}}],"partialFingerprints":{"codehealthFindingId/v1":"6eb92d1d1b030d4ceb75fcacf0697b3d3f4cd0b30dbc7238a6af9a4e87db2ab4"}},{"ruleId":"D2","level":"warning","message":{"text":"VideoReferenceListField.VideoReferenceListField (cognitive 53): VideoReferenceListField.VideoReferenceListField has cognitive complexity 53 (threshold 15). Drivers by points: if/else 19 (21 pts), boolean chains 16, ternaries 10 (13 pts), error handling 3 (nesting depth added 5). Most of this is not in the body itself: 11 of the 53 points are its own statements and the rest belongs to 17 function literals inside it that branch (lines 558, 540, 470, \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":"invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx"},"region":{"startLine":363}}}],"partialFingerprints":{"codehealthFindingId/v1":"07ee1bde9299d214c52c9631cd517656f36f8d273fe1cbe51d5bed4a0bcef1c2"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasEntityObjectRenderer.renderObject (cognitive 52): CanvasEntityObjectRenderer.renderObject has cognitive complexity 52 (threshold 15). Drivers by points: if/else 21 (31 pts), boolean chains 21 (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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"058631dfc6707c52f35d908f7aab96f2c16e02cfd7179e812c5297fff909474d"}},{"ruleId":"D2","level":"warning","message":{"text":"buildGraph.getProjectGraphReadiness (cognitive 52): buildGraph.getProjectGraphReadiness has cognitive complexity 52 (threshold 15). Drivers by points: if/else 19 (42 pts), boolean chains 6, loops 2 (3 pts), 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":"invokeai/frontend/webv2/src/features/workflow/core/buildGraph.ts"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"22d8ccbf8b52e4fd8c9b176b953caaa9685cf7d98ed7b3307e2b234f411be56d"}},{"ruleId":"D2","level":"warning","message":{"text":"buildGraph.compileProjectGraph (cognitive 52): buildGraph.compileProjectGraph has cognitive complexity 52 (threshold 15). Drivers by points: if/else 13 (31 pts), boolean chains 10, ternaries 2 (7 pts), loops 3 (4 pts) (nesting depth added 24). Of this number, 51 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":"invokeai/frontend/webv2/src/features/workflow/core/buildGraph.ts"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebc062f0249c03fa05385cb91e39d966c94e8c2fd585587c5017ad48e80403e2"}},{"ruleId":"D2","level":"warning","message":{"text":"useGalleryUploadAction.useGalleryUploadAction (cognitive 51): useGalleryUploadAction.useGalleryUploadAction has cognitive complexity 51 (threshold 15). Drivers by points: ternaries 18 (26 pts), if/else 10 (14 pts), boolean chains 7, error handling 2 (3 pts), loops 1 (nesting depth added 13). None of this is in the body itself: all 51 points belong to 8 function literals inside it that branch (lines 68, 148, 218, \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":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryUploadAction.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fde66ce15bf8a755986558ec37c8c2199fc8bf8bff1e07f91f7cc0725650aea"}},{"ruleId":"D2","level":"warning","message":{"text":"CallSavedWorkflowSyncRuntime.CallSavedWorkflowSyncRuntime::reconcile (cognitive 51): CallSavedWorkflowSyncRuntime.CallSavedWorkflowSyncRuntime::reconcile has cognitive complexity 51 (threshold 15). Drivers by points: if/else 14 (30 pts), boolean chains 10, ternaries 5 (10 pts), loops 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/CallSavedWorkflowSyncRuntime.tsx"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"73043445dce1928f19a60cc6d0497c7a07fb3d211221b951d22139f8cddf0443"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionNodeBuilder._create_nested_iterate_body_iteration (cognitive 50): _ExecutionNodeBuilder._create_nested_iterate_body_iteration has cognitive complexity 50 (threshold 15). Drivers by points: if/else 18 (37 pts), loops 7 (9 pts), boolean chains 4 (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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":1017}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ba1e9590bcc5941d925af1a05684349a2fd7b67b9ceb783fbc3d969f2398729"}},{"ruleId":"D2","level":"warning","message":{"text":"hidiffusion_utils.hidiffusion_patch (cognitive 50): hidiffusion_utils.hidiffusion_patch has cognitive complexity 50 (threshold 15). Drivers by points: if/else 15 (22 pts), error handling 8 (19 pts), boolean chains 5, ternaries 4 (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":"invokeai/backend/stable_diffusion/hidiffusion_utils.py"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ff639785b114108a3863a2b4806ac282ac94719ed9e7510d2e45465bfec8444"}},{"ruleId":"D2","level":"warning","message":{"text":"check_platform_locks.check_torch (cognitive 50): check_platform_locks.check_torch has cognitive complexity 50 (threshold 15). Drivers by points: if/else 6 (26 pts), loops 5 (15 pts), ternaries 1 (5 pts), boolean chains 4 (nesting depth added 34). To reduce it, split the body into named stages: move each independent step or branch into 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/check_platform_locks.py"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"fed5d9912f3450702db0f38ea06becf812b1e0371c5fbb22d1593cf5ab2a7b46"}},{"ruleId":"D2","level":"warning","message":{"text":"modelRequirements.extractWorkflowModelRequirements (cognitive 50): modelRequirements.extractWorkflowModelRequirements has cognitive complexity 50 (threshold 15). Drivers by points: if/else 15 (41 pts), loops 3 (7 pts), boolean chains 2 (nesting depth added 30). Of this number, 39 points are the body\u0027s own statements and 11 belong to one function item 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":"invokeai/frontend/webv2/src/features/workflow/core/modelRequirements.ts"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"44c0aa182d6f77098e1762b6440731c70319ae4483a20adf9184bb804a9b117c"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryMaintenance.GalleryMaintenance (cognitive 50): GalleryMaintenance.GalleryMaintenance has cognitive complexity 50 (threshold 15). Drivers by points: if/else 18 (23 pts), boolean chains 14, ternaries 7, error handling 4 (6 pts) (nesting depth added 7). Most of this is not in the body itself: 10 of the 50 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 157, 235, 108, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/GalleryMaintenance.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"70f7c6aa977c5716106ea8c60cc66b99f1b2cffe972cd0694fd5b439a775b4c6"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionNodeBuilder._create_nested_for_body_iteration (cognitive 49): _ExecutionNodeBuilder._create_nested_for_body_iteration has cognitive complexity 49 (threshold 15). Drivers by points: if/else 15 (32 pts), loops 7 (13 pts), boolean chains 4 (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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":894}}}],"partialFingerprints":{"codehealthFindingId/v1":"c89446113d0dc8bcc1f4caa7113b358dbbb77eab41344dd26751a51b08f1ed69"}},{"ruleId":"D2","level":"warning","message":{"text":"SeedreamProvider.generate (cognitive 48): SeedreamProvider.generate has cognitive complexity 48 (threshold 15). Drivers by points: if/else 21 (28 pts), ternaries 5 (13 pts), boolean chains 5, loops 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":"invokeai/app/services/external_generation/providers/seedream.py"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"df928746197d864fb5b92bb7a6a5cffdcb62b184376d069edbf85e991574e924"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryMaintenanceService._archive_snapshot_files (cognitive 48): GalleryMaintenanceService._archive_snapshot_files has cognitive complexity 48 (threshold 15). Drivers by points: if/else 9 (27 pts), ternaries 5 (13 pts), error handling 1 (3 pts), loops 2 (3 pts), boolean chains 2 (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":"invokeai/app/services/gallery_maintenance/gallery_maintenance_default.py"},"region":{"startLine":734}}}],"partialFingerprints":{"codehealthFindingId/v1":"f70b4ae912ce54f8c733962273717591e7e62ea69aa19a5f7e47767c2c59ffe3"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._can_use_generic_serial_nested_for_scheduler (cognitive 48): GraphExecutionState._can_use_generic_serial_nested_for_scheduler has cognitive complexity 48 (threshold 15). Drivers by points: if/else 21 (30 pts), boolean chains 16, loops 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1158}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba6bb374b48f9f4ee464ab475a974fb17a0a993b70fa0c989c9612109efd1f24"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._can_use_generic_nested_iterate_scheduler (cognitive 48): GraphExecutionState._can_use_generic_nested_iterate_scheduler has cognitive complexity 48 (threshold 15). Drivers by points: if/else 27 (32 pts), boolean chains 16 (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1404}}}],"partialFingerprints":{"codehealthFindingId/v1":"46d02c461a18f0fde88d1ff75491adb1387fc460db6cf1b4ff3851821736b2b7"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionNodeBuilder._get_sibling_iterate_if_collect_branches (cognitive 48): _ExecutionNodeBuilder._get_sibling_iterate_if_collect_branches has cognitive complexity 48 (threshold 15). Drivers by points: if/else 12 (28 pts), loops 6 (11 pts), boolean chains 5, ternaries 1 (4 pts) (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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":1844}}}],"partialFingerprints":{"codehealthFindingId/v1":"390b3ca17b3ec6b22dfebf39da1ab6851c719d448c21c83a6528ffdb43d6aaeb"}},{"ruleId":"D2","level":"warning","message":{"text":"promptAST.parseTokens::tryParseUnquotedPromptFunction (cognitive 48): promptAST.parseTokens::tryParseUnquotedPromptFunction has cognitive complexity 48 (threshold 15). Drivers by points: if/else 14 (30 pts), loops 5 (11 pts), ternaries 2 (4 pts), boolean chains 3 (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. This shape REPEATS in the file: 3 other methods here (promptAST.parseTokens::isUnquotedPromptFunctionAhead, promptAST.parseTokens::tryParsePromptFunction, promptAST.parseTokens::parseGroup) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 4 times rather than 4 independent problems. Splitting this body alone leaves the other 3 exactly as they are. Where these are variations on one operation, the change that clears all 4 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":"invokeai/frontend/webv1/src/common/util/promptAST.ts"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ebae9da734b03b6f9dbec9c3614c058af7c284d4f449bd0ce9e8f94f932df9b"}},{"ruleId":"D2","level":"warning","message":{"text":"useCleanupDialog.useCleanupDialog.confirm (cognitive 48): useCleanupDialog.useCleanupDialog.confirm has cognitive complexity 48 (threshold 15). Drivers by points: ternaries 9 (27 pts), if/else 5 (11 pts), boolean chains 6, error handling 2 (4 pts) (nesting depth added 26). Of this number, 21 points are the body\u0027s own statements and 27 belong to 4 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":"invokeai/frontend/webv2/src/features/intermediates/ui/useCleanupDialog.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"acbe3e91539d8129b5abb23cc2c3ecf32049bec9530fb2043b772c6771bf988f"}},{"ruleId":"D2","level":"warning","message":{"text":"ListItem.ListItem (cognitive 48): ListItem.ListItem has cognitive complexity 48 (threshold 15). Drivers by points: ternaries 18 (22 pts), boolean chains 19, if/else 7 (nesting depth added 4). Of this number, 34 points are the body\u0027s own statements and 14 belong to 6 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/list/ListItem.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ecbfca8de09ec3c0181f123fd6c3cd87d45d58df941823f101fb099e5acdf6d"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._build_execution_tokens (cognitive 47): GraphExecutionState._build_execution_tokens has cognitive complexity 47 (threshold 15). Drivers by points: ternaries 12 (27 pts), if/else 8 (15 pts), loops 3 (4 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":3027}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b3e688c2974e0001648c75148f58feca510a3bf6db23228643baff3175340af"}},{"ruleId":"D2","level":"warning","message":{"text":"measure-architecture-performance.runSample (cognitive 47): measure-architecture-performance.runSample has cognitive complexity 47 (threshold 15). Drivers by points: if/else 22 (35 pts), boolean chains 8, ternaries 3 (4 pts) (nesting depth added 14). Of this number, 33 points are the body\u0027s own statements and 14 belong to 10 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":"invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"536bd5d5825e3b6cf3db259c2fc056dac0c069982c9286d28e819f8a34878a9d"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelSelect.ModelSelect (cognitive 47): ModelSelect.ModelSelect has cognitive complexity 47 (threshold 15). Drivers by points: ternaries 24 (30 pts), boolean chains 11, if/else 5 (6 pts) (nesting depth added 7). Of this number, 39 points are the body\u0027s own statements and 8 belong to 7 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, 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":"invokeai/frontend/webv2/src/features/models/ui/components/ModelSelect.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbca94a3508eb6a680f6f1ef6413a81e0b626325860b9e137a7c56a0f7dc25ef"}},{"ruleId":"D2","level":"warning","message":{"text":"ManagerLayout.ManagerLayout (cognitive 47): ManagerLayout.ManagerLayout has cognitive complexity 47 (threshold 15). Drivers by points: boolean chains 21, if/else 17 (19 pts), ternaries 6 (7 pts) (nesting depth added 3). Most of this is not in the body itself: 3 of the 47 points are its own statements and the rest belongs to 10 function items inside it that branch (watchFocus::tick, a function literal at line 255, repairFocus, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/ManagerLayout.tsx"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"f44b9b4d46c61213e422f8358a48de3dc08f48bb3975b395eaa31d5371e2d60f"}},{"ruleId":"D2","level":"warning","message":{"text":"queueRunRestoration.normalizeRestoredQueueItem (cognitive 47): queueRunRestoration.normalizeRestoredQueueItem has cognitive complexity 47 (threshold 15). Drivers by points: boolean chains 23, ternaries 12, if/else 9 (11 pts), error handling 1 (nesting depth added 2). 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":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRunRestoration.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4f4f9e53bc57f8a7e5dfb53caf173bdbdd51dceb6433ea061b23d3d99db3426"}},{"ruleId":"D2","level":"warning","message":{"text":"ControlLayerSettings.ControlLayerSettings (cognitive 47): ControlLayerSettings.ControlLayerSettings has cognitive complexity 47 (threshold 15). Drivers by points: boolean chains 16, ternaries 15 (16 pts), if/else 14 (15 pts) (nesting depth added 2). Of this number, 19 points are the body\u0027s own statements and 28 belong to 18 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b62b1eeb3e16910c44b68fe78730e51a746b60ca7c1d80f266dd5d59056bde8"}},{"ruleId":"D2","level":"warning","message":{"text":"Krea2DenoiseInvocation._run_diffusion (cognitive 46): Krea2DenoiseInvocation._run_diffusion has cognitive complexity 46 (threshold 15). Drivers by points: if/else 24 (32 pts), ternaries 8, boolean chains 5, loops 1 (nesting depth added 8). 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":"invokeai/app/invocations/krea2/krea2_denoise.py"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"6993474cda9806b624076cef0fc3554b40300eaedaa45f33f0a0fcffe870fdb1"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelInstallService._remove_stale_install_source_claims_locked (cognitive 46): ModelInstallService._remove_stale_install_source_claims_locked has cognitive complexity 46 (threshold 15). Drivers by points: if/else 12 (26 pts), error handling 6 (14 pts), boolean chains 4, loops 2 (nesting depth added 22). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"f119a4b8c0e199f3c8ebdce26037f99a398c08ae900fe2f71942ad899870baf7"}},{"ruleId":"D2","level":"warning","message":{"text":"execution_effects.normalize_persisted_execution_effects (cognitive 46): execution_effects.normalize_persisted_execution_effects has cognitive complexity 46 (threshold 15). Drivers by points: if/else 11 (31 pts), error handling 2 (7 pts), loops 3 (6 pts), boolean chains 2 (nesting depth added 28). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/execution_effects.py"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"01c6a3d27fc7d1c601010a87a919c3f667660d8469ac8156a77b951d6a558425"}},{"ruleId":"D2","level":"warning","message":{"text":"FilterResultController.commit (cognitive 46): FilterResultController.commit has cognitive complexity 46 (threshold 15). Drivers by points: if/else 21 (25 pts), ternaries 6 (11 pts), boolean chains 9, error handling 1 (nesting depth added 9). Of this number, 43 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/filterResultController.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"2157b23d74d6508752e3676c17ecc8bd8ce2e7f03c3893cd5f9f18be4c48b666"}},{"ruleId":"D2","level":"warning","message":{"text":"WanVideoDenoiseInvocation._run_diffusion (cognitive 45): WanVideoDenoiseInvocation._run_diffusion has cognitive complexity 45 (threshold 15). Drivers by points: if/else 16 (22 pts), ternaries 9 (13 pts), boolean chains 9, 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":"invokeai/app/invocations/wan/wan_video_denoise.py"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"287d45de054719dfd5d6faebbd6cc345eecbbefeb8ddb5464ea601b9483995de"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_iterate_planner._get_direct_iterate_collect_nodes (cognitive 45): graph_iterate_planner._get_direct_iterate_collect_nodes has cognitive complexity 45 (threshold 15). Drivers by points: if/else 27 (35 pts), boolean chains 8, loops 2 (nesting depth added 8). 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":"invokeai/app/services/shared/graph_iterate_planner.py"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdd3856fb6eae859a643813b06d7468decd16a5f6fc0413e66d1c4ebd8ea65e2"}},{"ruleId":"D2","level":"warning","message":{"text":"calibrate_flux_vae_working_memory.main (cognitive 45): calibrate_flux_vae_working_memory.main has cognitive complexity 45 (threshold 15). Drivers by points: if/else 11 (18 pts), ternaries 7 (15 pts), loops 4 (8 pts), boolean chains 4 (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":"scripts/calibrate_flux_vae_working_memory.py"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d5aa78c733cf06bc6355df19fd400f46575aef981e7e201f3a8ce0c73f60924"}},{"ruleId":"D2","level":"warning","message":{"text":"promptAST.parseTokens::parseGroup (cognitive 45): promptAST.parseTokens::parseGroup has cognitive complexity 45 (threshold 15). Drivers by points: if/else 11 (36 pts), loops 2 (4 pts), boolean chains 3, match/switch 1 (2 pts) (nesting depth added 28). To reduce it, split the body into named stages: move each independent 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: 3 other methods here (promptAST.parseTokens::isUnquotedPromptFunctionAhead, promptAST.parseTokens::tryParsePromptFunction, promptAST.parseTokens::tryParseUnquotedPromptFunction) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 4 times rather than 4 independent problems. Splitting this body alone leaves the other 3 exactly as they are. Where these are variations on one operation, the change that clears all 4 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":"invokeai/frontend/webv1/src/common/util/promptAST.ts"},"region":{"startLine":651}}}],"partialFingerprints":{"codehealthFindingId/v1":"49b0fbd54d14db59235c85d8c1231d98f94a1255a7128b951bd82427739990fb"}},{"ruleId":"D2","level":"warning","message":{"text":"settings.normalizeVideoSettings (cognitive 45): settings.normalizeVideoSettings has cognitive complexity 45 (threshold 15). Drivers by points: ternaries 34 (35 pts), boolean chains 9, if/else 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":"invokeai/frontend/webv2/src/features/video/core/settings.ts"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"85bcc7a1c3b55b9c97efcf645a5e562117260a3b2dde5570809f6b9f8646d0a1"}},{"ruleId":"D2","level":"warning","message":{"text":"graphToDocument.previewGraphToDocument (cognitive 45): graphToDocument.previewGraphToDocument has cognitive complexity 45 (threshold 15). Drivers by points: if/else 11 (25 pts), ternaries 4 (9 pts), boolean chains 6, loops 4 (5 pts) (nesting depth added 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":"invokeai/frontend/webv2/src/features/workflow/core/graphToDocument.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"f71c383ecddc4b995155e2333bfbee09bb9a3ce913bde699243223fa9b1938d0"}},{"ruleId":"D2","level":"warning","message":{"text":"templates.parseInvocationSchema (cognitive 45): templates.parseInvocationSchema has cognitive complexity 45 (threshold 15). Drivers by points: if/else 9 (16 pts), ternaries 15, boolean chains 12, loops 2 (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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/data/templates.ts"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"41a324f91218433fb9379883bbb97f90d24fef4db9b9f542e21993c24a028ace"}},{"ruleId":"D2","level":"warning","message":{"text":"InvocationFlowNode.InputFieldRow (cognitive 45): InvocationFlowNode.InputFieldRow has cognitive complexity 45 (threshold 15). Drivers by points: ternaries 23 (36 pts), boolean chains 8, if/else 1 (nesting depth added 13). Of this number, 40 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.tsx"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"645845974d6114ee1daab6228f9420ddd514a08bd774cce01831c76dc7a5ad73"}},{"ruleId":"D2","level":"warning","message":{"text":"layerTreeDrop.projectLayerDrop (cognitive 45): layerTreeDrop.projectLayerDrop has cognitive complexity 45 (threshold 15). Drivers by points: if/else 15 (25 pts), ternaries 7 (11 pts), loops 3 (5 pts), boolean chains 4 (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":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerTreeDrop.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1038018a59cec152e03fb63b871733ee99b14b7d87c1e810bd6c06024feaccc"}},{"ruleId":"D2","level":"warning","message":{"text":"PreviewFrame.PreviewImageFrame (cognitive 45): PreviewFrame.PreviewImageFrame has cognitive complexity 45 (threshold 15). Drivers by points: ternaries 22 (28 pts), boolean chains 12, if/else 5 (nesting depth added 6). Of this number, 34 points are the body\u0027s own statements and 11 belong to 6 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b4d86bacece510fb5519459ec49f68e426d02a813d644b81fe27ef31e063db6"}},{"ruleId":"D2","level":"warning","message":{"text":"LayerMutationController.commitDuplicate (cognitive 45): LayerMutationController.commitDuplicate has cognitive complexity 45 (threshold 15). Drivers by points: if/else 19 (26 pts), boolean chains 11, ternaries 6, loops 2 (nesting depth added 7). Of this number, 19 points are the body\u0027s own statements and 26 belong to 11 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, 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"1faae806aba7d98becff2c0ca751848379d58a9237c89ca7c8606bb97aeed9cb"}},{"ruleId":"D2","level":"warning","message":{"text":"Flux2DenoiseInvocation._run_diffusion (cognitive 44): Flux2DenoiseInvocation._run_diffusion has cognitive complexity 44 (threshold 15). Drivers by points: if/else 22 (26 pts), ternaries 11 (12 pts), boolean chains 6 (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux2/flux2_denoise.py"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea36d0674cd8739d0f05fe6c04c15f901c7806122427d2edd715299e9dfa804b"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_scheduler._prepare_deferred_nested_for_body (cognitive 44): graph_scheduler._prepare_deferred_nested_for_body has cognitive complexity 44 (threshold 15). Drivers by points: if/else 10 (31 pts), loops 3 (6 pts), boolean chains 5, ternaries 1 (2 pts) (nesting depth added 25). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_scheduler.py"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"b72e3e76602de47a664eb53db5133418146eb422879ec78819cfa8c8a154e808"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasEntityBufferObjectRenderer.renderBufferObject (cognitive 44): CanvasEntityBufferObjectRenderer.renderBufferObject has cognitive complexity 44 (threshold 15). Drivers by points: if/else 23 (33 pts), boolean chains 11 (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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityBufferObjectRenderer.ts"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2dd2e8345e94f5d9edf88b3a11d924fd0bb00de228f498b77952ba65a54d045"}},{"ruleId":"D2","level":"warning","message":{"text":"coordinator.createQueueCoordinator.reconcile (cognitive 44): coordinator.createQueueCoordinator.reconcile has cognitive complexity 44 (threshold 15). Drivers by points: ternaries 9 (23 pts), boolean chains 8, if/else 5 (8 pts), loops 2 (3 pts), error handling 1 (2 pts) (nesting depth added 19). Of this number, 31 points are the body\u0027s own statements and 13 belong to 4 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":"invokeai/frontend/webv2/src/features/queue/runtime/coordinator.ts"},"region":{"startLine":1043}}}],"partialFingerprints":{"codehealthFindingId/v1":"21c5318fb5e224d28d075ab123bb53ede80922fed3a04a1104acdb14533d8552"}},{"ruleId":"D2","level":"warning","message":{"text":"HsvWheelPicker.HsvWheelPicker (cognitive 44): HsvWheelPicker.HsvWheelPicker has cognitive complexity 44 (threshold 15). Drivers by points: ternaries 13 (22 pts), if/else 9 (11 pts), boolean chains 8, loops 2 (3 pts) (nesting depth added 12). Most of this is not in the body itself: 6 of the 44 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 62, 189, 171, \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":"invokeai/frontend/webv2/src/platform/ui/HsvWheelPicker.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"f560a314d46bf615c945682edd8c56a146cd9211139f5627b9b76ba6d002a488"}},{"ruleId":"D2","level":"warning","message":{"text":"List.List (cognitive 44): List.List has cognitive complexity 44 (threshold 15). Drivers by points: if/else 17 (20 pts), boolean chains 11, ternaries 10 (11 pts), loops 1, match/switch 1 (nesting depth added 4). Of this number, 19 points are the body\u0027s own statements and 25 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":"invokeai/frontend/webv2/src/platform/ui/list/List.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"89dc669a07d6379a8a8904143af1a9c4a94515df79ed7e239c752888c7c00a91"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasWidgetView.CanvasWidgetView (cognitive 44): CanvasWidgetView.CanvasWidgetView has cognitive complexity 44 (threshold 15). Drivers by points: ternaries 16 (17 pts), if/else 13 (14 pts), boolean chains 10, error handling 2, loops 1 (nesting depth added 2). Most of this is not in the body itself: 14 of the 44 points are its own statements and the rest belongs to 14 function literals inside it that branch (lines 318, 156, 205, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasWidgetView.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"da13834554d11bc6cd91c7482330d36193de26ea2ba1f4fb19c887e620f7eb08"}},{"ruleId":"D2","level":"warning","message":{"text":"layerPanelRows.navigateTree (cognitive 44): layerPanelRows.navigateTree has cognitive complexity 44 (threshold 15). Drivers by points: if/else 12 (24 pts), ternaries 5 (12 pts), boolean chains 7, match/switch 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerPanelRows.ts"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"1750e998d383ced37f42fcdee7d1d08b2a27aa678a5e7e6216dc8d38372aedba"}},{"ruleId":"D2","level":"warning","message":{"text":"strokeSession.createStrokeSession.paint (cognitive 44): strokeSession.createStrokeSession.paint has cognitive complexity 44 (threshold 15). Drivers by points: if/else 19 (22 pts), ternaries 10 (11 pts), boolean chains 9, loops 1 (2 pts) (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/strokeSession.ts"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"e55d7cabfe37f252be564a02d5225d278f87581aeef4db9153623427cbe29e96"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageIndexService._worker_loop (cognitive 43): ImageIndexService._worker_loop has cognitive complexity 43 (threshold 15). Drivers by points: if/else 12 (29 pts), error handling 4 (9 pts), loops 2 (4 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":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1125}}}],"partialFingerprints":{"codehealthFindingId/v1":"d058884e48861e4eb9a53d234dc997700d5f06a8eabba3df402ca87b0c55936f"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._record_continuation_effects (cognitive 43): GraphExecutionState._record_continuation_effects has cognitive complexity 43 (threshold 15). Drivers by points: if/else 10 (31 pts), ternaries 3 (6 pts), boolean chains 5, loops 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1841}}}],"partialFingerprints":{"codehealthFindingId/v1":"460e934bfeb9ec32e2db6ceee5637efb59b1929b04134cb7dd8754bf55d9964c"}},{"ruleId":"D2","level":"warning","message":{"text":"Graph._validate_type_dependents_after_edge (cognitive 43): Graph._validate_type_dependents_after_edge has cognitive complexity 43 (threshold 15). Drivers by points: if/else 15 (37 pts), boolean chains 3, loops 2 (3 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":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":792}}}],"partialFingerprints":{"codehealthFindingId/v1":"126334719f5bf24869b5211849534690299cc2c4d0ec1a61938c8f98e1483c73"}},{"ruleId":"D2","level":"warning","message":{"text":"Editor.getNextCropBoxByHandleWithAspectRatio (cognitive 43): Editor.getNextCropBoxByHandleWithAspectRatio has cognitive complexity 43 (threshold 15). Drivers by points: if/else 23 (30 pts), boolean chains 9, 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":"invokeai/frontend/webv1/src/features/cropper/lib/editor.ts"},"region":{"startLine":746}}}],"partialFingerprints":{"codehealthFindingId/v1":"8102ca9bc2d56ee7516b761e1dd63e9fa0799df91b02fed8bdf254878ca63f71"}},{"ruleId":"D2","level":"warning","message":{"text":"readiness.getReasonsWhyCannotEnqueueWorkflowsTab (cognitive 43): readiness.getReasonsWhyCannotEnqueueWorkflowsTab has cognitive complexity 43 (threshold 15). Drivers by points: if/else 13 (32 pts), loops 4 (11 pts) (nesting depth added 26). Of this number, 35 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":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":642}}}],"partialFingerprints":{"codehealthFindingId/v1":"273ea0e9a2b7619477c8b4d738db95c0bd3739e1494a6003a9d6ec4c104cea86"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryBoardsPanel.GalleryBoardsPanel (cognitive 43): GalleryBoardsPanel.GalleryBoardsPanel has cognitive complexity 43 (threshold 15). Drivers by points: ternaries 22 (25 pts), boolean chains 12, if/else 6 (nesting depth added 3). Of this number, 23 points are the body\u0027s own statements and 20 belong to 12 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, 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardsPanel.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec6d05f38aaff76c26c1e42f7da1220b68acbf13e6903071a38f54e797042ff4"}},{"ruleId":"D2","level":"warning","message":{"text":"UpscaleWidgetView.UpscaleWidgetView (cognitive 43): UpscaleWidgetView.UpscaleWidgetView has cognitive complexity 43 (threshold 15). Drivers by points: ternaries 17 (19 pts), boolean chains 16, if/else 8 (nesting depth added 2). Of this number, 16 points are the body\u0027s own statements and 27 belong to 14 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f2033281b66f9201b8500ddecb3c7d24a68300afcd3162e735618c247bc1132"}},{"ruleId":"D2","level":"warning","message":{"text":"templates.parseFieldType (cognitive 43): templates.parseFieldType has cognitive complexity 43 (threshold 15). Drivers by points: if/else 14 (29 pts), ternaries 4 (9 pts), boolean chains 5 (nesting depth added 20). Of this number, 42 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":"invokeai/frontend/webv2/src/features/workflow/data/templates.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"603e4eb803ef63f30b9b5b3edfbc8a2cbf52812a453b2c63184ed2422fe8a9ab"}},{"ruleId":"D2","level":"warning","message":{"text":"ResizeHandle.ResizeHandle (cognitive 43): ResizeHandle.ResizeHandle has cognitive complexity 43 (threshold 15). Drivers by points: ternaries 15 (25 pts), if/else 12 (13 pts), boolean chains 5 (nesting depth added 11). Most of this is not in the body itself: 2 of the 43 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 299, 224, 255, \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":"invokeai/frontend/webv2/src/platform/ui/ResizeHandle.tsx"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec6a8dbd85232e2bcbd143da7065cb98341c33e06dfd88ef8ea53c38aeb1b2c0"}},{"ruleId":"D2","level":"warning","message":{"text":"ExtractMaskedAreaController.extract (cognitive 43): ExtractMaskedAreaController.extract has cognitive complexity 43 (threshold 15). Drivers by points: if/else 20 (21 pts), boolean chains 13, ternaries 4 (7 pts), loops 2 (nesting depth added 4). Of this number, 42 points are the body\u0027s own statements and 1 belongs to one function item 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/extractMaskedAreaController.ts"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7572e764d48e1cb353b53328afffd90ec5064e62c2e3c71fbed644345e95fb9"}},{"ruleId":"D2","level":"warning","message":{"text":"videoRecallRuntime.createVideoRecallRuntime::apply (cognitive 43): videoRecallRuntime.createVideoRecallRuntime::apply has cognitive complexity 43 (threshold 15). Drivers by points: if/else 16 (21 pts), ternaries 7 (20 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":"invokeai/frontend/webv2/src/workbench/image-actions/videoRecallRuntime.ts"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"77ad914dcf37481f6644cda26c93b082af5da08cf7930691e98386ae019c3e70"}},{"ruleId":"D2","level":"warning","message":{"text":"FluxDenoiseInvocation._run_diffusion (cognitive 42): FluxDenoiseInvocation._run_diffusion has cognitive complexity 42 (threshold 15). Drivers by points: if/else 25 (31 pts), ternaries 6 (7 pts), boolean chains 4 (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":"invokeai/app/invocations/flux/flux_denoise.py"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"10f9d1460082bbbfaf461ecc5e16520f86579a7599f8576b2afb7687a0d7360a"}},{"ruleId":"D2","level":"warning","message":{"text":"QwenImageDenoiseInvocation._run_diffusion (cognitive 42): QwenImageDenoiseInvocation._run_diffusion has cognitive complexity 42 (threshold 15). Drivers by points: if/else 25 (34 pts), boolean chains 5, ternaries 2, 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":"invokeai/app/invocations/qwen_image/qwen_image_denoise.py"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"576e836c9e57bff3cfb18d20c9e65146f157e4ab08cf834d32c6cb22a41f4853"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._rehydrate_resolved_if_exec_branches (cognitive 42): GraphExecutionState._rehydrate_resolved_if_exec_branches has cognitive complexity 42 (threshold 15). Drivers by points: if/else 12 (35 pts), loops 3 (5 pts), 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":3667}}}],"partialFingerprints":{"codehealthFindingId/v1":"8927658fbbb182ead22c5092dcb3451c727362ad11ec69af23dcf8c62f675a86"}},{"ruleId":"D2","level":"warning","message":{"text":"aac_splice._read_audio_track (cognitive 42): aac_splice._read_audio_track has cognitive complexity 42 (threshold 15). Drivers by points: if/else 19 (24 pts), boolean chains 12, ternaries 4 (5 pts), loops 1 (nesting depth added 6). 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":"invokeai/app/util/aac_splice.py"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"c96fef25a650e6d633b2b6da744d185d82af79daf66c2681e302f8210e617263"}},{"ruleId":"D2","level":"warning","message":{"text":"Qwen3EncoderGGUFLoader._load_from_gguf (cognitive 42): Qwen3EncoderGGUFLoader._load_from_gguf has cognitive complexity 42 (threshold 15). Drivers by points: if/else 19 (28 pts), boolean chains 4, error handling 1 (4 pts), ternaries 4, loops 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":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":1496}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce61e5208026f06e950d814f93b096637ec34c040ce229578641deeb24c78476"}},{"ruleId":"D2","level":"warning","message":{"text":"z_image._convert_z_image_gguf_to_diffusers (cognitive 42): z_image._convert_z_image_gguf_to_diffusers has cognitive complexity 42 (threshold 15). Drivers by points: if/else 13 (35 pts), loops 2 (6 pts), boolean chains 1 (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":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f96c65d5f8b536cc9c42a95ddf89ed92374c85843227aa8419c049b7db4ecf5"}},{"ruleId":"D2","level":"warning","message":{"text":"settings.normalizeGenerateSettings (cognitive 42): settings.normalizeGenerateSettings has cognitive complexity 42 (threshold 15). Drivers by points: ternaries 34 (36 pts), boolean chains 4, if/else 2 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/settings.ts"},"region":{"startLine":743}}}],"partialFingerprints":{"codehealthFindingId/v1":"c581792ee760efa887f1c5de1166476cddc8de097d7461f2156c86ff15f8a282"}},{"ruleId":"D2","level":"warning","message":{"text":"dynamicPromptSyntax.scanDynamicPromptSyntax (cognitive 42): dynamicPromptSyntax.scanDynamicPromptSyntax has cognitive complexity 42 (threshold 15). Drivers by points: if/else 13 (26 pts), ternaries 3 (9 pts), boolean chains 4, loops 3 (nesting depth added 19). Of this number, 40 points are the body\u0027s own statements and 2 belong to 2 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":"invokeai/frontend/webv2/src/features/generation/core/prompt/dynamicPromptSyntax.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"b024f534b31fd4ba80a5c0089f966d6d2b37191c989f9840696acb52d4892ade"}},{"ruleId":"D2","level":"warning","message":{"text":"runtime.createQueueRuntime.synchronizeRunPersistence (cognitive 42): runtime.createQueueRuntime.synchronizeRunPersistence has cognitive complexity 42 (threshold 15). Drivers by points: if/else 13 (30 pts), boolean chains 7, loops 4 (5 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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":1923}}}],"partialFingerprints":{"codehealthFindingId/v1":"a82c832c3ef4b02411c12fb02e572f50efa7039536d7ba36cd2a5ca4cc17fb49"}},{"ruleId":"D2","level":"warning","message":{"text":"InvokeImageBlendInvocation.apply_blend (cognitive 41): InvokeImageBlendInvocation.apply_blend has cognitive complexity 41 (threshold 15). Drivers by points: if/else 19 (30 pts), ternaries 4 (8 pts), boolean chains 3 (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":"invokeai/app/invocations/composition-nodes.py"},"region":{"startLine":679}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4efd49d05dc5c8766cb421daa5d091e4aeb1b233916b5bb03e469422b0cb1a1"}},{"ruleId":"D2","level":"warning","message":{"text":"Graph._is_for_connection_valid (cognitive 41): Graph._is_for_connection_valid has cognitive complexity 41 (threshold 15). Drivers by points: if/else 16 (26 pts), boolean chains 7, loops 5 (7 pts), ternaries 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":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":1353}}}],"partialFingerprints":{"codehealthFindingId/v1":"b910eec122292d6505be4ecf83b050f643a309b2774f9b2b522fcc04c6a568a4"}},{"ruleId":"D2","level":"warning","message":{"text":"ControlNetModel.forward (cognitive 41): ControlNetModel.forward has cognitive complexity 41 (threshold 15). Drivers by points: if/else 21 (30 pts), ternaries 3 (7 pts), boolean chains 2, loops 2 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/hotfixes.py"},"region":{"startLine":570}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ea21034deb51f773264c8703c37bb22a828affd7958f4c499f794389b23d01c"}},{"ruleId":"D2","level":"warning","message":{"text":"UseDefaultSettingsButton.UseDefaultSettingsButton (cognitive 41): UseDefaultSettingsButton.UseDefaultSettingsButton has cognitive complexity 41 (threshold 15). Drivers by points: if/else 16 (26 pts), boolean chains 14, ternaries 1 (nesting depth added 10). Most of this is not in the body itself: 1 of the 41 points is its own statement and the rest belongs to 5 function literals inside it that branch (lines 62, 133, 40, \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":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"66c80fe84bfc6f8e48e2967094477f752d7b49f7c45ceebbdc3f32da6d6131ae"}},{"ruleId":"D2","level":"warning","message":{"text":"StagingBar.StagingBar (cognitive 41): StagingBar.StagingBar has cognitive complexity 41 (threshold 15). Drivers by points: ternaries 17 (33 pts), boolean chains 4, if/else 3 (4 pts) (nesting depth added 17). Of this number, 32 points are the body\u0027s own statements and 9 belong to 2 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/StagingBar.tsx"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"3679b85871a7f83ed6d2d013ab7031a1d26e44c0e654685a532ef72626ee2d26"}},{"ruleId":"D2","level":"warning","message":{"text":"useCompareLoupe.useCompareLoupe (cognitive 41): useCompareLoupe.useCompareLoupe has cognitive complexity 41 (threshold 15). Drivers by points: if/else 24 (28 pts), boolean chains 8, loops 2 (3 pts), ternaries 1 (2 pts) (nesting depth added 6). Most of this is not in the body itself: 1 of the 41 points is its own statement and the rest belongs to 9 function literals inside it that branch (lines 399, 210, 323, \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":"invokeai/frontend/webv2/src/workbench/widgets/preview/useCompareLoupe.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"93eb5ddf6012cfd976bcede88a260e43dcf64c8a41c737db3635cb49890e5ef6"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState.apply (cognitive 40): GraphExecutionState.apply has cognitive complexity 40 (threshold 15). Drivers by points: if/else 14 (21 pts), boolean chains 9, ternaries 3 (8 pts), error handling 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":3153}}}],"partialFingerprints":{"codehealthFindingId/v1":"aee7d37c3b128a564c7ebda046a6bd6d58c6e39c2878604306fdd83cea27b2b5"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_if_runtime._get_effective_iteration_paths_for_edge (cognitive 40): graph_if_runtime._get_effective_iteration_paths_for_edge has cognitive complexity 40 (threshold 15). Drivers by points: if/else 12 (27 pts), boolean chains 5, loops 2 (4 pts), ternaries 2 (4 pts) (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_if_runtime.py"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"e163313dbf765b70ac0db6d5a06c7580a98a33a7e09af642f60bcdf40fc7ee1b"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedSettingsAccordion.AdvancedSettingsAccordion (cognitive 40): AdvancedSettingsAccordion.AdvancedSettingsAccordion has cognitive complexity 40 (threshold 15). Drivers by points: if/else 12 (22 pts), boolean chains 18 (nesting depth added 10). Of this number, 16 points are the body\u0027s own statements and 24 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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9b158b8bd485e522ae89cb835fae89c126672a5bf368a33234d254b5c65a6af"}},{"ruleId":"D2","level":"warning","message":{"text":"runtime.createQueueRuntime.submitQueueItem (cognitive 40): runtime.createQueueRuntime.submitQueueItem has cognitive complexity 40 (threshold 15). Drivers by points: if/else 25 (28 pts), boolean chains 10, ternaries 2 (nesting depth added 3). Of this number, 16 points are the body\u0027s own statements and 24 belong to 4 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, 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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":1745}}}],"partialFingerprints":{"codehealthFindingId/v1":"30007f1928a095dacf5d60b8d10f72b1c8b03d12ba23cd640ef29bb264c4de69"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowLibraryThumbnail.WorkflowLibraryThumbnail (cognitive 40): WorkflowLibraryThumbnail.WorkflowLibraryThumbnail has cognitive complexity 40 (threshold 15). Drivers by points: ternaries 13 (20 pts), if/else 9 (10 pts), boolean chains 9, error handling 1 (nesting depth added 8). Of this number, 26 points are the body\u0027s own statements and 14 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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryThumbnail.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"25eca8bb17d0d016d08b74e8d07cf0b91f6f200fa490cd99a0a7201e10f2f9b0"}},{"ruleId":"D2","level":"warning","message":{"text":"indexedDbDraftStore.createIndexedDbProjectDraftStore.stage (cognitive 40): indexedDbDraftStore.createIndexedDbProjectDraftStore.stage has cognitive complexity 40 (threshold 15). Drivers by points: if/else 15 (20 pts), ternaries 5 (10 pts), boolean chains 9, error handling 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":1275}}}],"partialFingerprints":{"codehealthFindingId/v1":"395b00f2aca19be3cca20412be5c62b7a6e9555901e1f5af06a5cdeec6eb8465"}},{"ruleId":"D2","level":"warning","message":{"text":"GeneratedResultController.commit (cognitive 40): GeneratedResultController.commit has cognitive complexity 40 (threshold 15). Drivers by points: if/else 21 (26 pts), ternaries 6 (9 pts), boolean chains 4, error handling 1 (nesting depth added 8). Of this number, 32 points are the body\u0027s own statements and 8 belong to one function item 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/generatedResultController.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d358f1986fe4a710df462a5c5d46953949cfcb8ac68e8c40b28feefb06ff971"}},{"ruleId":"D2","level":"warning","message":{"text":"rasterSnapshotCapture.createRasterSnapshotCapture.captureRasterSnapshot (cognitive 40): rasterSnapshotCapture.createRasterSnapshotCapture.captureRasterSnapshot has cognitive complexity 40 (threshold 15). Drivers by points: if/else 16 (27 pts), loops 5, ternaries 2 (5 pts), boolean chains 3 (nesting depth added 14). Of this number, 39 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/rasterSnapshotCapture.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"46635301f82cc11e59cb84dd6c43ed6a2ffb88b4a203773eca10af41e3c84ab8"}},{"ruleId":"D2","level":"warning","message":{"text":"model_manager.get_is_installed (cognitive 39): model_manager.get_is_installed has cognitive complexity 39 (threshold 15). Drivers by points: if/else 9 (30 pts), boolean chains 5, loops 2 (4 pts) (nesting depth added 23). 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":"invokeai/app/api/routers/model_manager.py"},"region":{"startLine":1550}}}],"partialFingerprints":{"codehealthFindingId/v1":"885f099283f05fa5537640d73a525ca7e1247371370eedbd40c61952c47ff3e1"}},{"ruleId":"D2","level":"warning","message":{"text":"CreateGradientMaskInvocation.invoke (cognitive 39): CreateGradientMaskInvocation.invoke has cognitive complexity 39 (threshold 15). Drivers by points: if/else 10 (23 pts), loops 4 (14 pts), boolean chains 2 (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":"invokeai/app/invocations/sd/create_gradient_mask.py"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"5644c472f9606b9b540d66ee9b1dc1e971351b92d93aef2e48421b82ca26145d"}},{"ruleId":"D2","level":"warning","message":{"text":"workflow_call_batch.build_batch_child_workflow_session_results (cognitive 39): workflow_call_batch.build_batch_child_workflow_session_results has cognitive complexity 39 (threshold 15). Drivers by points: if/else 13 (27 pts), ternaries 2 (6 pts), loops 3 (4 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":"invokeai/app/services/session_processor/workflow_call_batch.py"},"region":{"startLine":517}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca263e32925d328e2d2dbbfb0da8998fb1cf93779068e4e2bbecf34000dc3a72"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionNodeBuilder._attach_pending_if_inputs (cognitive 39): _ExecutionNodeBuilder._attach_pending_if_inputs has cognitive complexity 39 (threshold 15). Drivers by points: if/else 12 (29 pts), loops 3 (7 pts), boolean chains 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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":1934}}}],"partialFingerprints":{"codehealthFindingId/v1":"83bcd37d4017f532c837353a5d81cab20cef97cce2ab0c5f52f92f6a4969e4bc"}},{"ruleId":"D2","level":"warning","message":{"text":"MistralEncoderCheckpointLoader._load_text_encoder (cognitive 39): MistralEncoderCheckpointLoader._load_text_encoder has cognitive complexity 39 (threshold 15). Drivers by points: if/else 16 (24 pts), boolean chains 6, loops 3 (5 pts), error handling 1 (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":"invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py"},"region":{"startLine":1174}}}],"partialFingerprints":{"codehealthFindingId/v1":"e031c79aaa6b076f85848c4d881ddaf3a201b9c2fcde343798030e039485cbd0"}},{"ruleId":"D2","level":"warning","message":{"text":"Qwen3EncoderSDNQLoader._load_from_sdnq (cognitive 39): Qwen3EncoderSDNQLoader._load_from_sdnq has cognitive complexity 39 (threshold 15). Drivers by points: if/else 18 (27 pts), error handling 1 (4 pts), ternaries 4, boolean chains 2, loops 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":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":1701}}}],"partialFingerprints":{"codehealthFindingId/v1":"d14b28423481b4fc3c69567400d24350c313f2f3a856dbf2287c17c097ec5749"}},{"ruleId":"D2","level":"warning","message":{"text":"dnd-hooks.useBuilderDndMonitor (cognitive 39): dnd-hooks.useBuilderDndMonitor has cognitive complexity 39 (threshold 15). Drivers by points: if/else 16 (28 pts), ternaries 3 (9 pts), boolean chains 2 (nesting depth added 18). None of this is in the body itself: all 39 points belong to 2 function literals inside it that branch (lines 224, 223). 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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"42a7ebda0ff0da359783abdd42e7d61155c45747fe5b287952d92ae70dde287a"}},{"ruleId":"D2","level":"warning","message":{"text":"buildSDXLGraph.buildSDXLGraph (cognitive 39): buildSDXLGraph.buildSDXLGraph has cognitive complexity 39 (threshold 15). Drivers by points: if/else 26 (33 pts), ternaries 4, boolean chains 2 (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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"82ecf46cbaa71b9b4b24f011af7bc9285f4f354a824588b2cf64c31cc0cb8f71"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryThumbnail.GalleryThumbnail (cognitive 39): GalleryThumbnail.GalleryThumbnail has cognitive complexity 39 (threshold 15). Drivers by points: ternaries 18, if/else 10 (11 pts), boolean chains 10 (nesting depth added 1). Of this number, 17 points are the body\u0027s own statements and 22 belong to 14 function literals 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryThumbnail.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"49608e227b1ae6a2cf5a401386944609284f7f016c7e99502366b1add015a4c0"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowWidgetChrome.WorkflowDialogHost (cognitive 39): WorkflowWidgetChrome.WorkflowDialogHost has cognitive complexity 39 (threshold 15). Drivers by points: ternaries 10 (17 pts), if/else 12 (14 pts), boolean chains 7, loops 1 (nesting depth added 9). Most of this is not in the body itself: 3 of the 39 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 382, 367, 480, \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":"invokeai/frontend/webv2/src/features/workflow/ui/WorkflowWidgetChrome.tsx"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"25e60601e6eb48b4d3745812b32d988609ceec2f747467bebb059dbdde4d0696"}},{"ruleId":"D2","level":"warning","message":{"text":"draftStore.createMemoryProjectDraftStore.retargetAcknowledgedCopy (cognitive 39): draftStore.createMemoryProjectDraftStore.retargetAcknowledgedCopy has cognitive complexity 39 (threshold 15). Drivers by points: if/else 12 (20 pts), ternaries 4 (9 pts), boolean chains 8, error handling 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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":1355}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b1cb01510895249b1621c62cca62eef155de0df6fe7819fd344168278d70d0a"}},{"ruleId":"D2","level":"warning","message":{"text":"Krea2LoRACollectionLoader.invoke (cognitive 38): Krea2LoRACollectionLoader.invoke has cognitive complexity 38 (threshold 15). Drivers by points: if/else 12 (24 pts), ternaries 4 (8 pts), boolean chains 5, 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":"invokeai/app/invocations/krea2/krea2_lora_loader.py"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"c41dd0c497757a18211f072675db0aeef0b431de020893284e504c93c91e2370"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelInstallService._clear_pending_jobs (cognitive 38): ModelInstallService._clear_pending_jobs has cognitive complexity 38 (threshold 15). Drivers by points: if/else 8 (20 pts), boolean chains 9, loops 3 (5 pts), error handling 1 (2 pts), ternaries 1 (2 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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":782}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd4f95ec79ecc35fae4bdacb05543be2ab8c6f40bb4f441c1a4dcf23b2167ddc"}},{"ruleId":"D2","level":"warning","message":{"text":"h264_splice._read_video_stbl (cognitive 38): h264_splice._read_video_stbl has cognitive complexity 38 (threshold 15). Drivers by points: if/else 22 (29 pts), boolean chains 7, loops 1, ternaries 1 (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":"invokeai/app/util/h264_splice.py"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"156264476fcd4c65c3d1f03837f7292161dc93c7d74cfe5aae3f3fddfa7c9f21"}},{"ruleId":"D2","level":"warning","message":{"text":"Flux2CheckpointModel._load_from_singlefile (cognitive 38): Flux2CheckpointModel._load_from_singlefile has cognitive complexity 38 (threshold 15). Drivers by points: if/else 21 (29 pts), boolean chains 7, ternaries 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":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":1261}}}],"partialFingerprints":{"codehealthFindingId/v1":"fac6ebdd893d96cc25b842a9ab38abf5a4032717189af348143b6df207b608a6"}},{"ruleId":"D2","level":"warning","message":{"text":"loaders._infer_quantization_type (cognitive 38): loaders._infer_quantization_type has cognitive complexity 38 (threshold 15). Drivers by points: if/else 13 (28 pts), boolean chains 6, ternaries 2 (4 pts) (nesting depth added 17). 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":"invokeai/backend/quantization/sdnq/loaders.py"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6e501d3f8be27eafb9b21637443e44233774eaa779364057b39b70201a5bff2"}},{"ruleId":"D2","level":"warning","message":{"text":"promptAST.parseTokens::tryParsePromptFunction (cognitive 38): promptAST.parseTokens::tryParsePromptFunction has cognitive complexity 38 (threshold 15). Drivers by points: if/else 14 (28 pts), loops 4 (9 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. This shape REPEATS in the file: 3 other methods here (promptAST.parseTokens::isUnquotedPromptFunctionAhead, promptAST.parseTokens::tryParseUnquotedPromptFunction, promptAST.parseTokens::parseGroup) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 4 times rather than 4 independent problems. Splitting this body alone leaves the other 3 exactly as they are. Where these are variations on one operation, the change that clears all 4 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":"invokeai/frontend/webv1/src/common/util/promptAST.ts"},"region":{"startLine":407}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ed1145dcd99c45ca364bb996e6dd04c26943385eaa220552cdbea7274ada552"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowLibraryDialog.WorkflowLibraryDialog (cognitive 38): WorkflowLibraryDialog.WorkflowLibraryDialog has cognitive complexity 38 (threshold 15). Drivers by points: if/else 17, ternaries 14 (15 pts), boolean chains 6 (nesting depth added 1). Of this number, 16 points are the body\u0027s own statements and 22 belong to 10 function literals 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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDialog.tsx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"440f9f45eaf2e53f7505e8dbe8dbec6258d7beba05648056f5e43b9aed650e76"}},{"ruleId":"D2","level":"warning","message":{"text":"durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::hydrateProjectWithDraft (cognitive 38): durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::hydrateProjectWithDraft has cognitive complexity 38 (threshold 15). Drivers by points: if/else 17 (25 pts), boolean chains 6, ternaries 3 (6 pts), error handling 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. This shape REPEATS in the file: 5 other methods here (durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::adoptNewestDraft, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::stageProject, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject, \u2026) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 6 times rather than 6 independent problems. Splitting this body alone leaves the other 5 exactly as they are. Where these are variations on one operation, the change that clears all 6 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":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":2142}}}],"partialFingerprints":{"codehealthFindingId/v1":"27a6978c33925e4b0d15ce2494ce936e5baa117dedc2d8f2c822228c05ba2616"}},{"ruleId":"D2","level":"warning","message":{"text":"bitmapStore.createBitmapStore.flushLayer (cognitive 38): bitmapStore.createBitmapStore.flushLayer has cognitive complexity 38 (threshold 15). Drivers by points: if/else 18 (22 pts), boolean chains 8, error handling 4 (5 pts), ternaries 2 (3 pts) (nesting depth added 6). Of this number, 36 points are the body\u0027s own statements and 2 belong to 2 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, 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"af6df2a75649a0d855cb69b0515fca1e840334586ecda7230775a20c4a89dbec"}},{"ruleId":"D2","level":"warning","message":{"text":"generationComposite.composeForGeneration (cognitive 38): generationComposite.composeForGeneration has cognitive complexity 38 (threshold 15). Drivers by points: if/else 12 (19 pts), loops 8 (10 pts), boolean chains 6, ternaries 2 (3 pts) (nesting depth added 10). Of this number, 34 points are the body\u0027s own statements and 4 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/generationComposite.ts"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"a88dcd05f254548499297d0399322d4761c2de6331ba363fd48fb7d81602fd31"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelInstallService._register_or_install (cognitive 37): ModelInstallService._register_or_install has cognitive complexity 37 (threshold 15). Drivers by points: if/else 18 (27 pts), error handling 4 (10 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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":1745}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebee3c2b6daddc7016fd2feeea0313ee7a64815283573b41b7dabf4f0ca9245c"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionNodeBuilder._materialize_root_if_for_completed_collect_branch (cognitive 37): _ExecutionNodeBuilder._materialize_root_if_for_completed_collect_branch has cognitive complexity 37 (threshold 15). Drivers by points: if/else 10 (25 pts), loops 6 (9 pts), boolean chains 3 (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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":2247}}}],"partialFingerprints":{"codehealthFindingId/v1":"93478fd983f17200e335f63fd84c81e12510f4d7914459dd8b082362567ed67d"}},{"ruleId":"D2","level":"warning","message":{"text":"denoise.denoise (cognitive 37): denoise.denoise has cognitive complexity 37 (threshold 15). Drivers by points: if/else 12 (27 pts), ternaries 2 (4 pts), boolean chains 3, loops 2 (3 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":"invokeai/backend/ernie_image/denoise.py"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"2885108f446e0e31a89101e41e8f94f51a95e6b53f221d78880527d6167e7388"}},{"ruleId":"D2","level":"warning","message":{"text":"Krea2CheckpointModel._load_from_singlefile (cognitive 37): Krea2CheckpointModel._load_from_singlefile has cognitive complexity 37 (threshold 15). Drivers by points: if/else 20 (32 pts), boolean chains 5 (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":"invokeai/backend/model_manager/load/model_loaders/krea2.py"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cf29aaa61b0c1c2bc44a590328790a2131a80fc385c614fee5cace46567ef28"}},{"ruleId":"D2","level":"warning","message":{"text":"CurrentVideoPreview.CurrentVideoPreview (cognitive 37): CurrentVideoPreview.CurrentVideoPreview has cognitive complexity 37 (threshold 15). Drivers by points: if/else 16, boolean chains 15, error handling 4 (6 pts) (nesting depth added 2). Most of this is not in the body itself: 9 of the 37 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 263, 315, 367, \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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"d038bb7b642639ab9c4ae47fd5181458d9b634626286ed55c3d5ad80f17f8996"}},{"ruleId":"D2","level":"warning","message":{"text":"buildQwenImageGraph.buildQwenImageGraph (cognitive 37): buildQwenImageGraph.buildQwenImageGraph has cognitive complexity 37 (threshold 15). Drivers by points: if/else 19 (25 pts), ternaries 4 (6 pts), boolean chains 4, loops 1 (2 pts) (nesting depth added 9). Of this number, 36 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"75b64b00fd9fcb33bfc78b24060316e8f5e25d8fe4e991febf1646e50f465ff2"}},{"ruleId":"D2","level":"warning","message":{"text":"OverviewPane.ConnectedOverview (cognitive 37): OverviewPane.ConnectedOverview has cognitive complexity 37 (threshold 15). Drivers by points: if/else 20 (21 pts), ternaries 5 (11 pts), boolean chains 5 (nesting depth added 7). None of this is in the body itself: all 37 points belong to 15 function literals inside it that branch (lines 266, 117, 153, \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/OverviewPane.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"cabaca5afd0b6c0221827bcf644fc85e9f65b0290c9535871b1a5e32b27f4676"}},{"ruleId":"D2","level":"warning","message":{"text":"paintTool.resolveTarget (cognitive 37): paintTool.resolveTarget has cognitive complexity 37 (threshold 15). Drivers by points: if/else 13 (22 pts), ternaries 5 (9 pts), boolean chains 6 (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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/paintTool.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5e9e42fbb4a17ec9040646b7595145d524bcb78d7c7af7191626e7c49f1847f"}},{"ruleId":"D2","level":"warning","message":{"text":"projectFile.importProjectFile (cognitive 37): projectFile.importProjectFile has cognitive complexity 37 (threshold 15). Drivers by points: if/else 12 (17 pts), ternaries 10 (12 pts), boolean chains 7, error handling 1 (nesting depth added 7). 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, 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":"invokeai/frontend/webv2/src/workbench/projects/projectFile.ts"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"d11b00216d0b9c279821c24a08c94ab1107f4ea9265b2aacc2f651301a970e9d"}},{"ruleId":"D2","level":"warning","message":{"text":"recall_parameters.update_recall_parameters (cognitive 36): recall_parameters.update_recall_parameters has cognitive complexity 36 (threshold 15). Drivers by points: if/else 18 (25 pts), error handling 4 (5 pts), boolean chains 3, ternaries 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":"invokeai/app/api/routers/recall_parameters.py"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce96ee7c29dbfc3e921f69244341653c0d017cf5b5d9f308791dc0dceac0a81a"}},{"ruleId":"D2","level":"warning","message":{"text":"session_queue.strip_missing_image_results (cognitive 36): session_queue.strip_missing_image_results has cognitive complexity 36 (threshold 15). Drivers by points: if/else 10 (23 pts), boolean chains 6, ternaries 3 (6 pts), loops 1 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/session_queue.py"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cfa0829c54d07e78ec129cc666fbd61c1cc0835e31752502bec69a2f34dfa2b"}},{"ruleId":"D2","level":"warning","message":{"text":"InvokeAdjustImageHuePlusInvocation.invoke (cognitive 36): InvokeAdjustImageHuePlusInvocation.invoke has cognitive complexity 36 (threshold 15). Drivers by points: if/else 15 (22 pts), boolean chains 8, ternaries 3 (6 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":"invokeai/app/invocations/composition-nodes.py"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee76c379b7716880053879f4439db4c7ecf1c1d4ff479e50f0f747c36106ebba"}},{"ruleId":"D2","level":"warning","message":{"text":"InvokeImageCompositorInvocation.invoke (cognitive 36): InvokeImageCompositorInvocation.invoke has cognitive complexity 36 (threshold 15). Drivers by points: if/else 11 (18 pts), boolean chains 10, loops 3 (8 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":"invokeai/app/invocations/composition-nodes.py"},"region":{"startLine":1312}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d76c729117003a8d271bc8d0837a9475b0a0c467a64f13390b2cde5917c543e"}},{"ruleId":"D2","level":"warning","message":{"text":"MiniMaxH3ReferenceConditioningInvocation.invoke (cognitive 36): MiniMaxH3ReferenceConditioningInvocation.invoke has cognitive complexity 36 (threshold 15). Drivers by points: if/else 14 (28 pts), loops 4 (7 pts), boolean chains 1 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/minimax_h3/minimax_h3_reference.py"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab0a71d800ffc4dad736eb7e388b2a00b64afc558e3b1a0e4c86adb65fce7d4d"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_iterate_planner._get_body_iterate_collect_fan_in (cognitive 36): graph_iterate_planner._get_body_iterate_collect_fan_in has cognitive complexity 36 (threshold 15). Drivers by points: if/else 17 (28 pts), boolean chains 7, 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":"invokeai/app/services/shared/graph_iterate_planner.py"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"39ade846bfa99f7b17386ec018bb7d36f00f45b0c8b0585946ca5eefc69dff4a"}},{"ruleId":"D2","level":"warning","message":{"text":"workflow_graph_builder._collect_exposed_inputs_from_form (cognitive 36): workflow_graph_builder._collect_exposed_inputs_from_form has cognitive complexity 36 (threshold 15). Drivers by points: if/else 10 (29 pts), loops 2 (5 pts), boolean chains 2 (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":"invokeai/app/services/shared/workflow_graph_builder.py"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"458002c1de3b460b90d559721699e6d38da6b3e6f13024b4a12e39c52f42e7ce"}},{"ruleId":"D2","level":"warning","message":{"text":"sampling.build_ref2va_denoise_state (cognitive 36): sampling.build_ref2va_denoise_state has cognitive complexity 36 (threshold 15). Drivers by points: if/else 17 (31 pts), boolean chains 4, 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":"invokeai/backend/minimax_h3/sampling.py"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"02c8412f4ee101326f9f1892fd79fbcfcce60dd1d8ba01c55b22ba078399d2b0"}},{"ruleId":"D2","level":"warning","message":{"text":"modelSettingsIO.validateImportData (cognitive 36): modelSettingsIO.validateImportData has cognitive complexity 36 (threshold 15). Drivers by points: if/else 16 (24 pts), boolean chains 12 (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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/modelSettingsIO.ts"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"9adc59446f5b6bfea9093dee454162c78b8665bff5f04cf488bbeaa1e13b9212"}},{"ruleId":"D2","level":"warning","message":{"text":"useEnqueueWorkflows.getBatchDataForWorkflowGeneration (cognitive 36): useEnqueueWorkflows.getBatchDataForWorkflowGeneration has cognitive complexity 36 (threshold 15). Drivers by points: if/else 6 (20 pts), loops 4 (11 pts), ternaries 1 (3 pts), boolean chains 2 (nesting depth added 23). 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, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfcd724dcc572c96181fb7b9e1c3e0961b0f5d4edc19934bae2743ae1f94c08e"}},{"ruleId":"D2","level":"warning","message":{"text":"baseGenerationPolicies.getSettingsWithCompatibleModelSelections (cognitive 36): baseGenerationPolicies.getSettingsWithCompatibleModelSelections has cognitive complexity 36 (threshold 15). Drivers by points: if/else 17 (22 pts), boolean chains 10, ternaries 2 (3 pts), loops 1 (nesting depth added 6). Of this number, 32 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":"invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts"},"region":{"startLine":1461}}}],"partialFingerprints":{"codehealthFindingId/v1":"42970f9d526e9c8400108e5696407dd5bf53d96290f9486621a4c97a8131232e"}},{"ruleId":"D2","level":"warning","message":{"text":"settings.normalizeUpscaleWidgetValues (cognitive 36): settings.normalizeUpscaleWidgetValues has cognitive complexity 36 (threshold 15). Drivers by points: ternaries 30 (34 pts), boolean chains 1, if/else 1 (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":"invokeai/frontend/webv2/src/features/upscale/core/settings.ts"},"region":{"startLine":785}}}],"partialFingerprints":{"codehealthFindingId/v1":"cac53ed35c9309ead2f0fc1b509a680e9c066a9150a074426203b2deec1d7226"}},{"ruleId":"D2","level":"warning","message":{"text":"outputImages.visitOutputImageNames (cognitive 36): outputImages.visitOutputImageNames has cognitive complexity 36 (threshold 15). Drivers by points: if/else 18 (23 pts), boolean chains 8, loops 2 (4 pts), ternaries 1 (nesting depth added 7). Of this number, 18 points are the body\u0027s own statements and 18 belong to 4 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":"invokeai/frontend/webv2/src/platform/core/outputImages.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cbcfc27c261614cf37b2a6d0eb3af628ddbd9d3547921b2e7ceecff2c005468"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolStripFlyout.ToolFamilyButton (cognitive 36): ToolStripFlyout.ToolFamilyButton has cognitive complexity 36 (threshold 15). Drivers by points: if/else 20 (25 pts), boolean chains 6, ternaries 4, error handling 1 (nesting depth added 5). Most of this is not in the body itself: 3 of the 36 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 116, 149, 94, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/ToolStripFlyout.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"f431fd129137bbb9cf73ab86554c2c17c40321860134405d4c4ee1e7521256fb"}},{"ruleId":"D2","level":"warning","message":{"text":"BooleanMergeController.merge (cognitive 36): BooleanMergeController.merge has cognitive complexity 36 (threshold 15). Drivers by points: if/else 16 (19 pts), boolean chains 10, ternaries 4 (6 pts), loops 1 (nesting depth added 5). Of this number, 35 points are the body\u0027s own statements and 1 belongs to one function item 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/booleanMergeController.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca60b32648dae20ab994c7829cfd8eb4c05c29e93befd31102657c92ec8dcf02"}},{"ruleId":"D2","level":"warning","message":{"text":"TextOptions.TextFontSettings (cognitive 36): TextOptions.TextFontSettings has cognitive complexity 36 (threshold 15). Drivers by points: ternaries 9 (14 pts), boolean chains 12, if/else 9 (10 pts) (nesting depth added 6). Most of this is not in the body itself: 11 of the 36 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 637, 680, 705, \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/TextOptions.tsx"},"region":{"startLine":566}}}],"partialFingerprints":{"codehealthFindingId/v1":"615756d4d39bc8113c70690d536f432d1f5e7c3ac4b6d55b58f3cd5b6c95650d"}},{"ruleId":"D2","level":"warning","message":{"text":"LTX2DenoiseInvocation.invoke (cognitive 35): LTX2DenoiseInvocation.invoke has cognitive complexity 35 (threshold 15). Drivers by points: ternaries 11 (17 pts), if/else 11 (12 pts), boolean chains 6 (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":"invokeai/app/invocations/ltx2/ltx2_denoise.py"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e342d92a76c354c87a13023a8d4b1e2d4943eba2dc45b5f86ec3a735066131e"}},{"ruleId":"D2","level":"warning","message":{"text":"VideoConcatInvocation._build_audio_track (cognitive 35): VideoConcatInvocation._build_audio_track has cognitive complexity 35 (threshold 15). Drivers by points: if/else 14 (21 pts), ternaries 4 (8 pts), boolean chains 3, loops 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":"invokeai/app/invocations/video_concat.py"},"region":{"startLine":699}}}],"partialFingerprints":{"codehealthFindingId/v1":"fecacec9466f4ccdbc289691650588d9f62590913c8ac340f5635d2345e32a29"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultSessionProcessor._process (cognitive 35): DefaultSessionProcessor._process has cognitive complexity 35 (threshold 15). Drivers by points: if/else 14 (28 pts), error handling 2 (3 pts), ternaries 1 (2 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":"invokeai/app/services/session_processor/session_processor_default.py"},"region":{"startLine":1102}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbf6e714fad63512f8f2893281bd59aa693293da6e4fdcccad9350e2e42e1850"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_if_runtime._validate_frame_axes (cognitive 35): graph_if_runtime._validate_frame_axes has cognitive complexity 35 (threshold 15). Drivers by points: if/else 10 (22 pts), ternaries 2 (6 pts), boolean chains 4, loops 2 (3 pts) (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":"invokeai/app/services/shared/graph_if_runtime.py"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a1a2e6383d8a8d26780d1c43b5ba131d6e248a81f42a1520ffc9291bfa7505c"}},{"ruleId":"D2","level":"warning","message":{"text":"quantized_loading.load_bnb4bit_state_dict (cognitive 35): quantized_loading.load_bnb4bit_state_dict has cognitive complexity 35 (threshold 15). Drivers by points: if/else 12 (20 pts), ternaries 3 (8 pts), loops 4, boolean chains 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":"invokeai/backend/ideogram4/quantized_loading.py"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"30bd2c07852c051ed709ada8b1935af9e3d87cf995befdd75a6ca5b5d93f02b4"}},{"ruleId":"D2","level":"warning","message":{"text":"Flux2GGUFCheckpointModel._load_from_singlefile (cognitive 35): Flux2GGUFCheckpointModel._load_from_singlefile has cognitive complexity 35 (threshold 15). Drivers by points: ternaries 7 (18 pts), if/else 11 (15 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":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":1815}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f28a47cbb0cfc7c237836b555fb73dfdc8627e8f92bb6d024e683119b63f2d5"}},{"ruleId":"D2","level":"warning","message":{"text":"ZImageDiffusersModel._load_sdnq_text_encoder (cognitive 35): ZImageDiffusersModel._load_sdnq_text_encoder has cognitive complexity 35 (threshold 15). Drivers by points: if/else 14 (23 pts), error handling 1 (4 pts), ternaries 4, boolean chains 2, loops 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":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1d60dedf99eacfa455ed6efb2e415d48faf906b1f2b4831ae6fc081c075e318"}},{"ruleId":"D2","level":"warning","message":{"text":"StableDiffusionGeneratorPipeline.step (cognitive 35): StableDiffusionGeneratorPipeline.step has cognitive complexity 35 (threshold 15). Drivers by points: if/else 15 (23 pts), loops 3 (8 pts), ternaries 1 (3 pts), boolean chains 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusers_pipeline.py"},"region":{"startLine":438}}}],"partialFingerprints":{"codehealthFindingId/v1":"888f3c81a576b6485194788f240153323d8f52a28deebc79fc1b1ebcad8bdfda"}},{"ruleId":"D2","level":"warning","message":{"text":"RasterLayerCurvesAdjustmentsGraph.drawHistogram (cognitive 35): RasterLayerCurvesAdjustmentsGraph.drawHistogram has cognitive complexity 35 (threshold 15). Drivers by points: if/else 9 (14 pts), loops 7 (14 pts), ternaries 1 (4 pts), boolean chains 3 (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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bba4d5e2c5cdd8ed2e6620b7609e2016f6a65f61cc6b8bef7b831dd249eaca1"}},{"ruleId":"D2","level":"warning","message":{"text":"useConnection.useConnection (cognitive 35): useConnection.useConnection has cognitive complexity 35 (threshold 15). Drivers by points: if/else 12 (17 pts), ternaries 7 (13 pts), boolean chains 5 (nesting depth added 11). None of this is in the body itself: all 35 points belong to 2 function literals inside it that branch (lines 108, 33). 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":"invokeai/frontend/webv1/src/features/nodes/hooks/useConnection.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"414f1a27bdc0ee3656812914ee533d2479804eb1dae4ae9b66abdd6812e11895"}},{"ruleId":"D2","level":"warning","message":{"text":"addOutpaint.addOutpaint (cognitive 35): addOutpaint.addOutpaint has cognitive complexity 35 (threshold 15). Drivers by points: if/else 17 (25 pts), ternaries 3 (7 pts), boolean chains 3 (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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd2db86013eef870d75df173eb80c462a591bd22e8263ba03f395bfd359d7884"}},{"ruleId":"D2","level":"warning","message":{"text":"useGalleryGridHotkeys.useGalleryGridHotkeys (cognitive 35): useGalleryGridHotkeys.useGalleryGridHotkeys has cognitive complexity 35 (threshold 15). Drivers by points: if/else 16 (20 pts), ternaries 7 (10 pts), boolean chains 5 (nesting depth added 7). None of this is in the body itself: all 35 points belong to 6 function items inside it that branch (a function literal at line 205, a function literal at line 137, getRangeAnchorKey, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryGridHotkeys.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"728564a13c46201d9903334a938fbcb4d1e75c7940ec3708d8667ab2111d6cbb"}},{"ruleId":"D2","level":"warning","message":{"text":"InstallQueueBar.InstallQueueBar (cognitive 35): InstallQueueBar.InstallQueueBar has cognitive complexity 35 (threshold 15). Drivers by points: ternaries 17 (29 pts), boolean chains 5, if/else 1 (nesting depth added 12). Of this number, 33 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":"invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallQueueBar.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd618af1c0e5dd73769b4b1c545434065cbc56c817ee1f7613a9f68ac95932d6"}},{"ruleId":"D2","level":"warning","message":{"text":"VideoReferenceListField.ReferenceCard (cognitive 35): VideoReferenceListField.ReferenceCard has cognitive complexity 35 (threshold 15). Drivers by points: ternaries 16 (19 pts), boolean chains 8, if/else 8 (nesting depth added 3). Most of this is not in the body itself: 14 of the 35 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 216, 141, 158, \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":"invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc1ed9f85cdced82269f98ca1cd13df0d3c8321bda05401076835e46e8022d63"}},{"ruleId":"D2","level":"warning","message":{"text":"validation.isValidLoopLinkageConnection (cognitive 35): validation.isValidLoopLinkageConnection has cognitive complexity 35 (threshold 15). Drivers by points: if/else 12 (22 pts), boolean chains 11, ternaries 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":"invokeai/frontend/webv2/src/features/workflow/core/validation.ts"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"7076305ca6b3bf180c8ad3b641ae98746f8f7ef25ea026662c03185fd985711f"}},{"ruleId":"D2","level":"warning","message":{"text":"Picker.Picker (cognitive 35): Picker.Picker has cognitive complexity 35 (threshold 15). Drivers by points: ternaries 13 (17 pts), if/else 9 (11 pts), boolean chains 6, loops 1 (nesting depth added 6). Of this number, 16 points are the body\u0027s own statements and 19 belong to 6 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":"invokeai/frontend/webv2/src/platform/ui/Picker.tsx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b58b0ce08579570f0743a72348e4f294b7804a3eaed0da5df9b25425869d206"}},{"ruleId":"D2","level":"warning","message":{"text":"restoreProjectMedia.restoreProjectMedia (cognitive 35): restoreProjectMedia.restoreProjectMedia has cognitive complexity 35 (threshold 15). Drivers by points: if/else 14 (22 pts), loops 7 (9 pts), ternaries 3, error handling 1 (nesting depth added 10). Of this number, 26 points are the body\u0027s own statements and 9 belong to 4 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":"invokeai/frontend/webv2/src/workbench/projects/invk/restoreProjectMedia.ts"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2558b077b9652a755a72b3e47bf03bb4db18a76e4173570d2f1b54e5c5980cf"}},{"ruleId":"D2","level":"warning","message":{"text":"selectObjectSession.createSelectObjectSession.runRequest (cognitive 35): selectObjectSession.createSelectObjectSession.runRequest has cognitive complexity 35 (threshold 15). Drivers by points: if/else 13 (17 pts), boolean chains 10, ternaries 3 (5 pts), error handling 3 (nesting depth added 6). Most of this is not in the body itself: 13 of the 35 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 286, 348). 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/selectObjectSession.ts"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"f20e990bf2d3639f82f9aed28ff22ffee76db57159d570f69673a57b71a2d298"}},{"ruleId":"D2","level":"warning","message":{"text":"fields.InputField (cognitive 34): fields.InputField has cognitive complexity 34 (threshold 15). Drivers by points: if/else 24 (30 pts), boolean chains 2, ternaries 1 (2 pts) (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":"invokeai/app/invocations/fields.py"},"region":{"startLine":916}}}],"partialFingerprints":{"codehealthFindingId/v1":"91de931c08f2c74476be793e47eca53b5900c474dd1ea6bb0f39d4e92c95f587"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryMaintenanceService._regenerate_thumbnails (cognitive 34): GalleryMaintenanceService._regenerate_thumbnails has cognitive complexity 34 (threshold 15). Drivers by points: if/else 7 (22 pts), error handling 2 (8 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 22). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/gallery_maintenance/gallery_maintenance_default.py"},"region":{"startLine":790}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e7356ac271f3903d6a0a56dbca2054f86c673e4fa180e3c9180756d69024968"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionNodeBuilder._get_known_iteration_path (cognitive 34): _ExecutionNodeBuilder._get_known_iteration_path has cognitive complexity 34 (threshold 15). Drivers by points: if/else 11 (24 pts), loops 4 (7 pts), boolean chains 3 (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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca4fac19cd7c56e585ca2b3c60fd33787bbffc3fe662912717f93384d7c27aaa"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionNodeBuilder.create_nested_for_return (cognitive 34): _ExecutionNodeBuilder.create_nested_for_return has cognitive complexity 34 (threshold 15). Drivers by points: if/else 15 (24 pts), loops 5 (6 pts), boolean chains 3, ternaries 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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"68b11f2ef37a1ea7250536d3694951d719d1f15d4703af2a96693d1f5b7bb3f2"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionNodeBuilder._create_serial_nested_iterate_body_iteration (cognitive 34): _ExecutionNodeBuilder._create_serial_nested_iterate_body_iteration has cognitive complexity 34 (threshold 15). Drivers by points: if/else 14 (24 pts), loops 4 (6 pts), boolean chains 2, ternaries 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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":771}}}],"partialFingerprints":{"codehealthFindingId/v1":"489911817e5e28577a1d3f8a71dca5594d208a19ba0657bfc83e14ce33ec2c54"}},{"ruleId":"D2","level":"warning","message":{"text":"Flux2DiffusersModel._load_model (cognitive 34): Flux2DiffusersModel._load_model has cognitive complexity 34 (threshold 15). Drivers by points: if/else 11 (29 pts), boolean chains 2, ternaries 2, error handling 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":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":1148}}}],"partialFingerprints":{"codehealthFindingId/v1":"25d550ddb1747a8a9203c8ab79160f966906452e1cb86ac4b38e4c5ce0968de5"}},{"ruleId":"D2","level":"warning","message":{"text":"anima_lora_conversion_utils.lora_model_from_anima_state_dict (cognitive 34): anima_lora_conversion_utils.lora_model_from_anima_state_dict has cognitive complexity 34 (threshold 15). Drivers by points: if/else 10 (23 pts), loops 4 (11 pts) (nesting depth added 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":"invokeai/backend/patches/lora_conversions/anima_lora_conversion_utils.py"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a6df2855f5737e762650e4c0bf73cb308f8802e404c477061f2c1b3a1a815ad"}},{"ruleId":"D2","level":"warning","message":{"text":"InvokeAIDiffuserComponent.do_controlnet_step (cognitive 34): InvokeAIDiffuserComponent.do_controlnet_step has cognitive complexity 34 (threshold 15). Drivers by points: if/else 12 (29 pts), boolean chains 4, loops 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":"invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f4e1a784f2c778580dfb5656e42103586f54767521f85eb67d8d802e04e1d62"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasToolModule.onKeyDown (cognitive 34): CanvasToolModule.onKeyDown has cognitive complexity 34 (threshold 15). Drivers by points: if/else 18 (26 pts), boolean chains 8 (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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts"},"region":{"startLine":796}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f157af873101aa1d4bebe3cdadcff07404887afb2bc2a10ed5f987291188afe"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelInstallQueue.ModelInstallQueue (cognitive 34): ModelInstallQueue.ModelInstallQueue has cognitive complexity 34 (threshold 15). Drivers by points: if/else 10 (15 pts), boolean chains 11, ternaries 3 (6 pts), error handling 1, loops 1 (nesting depth added 8). Most of this is not in the body itself: 8 of the 34 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 90, 127, 137, \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueue.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"75c94aec801529f5a81af070a4ecfc719194ae8f42822555973163f6ec0b31b9"}},{"ruleId":"D2","level":"warning","message":{"text":"connectorTopology.getConnectorDeletionSpliceConnections (cognitive 34): connectorTopology.getConnectorDeletionSpliceConnections has cognitive complexity 34 (threshold 15). Drivers by points: if/else 10 (23 pts), boolean chains 7, loops 3 (4 pts) (nesting depth added 14). Of this number, 31 points are the body\u0027s own statements and 3 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":"invokeai/frontend/webv1/src/features/nodes/store/util/connectorTopology.ts"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"19e23d9a114458af57033045e39b63aa44d1165518e5279bad402c3db477a239"}},{"ruleId":"D2","level":"warning","message":{"text":"buildNodesGraph.buildNodesGraph (cognitive 34): buildNodesGraph.buildNodesGraph has cognitive complexity 34 (threshold 15). Drivers by points: if/else 18 (21 pts), boolean chains 12, ternaries 1 (nesting depth added 3). None of this is in the body itself: all 34 points belong to 8 function literals inside it that branch (lines 68, 130, 55, \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildNodesGraph.ts"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"76eda9194d9102734ce08ac33cbec1cecaca8428ae8e4464b872704eababdcb9"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelPicker.ModelPicker (cognitive 34): ModelPicker.ModelPicker has cognitive complexity 34 (threshold 15). Drivers by points: if/else 14 (26 pts), boolean chains 5, loops 3 (nesting depth added 12). None of this is in the body itself: all 34 points belong to 5 function literals inside it that branch (lines 202, 287, 211, \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":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"65f258cad8a8097c1304e68017c86f477638ac10c1640b919f8127d4ce6a706c"}},{"ruleId":"D2","level":"warning","message":{"text":"HotkeyListItem.HotkeyItem (cognitive 34): HotkeyListItem.HotkeyItem has cognitive complexity 34 (threshold 15). Drivers by points: if/else 16 (18 pts), ternaries 5 (11 pts), boolean chains 4, loops 1 (nesting depth added 8). Most of this is not in the body itself: 2 of the 34 points are its own statements and the rest belongs to 8 function items inside it that branch (renderHotkeyKeys, a function literal at line 151, a function literal at line 116, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/HotkeyListItem.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"f17238fd90a2bab5b96dcb2aadc039fc3867b114505019dfd93232e61843a34d"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphPreviewDialog.GraphPreviewDialog (cognitive 34): GraphPreviewDialog.GraphPreviewDialog has cognitive complexity 34 (threshold 15). Drivers by points: ternaries 16 (26 pts), if/else 6, boolean chains 2 (nesting depth added 10). Of this number, 26 points are the body\u0027s own statements and 8 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":"invokeai/frontend/webv2/src/features/workflow/ui/graph-preview/GraphPreviewDialog.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"516a4606ca39817e6e40e673ff986ec556b530e261257933e3b2b2a4ecbb3eea"}},{"ruleId":"D2","level":"warning","message":{"text":"CropLayerController.crop (cognitive 34): CropLayerController.crop has cognitive complexity 34 (threshold 15). Drivers by points: if/else 18, boolean chains 7, ternaries 4 (7 pts), error handling 2 (nesting depth added 3). Of this number, 33 points are the body\u0027s own statements and 1 belongs 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/cropLayerController.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8d5d130e722824544b865238e91aa55751c79661b0b6c2f71b149bfeb2109db"}},{"ruleId":"D2","level":"warning","message":{"text":"MergeLayerController.mergeVisible (cognitive 34): MergeLayerController.mergeVisible has cognitive complexity 34 (threshold 15). Drivers by points: if/else 16 (20 pts), ternaries 4 (6 pts), boolean chains 4, loops 4 (nesting depth added 6). Of this number, 24 points are the body\u0027s own statements and 10 belong to 2 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"a831e065b303e850d0bae9d2e51c0258fd3dd0feb705ec3d7fb669b09a877d4e"}},{"ruleId":"D2","level":"warning","message":{"text":"documentIndex.deriveIndexForValueEdit (cognitive 34): documentIndex.deriveIndexForValueEdit has cognitive complexity 34 (threshold 15). Drivers by points: if/else 8 (15 pts), loops 6 (8 pts), boolean chains 6, ternaries 5 (nesting depth added 9). Of this number, 27 points are the body\u0027s own statements and 7 belong to 2 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentIndex.ts"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"39075bb9482c92db745e5a8820fbf2f49d3cc01ce7bb875aaabc26b5a030f78e"}},{"ruleId":"D2","level":"warning","message":{"text":"RasterExportController.rasterize (cognitive 34): RasterExportController.rasterize has cognitive complexity 34 (threshold 15). Drivers by points: if/else 17 (18 pts), boolean chains 7, ternaries 4 (7 pts), error handling 1 (2 pts) (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/rasterExportController.ts"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"45bb071df29a18a1cfe45630a24569200aca4dcd4dab54a97ffaa8649e72995d"}},{"ruleId":"D2","level":"warning","message":{"text":"createCanvasEngine.createCanvasEngine (cognitive 34): createCanvasEngine.createCanvasEngine has cognitive complexity 34 (threshold 15). Drivers by points: if/else 14 (16 pts), ternaries 10 (12 pts), boolean chains 4, error handling 2 (nesting depth added 4). None of this is in the body itself: all 34 points belong to 13 function items inside it that branch (a function literal at line 129, resolveUploadProjectId, uploadImage, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/createCanvasEngine.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"06785ed4cfac07eb846d44870fa5c34899d3a790ffa1e6b470cd98c02968842c"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsEntryView.SettingsEntryView (cognitive 34): SettingsEntryView.SettingsEntryView has cognitive complexity 34 (threshold 15). Drivers by points: ternaries 14 (21 pts), boolean chains 11, if/else 2 (nesting depth added 7). Of this number, 26 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":"invokeai/frontend/webv2/src/workbench/settings/SettingsEntryView.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"944c43954bb63c7fbfc550ead581c1966c0ff03a43550ff209746194923f33b1"}},{"ruleId":"D2","level":"warning","message":{"text":"MetadataToSDXLLorasInvocation.invoke (cognitive 33): MetadataToSDXLLorasInvocation.invoke has cognitive complexity 33 (threshold 15). Drivers by points: if/else 15 (31 pts), loops 1, ternaries 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":"invokeai/app/invocations/metadata_linked.py"},"region":{"startLine":1076}}}],"partialFingerprints":{"codehealthFindingId/v1":"63f9cca5e3cad0623f83a5228c3bb1d6b7e03d42d9ec0e138481a40240be5a16"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelInstallService._install_next_item (cognitive 33): ModelInstallService._install_next_item has cognitive complexity 33 (threshold 15). Drivers by points: if/else 8 (19 pts), error handling 3 (8 pts), boolean chains 5, 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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":1667}}}],"partialFingerprints":{"codehealthFindingId/v1":"256e354a420a42d48b16a15a163ea36e28e817eba6d6d4cc279f35241cc8a420"}},{"ruleId":"D2","level":"warning","message":{"text":"ExecutionPlan.from_snapshot (cognitive 33): ExecutionPlan.from_snapshot has cognitive complexity 33 (threshold 15). Drivers by points: if/else 12 (24 pts), boolean chains 5, loops 3 (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":"invokeai/app/services/shared/execution_engine/scheduler.py"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4cd2e1d9561c1c40214a8c6ab38d7325b46a852bb0607834b9900f1edf46d7f"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._validate_for_continuation_output (cognitive 33): GraphExecutionState._validate_for_continuation_output has cognitive complexity 33 (threshold 15). Drivers by points: if/else 9 (22 pts), ternaries 2 (8 pts), boolean chains 3 (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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":2019}}}],"partialFingerprints":{"codehealthFindingId/v1":"e518c6d4d608146853dda82acec2faf8b5ec3e0a92c23a1a8456bb3fb13def08"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_loop_topology._recognize_nested_iterate_sequence (cognitive 33): graph_loop_topology._recognize_nested_iterate_sequence has cognitive complexity 33 (threshold 15). Drivers by points: if/else 17 (23 pts), boolean chains 6, loops 3 (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":"invokeai/app/services/shared/graph_loop_topology.py"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"15fdc61c4dd763aff92cd79695ccbc3c9d49cbbee079b54cf02d326faeead53d"}},{"ruleId":"D2","level":"warning","message":{"text":"ZImageControlTransformer2DModel.forward (cognitive 33): ZImageControlTransformer2DModel.forward has cognitive complexity 33 (threshold 15). Drivers by points: loops 9 (13 pts), ternaries 3 (9 pts), if/else 7 (8 pts), boolean chains 3 (nesting depth added 11). This file\u0027s own header attributes it to another copyright holder, so it is code this repository carries rather than code it wrote: restructuring the body in place forks it from upstream and turns every future re-sync into a manual merge. The performable moves are to leave the body as close to its upstream form as possible and keep it behind a narrow interface of your own, and to re-sync it when upstream changes \u2014 or, if it has already diverged far enough that you maintain it here, adopt it deliberately and then split the body into named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_transformer.py"},"region":{"startLine":451}}}],"partialFingerprints":{"codehealthFindingId/v1":"34ea64f28df94210d44bfffb57a2cb664c5b0f736cc382e63e2fe70310d99960"}},{"ruleId":"D2","level":"warning","message":{"text":"useImageUploadButton.useImageUploadButton (cognitive 33): useImageUploadButton.useImageUploadButton has cognitive complexity 33 (threshold 15). Drivers by points: if/else 12 (19 pts), ternaries 4 (11 pts), boolean chains 2, error handling 1 (nesting depth added 14). Most of this is not in the body itself: 1 of the 33 points is its own statement and the rest belongs to 6 function literals inside it that branch (lines 89, 140, 210, \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":"invokeai/frontend/webv1/src/common/hooks/useImageUploadButton.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"aee8f93b476716789d91bcaa4dc80acaac8c7e05e0d5182a978dc50cb85a72b1"}},{"ruleId":"D2","level":"warning","message":{"text":"UserManagement.UserFormModal (cognitive 33): UserManagement.UserFormModal has cognitive complexity 33 (threshold 15). Drivers by points: boolean chains 15, ternaries 9 (10 pts), if/else 5 (6 pts), error handling 2 (nesting depth added 2). Of this number, 16 points are the body\u0027s own statements and 17 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, 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":"invokeai/frontend/webv1/src/features/auth/components/UserManagement.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbc138c173974e32115769393ad125f10e6deb47550db99ae37c9725738ccb03"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolWidthPicker.ToolWidthPicker (cognitive 33): ToolWidthPicker.ToolWidthPicker has cognitive complexity 33 (threshold 15). Drivers by points: if/else 21 (22 pts), boolean chains 7, ternaries 2 (3 pts), loops 1 (nesting depth added 2). Most of this is not in the body itself: 2 of the 33 points are its own statements and the rest belongs to 16 function literals inside it that branch (lines 388, 252, 411, \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolWidthPicker.tsx"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f6ebe10d9cee1e17c0e857648bbc7ecabb55818d4b1edf3d08d0c59e607e4f8"}},{"ruleId":"D2","level":"warning","message":{"text":"semanticImageQuery.parseGallerySemanticReference (cognitive 33): semanticImageQuery.parseGallerySemanticReference has cognitive complexity 33 (threshold 15). Drivers by points: if/else 9 (18 pts), boolean chains 9, ternaries 2 (6 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":"invokeai/frontend/webv2/src/features/gallery/core/semanticImageQuery.ts"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"799389f05cadf86b561d6f4b8d6ab23042a23aaeda553e157edc457f282b4387"}},{"ruleId":"D2","level":"warning","message":{"text":"widgetValues.syncVideoWidgetValuesWithModels (cognitive 33): widgetValues.syncVideoWidgetValuesWithModels has cognitive complexity 33 (threshold 15). Drivers by points: boolean chains 11, if/else 9 (11 pts), ternaries 10 (11 pts) (nesting depth added 3). Of this number, 25 points are the body\u0027s own statements and 8 belong to 2 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":"invokeai/frontend/webv2/src/features/video/core/widgetValues.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a1d769a7c98c9f79be2e356fe2d80ef119ad781af7154f2255aedb42c06dce4"}},{"ruleId":"D2","level":"warning","message":{"text":"validation.validateConnection (cognitive 33): validation.validateConnection has cognitive complexity 33 (threshold 15). Drivers by points: if/else 17 (23 pts), boolean chains 8, loops 1 (2 pts) (nesting depth added 7). Of this number, 32 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":"invokeai/frontend/webv2/src/features/workflow/core/validation.ts"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8a85acae676064c637711bec4a56fe44ca75fad455a3736dba4bd169190921f"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectWorkflowsView.ProjectWorkflowDetailPanel (cognitive 33): ProjectWorkflowsView.ProjectWorkflowDetailPanel has cognitive complexity 33 (threshold 15). Drivers by points: ternaries 17 (21 pts), boolean chains 10, if/else 2 (nesting depth added 4). Of this number, 19 points are the body\u0027s own statements and 14 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/ProjectWorkflowsView.tsx"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"cec792f4694b3a94052913d4cdc32d900462acdf7c630e4679d3ca64b11c7b6e"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowFieldInput.VideoFrameIndexInput (cognitive 33): WorkflowFieldInput.VideoFrameIndexInput has cognitive complexity 33 (threshold 15). Drivers by points: ternaries 13 (24 pts), boolean chains 8, if/else 1 (nesting depth added 11). Of this number, 26 points are the body\u0027s own statements and 7 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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":1148}}}],"partialFingerprints":{"codehealthFindingId/v1":"2629ed2eca4a52ca81dacedb2eeab5becb7ffabdb7c1ba588ba13512fbdeb102"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingControl.SettingControl (cognitive 33): SettingControl.SettingControl has cognitive complexity 33 (threshold 15). Drivers by points: ternaries 17 (28 pts), if/else 4, boolean chains 1 (nesting depth added 11). Of this number, 29 points are the body\u0027s own statements and 4 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":"invokeai/frontend/webv2/src/platform/ui/settings/SettingControl.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"d26b52c66a6fa56b1de969888f4dee9912e215ce02affbdb81a43d22fba075f7"}},{"ruleId":"D2","level":"warning","message":{"text":"layerPanelRows.flattenPanelRows (cognitive 33): layerPanelRows.flattenPanelRows has cognitive complexity 33 (threshold 15). Drivers by points: if/else 3 (10 pts), loops 3 (9 pts), ternaries 2 (9 pts), boolean chains 5 (nesting depth added 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerPanelRows.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"174de4775fe16df5efa533f952a17ddef846a43603ebab29db3de17341894a0a"}},{"ruleId":"D2","level":"warning","message":{"text":"LayerChildRow.LayerChildRowComponent (cognitive 33): LayerChildRow.LayerChildRowComponent has cognitive complexity 33 (threshold 15). Drivers by points: if/else 12, ternaries 10 (12 pts), boolean chains 9 (nesting depth added 2). Most of this is not in the body itself: 13 of the 33 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 160, 181, 136, \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerChildRow.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ab16e26e0ddd6e9008f27bf1aafb65cadf8a464c0568b3511b3a63613dba0b0"}},{"ruleId":"D2","level":"warning","message":{"text":"store.normalizeWorkbenchPreferences (cognitive 33): store.normalizeWorkbenchPreferences has cognitive complexity 33 (threshold 15). Drivers by points: ternaries 29 (31 pts), boolean chains 2 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/store.ts"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d09ba2d14e026dad2fbc08a3ca3b75a39116682c0c76f19b795846a3294b10e"}},{"ruleId":"D2","level":"warning","message":{"text":"board_images.remove_images_from_board (cognitive 32): board_images.remove_images_from_board has cognitive complexity 32 (threshold 15). Drivers by points: error handling 9 (18 pts), if/else 4 (9 pts), loops 2 (3 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":"invokeai/app/api/routers/board_images.py"},"region":{"startLine":303}}}],"partialFingerprints":{"codehealthFindingId/v1":"a68651542245f3404dcdc8d40bc10ac48a4a2fe4d4e2a6f1cb4c045b9ff50abc"}},{"ruleId":"D2","level":"warning","message":{"text":"MiniMaxH3DenoiseInvocation.invoke (cognitive 32): MiniMaxH3DenoiseInvocation.invoke has cognitive complexity 32 (threshold 15). Drivers by points: if/else 19 (21 pts), boolean chains 7, error handling 2 (4 pts) (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/minimax_h3/minimax_h3_denoise.py"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2a3399bb231a8974f1d46a747bf274813ec965c42278b28e3d340f594d28b00"}},{"ruleId":"D2","level":"warning","message":{"text":"ExtractVideoRangeInvocation.invoke (cognitive 32): ExtractVideoRangeInvocation.invoke has cognitive complexity 32 (threshold 15). Drivers by points: if/else 16 (20 pts), boolean chains 6, ternaries 3, error handling 1 (2 pts), loops 1 (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/video_frame_extract_range.py"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"1253cab8c5d47f194a55300d1a2cffb32bd9330648a17fd8fdef109aeeccecba"}},{"ruleId":"D2","level":"warning","message":{"text":"image_index_common.blobs_to_embeddings (cognitive 32): image_index_common.blobs_to_embeddings has cognitive complexity 32 (threshold 15). Drivers by points: if/else 12 (26 pts), loops 3 (5 pts), boolean chains 1 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_common.py"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9648c1c46162291dbe99689006d3de0c0476c61a9cdcd53d006d374f15fa0ec"}},{"ruleId":"D2","level":"warning","message":{"text":"ChildDependencyRecord._validate_relationship (cognitive 32): ChildDependencyRecord._validate_relationship has cognitive complexity 32 (threshold 15). Drivers by points: if/else 16 (21 pts), boolean chains 7, loops 3 (4 pts) (nesting depth added 6). 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":"invokeai/app/services/shared/execution_engine/child.py"},"region":{"startLine":479}}}],"partialFingerprints":{"codehealthFindingId/v1":"88ed3bb6c232654f2d845f4015110a73ae7a8019be89d49364cf297f5595deeb"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionScheduler.get_next_node (cognitive 32): _ExecutionScheduler.get_next_node has cognitive complexity 32 (threshold 15). Drivers by points: if/else 10 (27 pts), loops 2 (4 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":"invokeai/app/services/shared/graph_scheduler.py"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"475dcc474dd4880bc51a97aa4a97738c92cf280e067083fbe31cf78409ba40a8"}},{"ruleId":"D2","level":"warning","message":{"text":"ControlNetModel.__init__ (cognitive 32): ControlNetModel.__init__ has cognitive complexity 32 (threshold 15). Drivers by points: if/else 18 (21 pts), boolean chains 6, loops 2 (3 pts), ternaries 1 (2 pts) (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/hotfixes.py"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"ead530e9392f5775c0c90a6828ed073c330ff1476847bbc79cc63960d814ca77"}},{"ruleId":"D2","level":"warning","message":{"text":"addInpaint.addInpaint (cognitive 32): addInpaint.addInpaint has cognitive complexity 32 (threshold 15). Drivers by points: if/else 17 (25 pts), ternaries 2 (4 pts), boolean chains 3 (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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"82e9f89471387f1db0ef8755faf842aca7e8cf6a77a43e94180b4500761b96df"}},{"ruleId":"D2","level":"warning","message":{"text":"buildZImageGraph.buildZImageGraph (cognitive 32): buildZImageGraph.buildZImageGraph has cognitive complexity 32 (threshold 15). Drivers by points: if/else 21 (25 pts), boolean chains 7 (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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"9aeed5e6924dd04701ce36dca52617bd7d00b66cb8d3ea5400e997b71d0837d5"}},{"ruleId":"D2","level":"warning","message":{"text":"GenerationSettingsAccordion.GenerationSettingsAccordion (cognitive 32): GenerationSettingsAccordion.GenerationSettingsAccordion has cognitive complexity 32 (threshold 15). Drivers by points: boolean chains 27, ternaries 5. Of this number, 30 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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"abbffa9ac70fb7ca7e41667f9e712ee82aa7796ec97d57dbcf3fece95a03ea60"}},{"ruleId":"D2","level":"warning","message":{"text":"selection.getGalleryNavigationStep (cognitive 32): selection.getGalleryNavigationStep has cognitive complexity 32 (threshold 15). Drivers by points: loops 6 (11 pts), boolean chains 9, if/else 4 (9 pts), ternaries 2 (3 pts) (nesting depth added 11). Of this number, 27 points are the body\u0027s own statements and 5 belong to 2 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":"invokeai/frontend/webv2/src/features/gallery/core/selection.ts"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2006fefa9188527a9daa946c6a306befb8bbe35fcf1766602416ff2f23576e9"}},{"ruleId":"D2","level":"warning","message":{"text":"GallerySettingField.GallerySettingField (cognitive 32): GallerySettingField.GallerySettingField has cognitive complexity 32 (threshold 15). Drivers by points: boolean chains 15, if/else 9, ternaries 5 (8 pts) (nesting depth added 3). Most of this is not in the body itself: 9 of the 32 points are its own statements and the rest belongs to one function literal inside it that branches (line 15). 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":"invokeai/frontend/webv2/src/features/gallery/ui/GallerySettingField.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"218077647517ba90862f6684f432994d6d008998bc98b1f9784e10b11c8b0f86"}},{"ruleId":"D2","level":"warning","message":{"text":"galleryBoardGroups.getGalleryBoardGroups (cognitive 32): galleryBoardGroups.getGalleryBoardGroups has cognitive complexity 32 (threshold 15). Drivers by points: boolean chains 16, if/else 4 (9 pts), loops 2 (4 pts), ternaries 3 (nesting depth added 7). Of this number, 20 points are the body\u0027s own statements and 12 belong to 9 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":"invokeai/frontend/webv2/src/features/gallery/ui/galleryBoardGroups.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec174b5cb9458df9335069a1da05164cba495c5db7b28eb9af01359ff3780fa2"}},{"ruleId":"D2","level":"warning","message":{"text":"ReferenceImageCard.ReferenceImageCardBase (cognitive 32): ReferenceImageCard.ReferenceImageCardBase has cognitive complexity 32 (threshold 15). Drivers by points: ternaries 15 (30 pts), if/else 2 (nesting depth added 15). Of this number, 30 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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"9251a36e58f3c332871539f2d618eb64ece5fd3c04bb0e9899b08357e809aac8"}},{"ruleId":"D2","level":"warning","message":{"text":"runtime.createQueueRuntime.initialize::initializeProjects (cognitive 32): runtime.createQueueRuntime.initialize::initializeProjects has cognitive complexity 32 (threshold 15). Drivers by points: if/else 8 (21 pts), loops 4 (9 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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":2379}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9fdccccd9250a2ea045960d6454751fe4cc10611369882d5ac7e56701879d03"}},{"ruleId":"D2","level":"warning","message":{"text":"buildGraph.planWorkflowSeeds (cognitive 32): buildGraph.planWorkflowSeeds has cognitive complexity 32 (threshold 15). Drivers by points: ternaries 5 (17 pts), if/else 4 (11 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 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":"invokeai/frontend/webv2/src/features/workflow/core/buildGraph.ts"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"33bed7628d72de90d0bdcd5058ebe2db40ef89b113e63b43574570628f9b6435"}},{"ruleId":"D2","level":"warning","message":{"text":"workflowJson.parseWorkflowJson (cognitive 32): workflowJson.parseWorkflowJson has cognitive complexity 32 (threshold 15). Drivers by points: if/else 6 (11 pts), ternaries 5 (11 pts), boolean chains 6, loops 3 (4 pts) (nesting depth added 12). 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, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/workflowJson.ts"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d468048f108ddb4fc2b5e0c56618b30416a6b9513c490e30214e750cea2dbaa"}},{"ruleId":"D2","level":"warning","message":{"text":"RunLayerWorkflowDialog.RunLayerWorkflowDialog (cognitive 32): RunLayerWorkflowDialog.RunLayerWorkflowDialog has cognitive complexity 32 (threshold 15). Drivers by points: if/else 15 (16 pts), ternaries 8 (9 pts), boolean chains 6, error handling 1 (nesting depth added 2). Most of this is not in the body itself: 12 of the 32 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 349, 315, 250, \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/RunLayerWorkflowDialog.tsx"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"80fda377fe4c994d39c1232dabb9e59f6a5d15428c3843c6aa05b73328426a85"}},{"ruleId":"D2","level":"warning","message":{"text":"imageRecall.getMetadataModelTuning (cognitive 32): imageRecall.getMetadataModelTuning has cognitive complexity 32 (threshold 15). Drivers by points: ternaries 13 (25 pts), if/else 4, boolean chains 3 (nesting depth added 12). Of this number, 28 points are the body\u0027s own statements and 4 belong to one function item 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":"invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1d66d2111e962b70b27bdf625b6aa1c8406206bfff8fae083fcf9daf633537b"}},{"ruleId":"D2","level":"warning","message":{"text":"imageRecall.getRefinerRecall (cognitive 32): imageRecall.getRefinerRecall has cognitive complexity 32 (threshold 15). Drivers by points: ternaries 10 (17 pts), if/else 7 (8 pts), boolean chains 7 (nesting depth added 8). 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, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts"},"region":{"startLine":781}}}],"partialFingerprints":{"codehealthFindingId/v1":"e04b32677be1d1ab59b56e6672c322b304eb0c40eca71a198241bd9e1960f8d0"}},{"ruleId":"D2","level":"warning","message":{"text":"QueueRecoveryNotice.QueueRecoveryNotice (cognitive 32): QueueRecoveryNotice.QueueRecoveryNotice has cognitive complexity 32 (threshold 15). Drivers by points: if/else 16 (19 pts), boolean chains 9, error handling 3, ternaries 1 (nesting depth added 3). Most of this is not in the body itself: 8 of the 32 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 66, 113, 92, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/queue-integration/QueueRecoveryNotice.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfd6ed2d161fc6d8cd44466035228722c1e21d5f563744dfb562c4a89c57cd89"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkbenchShell.WorkbenchShell (cognitive 32): WorkbenchShell.WorkbenchShell has cognitive complexity 32 (threshold 15). Drivers by points: ternaries 12 (13 pts), boolean chains 9, if/else 9, loops 1 (nesting depth added 1). Most of this is not in the body itself: 7 of the 32 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 220, 146, 245, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/shell/WorkbenchShell.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"c42a0431a0dc13057c70c96620976d727d1efc0344715959af8ddf1ca1348c8e"}},{"ruleId":"D2","level":"warning","message":{"text":"widgetDnd.resolveWidgetDragEnd (cognitive 32): widgetDnd.resolveWidgetDragEnd has cognitive complexity 32 (threshold 15). Drivers by points: ternaries 8 (14 pts), if/else 8 (13 pts), boolean chains 5 (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":"invokeai/frontend/webv2/src/workbench/widgetDnd.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"c72e86bb4bc1c28f9fc7953a57d651db83d474258816bb26a7e4d9954fce959d"}},{"ruleId":"D2","level":"warning","message":{"text":"VideoConcatInvocation.invoke (cognitive 31): VideoConcatInvocation.invoke has cognitive complexity 31 (threshold 15). Drivers by points: if/else 13 (21 pts), error handling 2 (6 pts), boolean chains 4 (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":"invokeai/app/invocations/video_concat.py"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dcbf686ecfc1050eb601024d16c989caf6c614ed7b237353d5b6d90e4954b11"}},{"ruleId":"D2","level":"warning","message":{"text":"user_management._modify_user_interactive (cognitive 31): user_management._modify_user_interactive has cognitive complexity 31 (threshold 15). Drivers by points: if/else 9 (15 pts), ternaries 6 (7 pts), boolean chains 5, error handling 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":"invokeai/app/util/user_management.py"},"region":{"startLine":449}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf96e3cf0e316cdded4a276ceb0a084d19362b42a682e735769815ec3b7bc228"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelConfigFactory._validate_path_looks_like_model (cognitive 31): ModelConfigFactory._validate_path_looks_like_model has cognitive complexity 31 (threshold 15). Drivers by points: if/else 10 (23 pts), loops 2 (4 pts), error handling 1 (3 pts), boolean chains 1 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/factory.py"},"region":{"startLine":761}}}],"partialFingerprints":{"codehealthFindingId/v1":"39194ded414a92a2de34b5dcb01982b529593425f701311070d3b9a64989485a"}},{"ruleId":"D2","level":"warning","message":{"text":"UserProfile.UserProfile (cognitive 31): UserProfile.UserProfile has cognitive complexity 31 (threshold 15). Drivers by points: ternaries 13 (14 pts), boolean chains 12, if/else 3, error handling 2 (nesting depth added 1). Of this number, 23 points are the body\u0027s own statements and 8 belong to 2 function literals 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":"invokeai/frontend/webv1/src/features/auth/components/UserProfile.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f106c30f3b4100b01d4de05ec6b75e17a5371f2f55fb2c542a729def74e697e"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasTextToolModule.commitSession (cognitive 31): CanvasTextToolModule.commitSession has cognitive complexity 31 (threshold 15). Drivers by points: ternaries 10 (15 pts), if/else 7 (11 pts), boolean chains 3, error handling 1 (2 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasTextToolModule.ts"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9875da9cb61eab9eb3d4df4709ae4d9a9bb00bad211056ecd28cd7c240640fc"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryBoardRow.GalleryBoardRow (cognitive 31): GalleryBoardRow.GalleryBoardRow has cognitive complexity 31 (threshold 15). Drivers by points: ternaries 17 (22 pts), if/else 6, boolean chains 3 (nesting depth added 5). Of this number, 17 points are the body\u0027s own statements and 14 belong to 8 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardRow.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"f86966e5331ffb0575fe188c06fcf0c3326d6b9b3cfc45dcf12c46b61b1f7ff1"}},{"ruleId":"D2","level":"warning","message":{"text":"holdLease.startIntermediatesHoldLease (cognitive 31): holdLease.startIntermediatesHoldLease has cognitive complexity 31 (threshold 15). Drivers by points: if/else 15 (16 pts), boolean chains 8, error handling 2 (4 pts), ternaries 2, loops 1 (nesting depth added 3). None of this is in the body itself: all 31 points belong to 10 function items inside it that branch (sendOnce, bodyFor, send, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/intermediates/holdLease.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"fba16e843a7b082e9cf5f13e600b7efcad7ccb2a05bfb9e7117d35aba50dc82e"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelEditForm.ModelEditForm (cognitive 31): ModelEditForm.ModelEditForm has cognitive complexity 31 (threshold 15). Drivers by points: ternaries 16 (18 pts), if/else 8 (10 pts), boolean chains 2, error handling 1 (nesting depth added 4). Most of this is not in the body itself: 8 of the 31 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 157, 134, 103, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/detail/ModelEditForm.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef7e3498665a81f791599d1874556aefc62902cffca9612125cc86f43c8ff301"}},{"ruleId":"D2","level":"warning","message":{"text":"InstallJobRow.InstallJobRow (cognitive 31): InstallJobRow.InstallJobRow has cognitive complexity 31 (threshold 15). Drivers by points: ternaries 21 (27 pts), boolean chains 4 (nesting depth added 6). Of this number, 28 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallJobRow.tsx"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c09cac17252a0a70cec5a1744fd9e0ca95c4ff69b69e8b2f4cd6591ce5f3930"}},{"ruleId":"D2","level":"warning","message":{"text":"graph.buildMiniMaxH3VideoGraph (cognitive 31): graph.buildMiniMaxH3VideoGraph has cognitive complexity 31 (threshold 15). Drivers by points: ternaries 13 (15 pts), if/else 10, boolean chains 6 (nesting depth added 2). Of this number, 29 points are the body\u0027s own statements and 2 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":"invokeai/frontend/webv2/src/features/video/core/graph.ts"},"region":{"startLine":438}}}],"partialFingerprints":{"codehealthFindingId/v1":"f491e822e606d6f84a073e6b544f4a6f43f77b6ffc7f0f7ee9468de5fd8cbb9a"}},{"ruleId":"D2","level":"warning","message":{"text":"MergeLayerController.mergeDown (cognitive 31): MergeLayerController.mergeDown has cognitive complexity 31 (threshold 15). Drivers by points: if/else 11 (12 pts), ternaries 7 (11 pts), boolean chains 7, error handling 1 (nesting depth added 5). Of this number, 25 points are the body\u0027s own statements and 6 belong to 4 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6ace38618d7b1b0b7a63d6ed3fd044ca4acc2973b798a0a84bd4b7d08422237"}},{"ruleId":"D2","level":"warning","message":{"text":"documentMirror.diffValueEdit (cognitive 31): documentMirror.diffValueEdit has cognitive complexity 31 (threshold 15). Drivers by points: if/else 8 (20 pts), loops 5 (7 pts), boolean chains 4 (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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentMirror.ts"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"75dbbccea3e4428ea2943a73a9e67919e7b33636525a34e55741567d03eb4c67"}},{"ruleId":"D2","level":"warning","message":{"text":"recall_parameters.resolve_control_models (cognitive 30): recall_parameters.resolve_control_models has cognitive complexity 30 (threshold 15). Drivers by points: if/else 11 (29 pts), loops 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":"invokeai/app/api/routers/recall_parameters.py"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"eafa62d8ef8f99d56d942922a986b3a80015514cd3dfd6bf859d7c766ae57ebe"}},{"ruleId":"D2","level":"warning","message":{"text":"QwenImage21DenoiseInvocation._run_diffusion (cognitive 30): QwenImage21DenoiseInvocation._run_diffusion has cognitive complexity 30 (threshold 15). Drivers by points: if/else 9 (13 pts), ternaries 8 (10 pts), boolean chains 6, 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":"invokeai/app/invocations/qwen_image_2_1/qwen_image_2_1_denoise.py"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1df7441ed843883f587d394694c2f9db439beee56455363f699e3fe396b3b68"}},{"ruleId":"D2","level":"warning","message":{"text":"ExtractVideoRangeInvocation._write_spliced_range (cognitive 30): ExtractVideoRangeInvocation._write_spliced_range has cognitive complexity 30 (threshold 15). Drivers by points: if/else 9 (15 pts), ternaries 2 (6 pts), loops 3 (4 pts), boolean chains 3, error handling 1 (2 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":"invokeai/app/invocations/video_frame_extract_range.py"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb11200531634bfdbdbfe0c1827302460b706964c37fc56cf3f723708e6ad8a3"}},{"ruleId":"D2","level":"warning","message":{"text":"config_default.migrate_v3_config_dict (cognitive 30): config_default.migrate_v3_config_dict has cognitive complexity 30 (threshold 15). Drivers by points: if/else 8 (23 pts), boolean chains 4, loops 2 (3 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":"invokeai/app/services/config/config_default.py"},"region":{"startLine":570}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8fdb3431e23c1abd80058c98a1611935dabca2c6d0742f3208d2e998b734fef"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_if_dependencies._can_use_fresh_mixed_if_iterate_collect (cognitive 30): graph_if_dependencies._can_use_fresh_mixed_if_iterate_collect has cognitive complexity 30 (threshold 15). Drivers by points: if/else 17 (20 pts), boolean chains 9, loops 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_if_dependencies.py"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"6601f109ad4efa7fe5797534a50ad8c2593d4ebdaf87296fa7a5bec6161638e7"}},{"ruleId":"D2","level":"warning","message":{"text":"aac_splice._set_audio_edit (cognitive 30): aac_splice._set_audio_edit has cognitive complexity 30 (threshold 15). Drivers by points: ternaries 9 (16 pts), if/else 6 (11 pts), boolean chains 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":"invokeai/app/util/aac_splice.py"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"88941f72cc9aced5231ca4138ac5236b17bb100cd26e9e4d37691f36a7741d39"}},{"ruleId":"D2","level":"warning","message":{"text":"denoise.denoise (cognitive 30): denoise.denoise has cognitive complexity 30 (threshold 15). Drivers by points: if/else 9 (14 pts), ternaries 5 (9 pts), boolean chains 4, loops 2 (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":"invokeai/backend/ltx2/denoise.py"},"region":{"startLine":621}}}],"partialFingerprints":{"codehealthFindingId/v1":"07eba98d7e9afdaebc56515bebd34484dfc186cb39352f23b1940a3cdbc80c2f"}},{"ruleId":"D2","level":"warning","message":{"text":"generate_docs_json.build_invocation_context_export (cognitive 30): generate_docs_json.build_invocation_context_export has cognitive complexity 30 (threshold 15). Drivers by points: if/else 8 (21 pts), loops 3 (6 pts), boolean chains 3 (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":"scripts/generate_docs_json.py"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef0a925b20ed0b129fdc4659c5fa358cca30762d86a1d9b8d8a09107b98ade3d"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasSegmentAnythingModule.onStagePointerUp (cognitive 30): CanvasSegmentAnythingModule.onStagePointerUp has cognitive complexity 30 (threshold 15). Drivers by points: if/else 10 (28 pts), boolean chains 2 (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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts"},"region":{"startLine":752}}}],"partialFingerprints":{"codehealthFindingId/v1":"339e652186a64a2a09163016beffa42a1cbb844ebd6af8d9b0b282a7d34fc14e"}},{"ruleId":"D2","level":"warning","message":{"text":"run-graph._runGraph (cognitive 30): run-graph._runGraph has cognitive complexity 30 (threshold 15). Drivers by points: if/else 15 (17 pts), error handling 4 (9 pts), boolean chains 2, loops 1, ternaries 1 (nesting depth added 7). Most of this is not in the body itself: 5 of the 30 points are its own statements and the rest belongs to 6 function items inside it that branch (a function literal at line 327, a function literal at line 216, cleanup, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/run-graph.ts"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b70b55e349ced984d821a8a65d6dd58a1a469e41c64cada06454a7fa7b48da7"}},{"ruleId":"D2","level":"warning","message":{"text":"PromptParser.parseNodes (cognitive 30): PromptParser.parseNodes has cognitive complexity 30 (threshold 15). Drivers by points: if/else 8 (22 pts), loops 2 (4 pts), boolean chains 2, match/switch 1 (2 pts) (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":"invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts"},"region":{"startLine":606}}}],"partialFingerprints":{"codehealthFindingId/v1":"54124a9b3c8e3cdc0ae658751dc22dcbb800115dcf22b2e346eda36d8c93169e"}},{"ruleId":"D2","level":"warning","message":{"text":"runtime.createQueueRuntime.handleItemsRetried (cognitive 30): runtime.createQueueRuntime.handleItemsRetried has cognitive complexity 30 (threshold 15). Drivers by points: loops 7 (13 pts), if/else 6 (11 pts), boolean chains 5, ternaries 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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":1552}}}],"partialFingerprints":{"codehealthFindingId/v1":"e19c34c2c4eb463ee30f13f2d888bb95987dc4c832513405e38ce17d59239f79"}},{"ruleId":"D2","level":"warning","message":{"text":"graph.buildWanVideoGraph (cognitive 30): graph.buildWanVideoGraph has cognitive complexity 30 (threshold 15). Drivers by points: ternaries 12 (15 pts), if/else 6 (9 pts), boolean chains 6 (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":"invokeai/frontend/webv2/src/features/video/core/graph.ts"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"d22494bdeed934ce365355851d3d920d7c868cc8a7c94be76281dee2a6f6a8e8"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowFieldInput.SavedWorkflowInput (cognitive 30): WorkflowFieldInput.SavedWorkflowInput has cognitive complexity 30 (threshold 15). Drivers by points: ternaries 14 (18 pts), boolean chains 7, if/else 5 (nesting depth added 4). Of this number, 21 points are the body\u0027s own statements and 9 belong to 5 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":1675}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd63db6c948ec9555903e038c01e93942ef6f852d7001316ba1f67ce6fc26185"}},{"ruleId":"D2","level":"warning","message":{"text":"HsvBoxPicker.HsvBoxPicker (cognitive 30): HsvBoxPicker.HsvBoxPicker has cognitive complexity 30 (threshold 15). Drivers by points: ternaries 13 (20 pts), boolean chains 6, if/else 4 (nesting depth added 7). Most of this is not in the body itself: 7 of the 30 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 106, 127, 48, \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":"invokeai/frontend/webv2/src/platform/ui/HsvBoxPicker.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca7a8266f8aaa6b7141ed51fd6ad59ac5a967b67e5ecf182c4d9f071974c37fe"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageMapWidgetView.ImageMapWidgetView (cognitive 30): ImageMapWidgetView.ImageMapWidgetView has cognitive complexity 30 (threshold 15). Drivers by points: ternaries 8 (15 pts), if/else 10, boolean chains 5 (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":"invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapWidgetView.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e5a530eaa8925b4e78ae4728f9eb3d67da6cdbdb45846e978564455b723befd"}},{"ruleId":"D2","level":"warning","message":{"text":"MergeLayerController.mergeSelected (cognitive 30): MergeLayerController.mergeSelected has cognitive complexity 30 (threshold 15). Drivers by points: if/else 14 (15 pts), boolean chains 6, loops 5, ternaries 3 (4 pts) (nesting depth added 2). Of this number, 26 points are the body\u0027s own statements and 4 belong to 4 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"a77acebd94de873a614b97d4b6022c0fb1fc057110cc2600b31882579cac69e6"}},{"ruleId":"D2","level":"warning","message":{"text":"documentIndex.updateNodeValues (cognitive 30): documentIndex.updateNodeValues has cognitive complexity 30 (threshold 15). Drivers by points: if/else 12 (24 pts), loops 4 (5 pts), boolean chains 1 (nesting depth added 13). Of this number, 16 points are the body\u0027s own statements and 14 belong to one function item 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentIndex.ts"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"77e7595b03bda754792b59668f86f0fc8e5c42eae8041b534aabe7dc7324cd8c"}},{"ruleId":"D2","level":"warning","message":{"text":"PsdExportController.export (cognitive 30): PsdExportController.export has cognitive complexity 30 (threshold 15). Drivers by points: if/else 18 (20 pts), ternaries 5 (6 pts), boolean chains 3, error handling 1 (nesting depth added 3). Of this number, 20 points are the body\u0027s own statements and 10 belong to 2 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/psdExportController.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"78fd93a29bfd774a221291264b57e3ca768a11f96dac43da58f6313f58057d7e"}},{"ruleId":"D2","level":"warning","message":{"text":"bitmapStore.createBitmapStore.flushPendingUploads (cognitive 30): bitmapStore.createBitmapStore.flushPendingUploads has cognitive complexity 30 (threshold 15). Drivers by points: if/else 8 (21 pts), loops 3 (5 pts), boolean chains 4 (nesting depth added 15). Of this number, 28 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts"},"region":{"startLine":668}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e395e9c218263fc0e37512739c7e2f4112735a7332af348e7de6cbe4f25febc"}},{"ruleId":"D2","level":"warning","message":{"text":"StatusBar.CompactBottomWidget (cognitive 30): StatusBar.CompactBottomWidget has cognitive complexity 30 (threshold 15). Drivers by points: ternaries 16 (18 pts), if/else 7 (8 pts), boolean chains 4 (nesting depth added 3). Of this number, 20 points are the body\u0027s own statements and 10 belong to 5 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/shell/StatusBar.tsx"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"e17f6c9a55e45fab0c026152959ec2205b325bcb29e5953a48be0eee411b895d"}},{"ruleId":"D2","level":"warning","message":{"text":"VideoConcatInvocation._iter_joined_frames (cognitive 29): VideoConcatInvocation._iter_joined_frames has cognitive complexity 29 (threshold 15). Drivers by points: if/else 8 (20 pts), ternaries 2 (4 pts), loops 2 (3 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":"invokeai/app/invocations/video_concat.py"},"region":{"startLine":805}}}],"partialFingerprints":{"codehealthFindingId/v1":"03528e2f53905353ee02370645c0bec6e421f1d09c017c7a8d4ed8e4d199e430"}},{"ruleId":"D2","level":"warning","message":{"text":"ExecutionRef._accept_token_fields (cognitive 29): ExecutionRef._accept_token_fields has cognitive complexity 29 (threshold 15). Drivers by points: if/else 11 (19 pts), loops 3 (6 pts), boolean chains 4 (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":"invokeai/app/services/shared/execution_effects.py"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3aa2f0f4f1c0ede37f1293ec465f7352562c1a20c6fc5c0187a3b6de57f3333"}},{"ruleId":"D2","level":"warning","message":{"text":"Config_Base.get_model_discriminator_value (cognitive 29): Config_Base.get_model_discriminator_value has cognitive complexity 29 (threshold 15). Drivers by points: if/else 13 (28 pts), boolean chains 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":"invokeai/backend/model_manager/configs/base.py"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"46277c98a48c0135b30d7da0335f8513800d19ba68c3b067e79fe1fb75e6f4bd"}},{"ruleId":"D2","level":"warning","message":{"text":"main._detect_wan_expert (cognitive 29): main._detect_wan_expert has cognitive complexity 29 (threshold 15). Drivers by points: if/else 10 (18 pts), loops 3 (4 pts), ternaries 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":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":2653}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7a4cd978a9de28861b81a576dbf6ecd1f994c971ebd812477ac7098046851e8"}},{"ruleId":"D2","level":"warning","message":{"text":"minimax_h3_state_dict_utils.convert_minimax_h3_checkpoint_to_diffusers (cognitive 29): minimax_h3_state_dict_utils.convert_minimax_h3_checkpoint_to_diffusers has cognitive complexity 29 (threshold 15). Drivers by points: if/else 9 (21 pts), loops 3 (8 pts) (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":"invokeai/backend/model_manager/load/model_loaders/minimax_h3_state_dict_utils.py"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"03f8bd8faba794e88fe07969ae2490f69955a2301ec2d5e3855ed37a37a712bd"}},{"ruleId":"D2","level":"warning","message":{"text":"PidDistillModel.generate_samples_from_batch (cognitive 29): PidDistillModel.generate_samples_from_batch has cognitive complexity 29 (threshold 15). Drivers by points: if/else 18 (22 pts), boolean chains 5, ternaries 2 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/models/pid_distill_model.py"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5f1faf65351f0ad8b7ee659a1e4fdf9362a4aa57c4c17732eb4bc47773c7bdc"}},{"ruleId":"D2","level":"warning","message":{"text":"TextLLMPipeline.run (cognitive 29): TextLLMPipeline.run has cognitive complexity 29 (threshold 15). Drivers by points: if/else 13 (19 pts), boolean chains 6, error handling 2 (3 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":"invokeai/backend/text_llm_pipeline.py"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d2b4418d170d644fd4084a2bb9652cce0069c00cc816af3ee19eaccfdb7a2f1"}},{"ruleId":"D2","level":"warning","message":{"text":"ProtectedRoute.ProtectedRoute (cognitive 29): ProtectedRoute.ProtectedRoute has cognitive complexity 29 (threshold 15). Drivers by points: if/else 14 (16 pts), boolean chains 13 (nesting depth added 2). Most of this is not in the body itself: 8 of the 29 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 114, 100, 42, \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":"invokeai/frontend/webv1/src/features/auth/components/ProtectedRoute.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"08d5879819c904e950a318559b7aad72043b6cd5147acbbdde855faf753ece6f"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelView.ModelView (cognitive 29): ModelView.ModelView has cognitive complexity 29 (threshold 15). Drivers by points: boolean chains 24, if/else 5. Of this number, 21 points are the body\u0027s own statements and 8 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelView.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0a02dd842d8e3a9ff37e72b7ef3eaacbbdcff3f5f8d9ac90d52a0c9eb838034"}},{"ruleId":"D2","level":"warning","message":{"text":"tsSourceAnalysis.collectPublicExports (cognitive 29): tsSourceAnalysis.collectPublicExports has cognitive complexity 29 (threshold 15). Drivers by points: if/else 8 (18 pts), loops 3 (9 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":"invokeai/frontend/webv2/src/architecture/tsSourceAnalysis.ts"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"09da40fea0d38be10a8395eff715e68ab571ee08e4d1a64244939eeb3e3a5d3b"}},{"ruleId":"D2","level":"warning","message":{"text":"PromptTextarea.PromptTextarea (cognitive 29): PromptTextarea.PromptTextarea has cognitive complexity 29 (threshold 15). Drivers by points: ternaries 15 (21 pts), boolean chains 7, if/else 1 (nesting depth added 6). Most of this is not in the body itself: 13 of the 29 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 149, 217, 96, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTextarea.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"37cf7fd2ec3af2422485770e63483ee40631c5725d67c50739d24e1f2cfd6964"}},{"ruleId":"D2","level":"warning","message":{"text":"GeneratePresetsPopover.GeneratePresetsPopover (cognitive 29): GeneratePresetsPopover.GeneratePresetsPopover has cognitive complexity 29 (threshold 15). Drivers by points: ternaries 15 (19 pts), if/else 8, boolean chains 2 (nesting depth added 4). Of this number, 15 points are the body\u0027s own statements and 14 belong to 8 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/GeneratePresetsPopover.tsx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"586c60b785992b178d13474cdcaaa994f6d79442307f1906aba05c39df76b88f"}},{"ruleId":"D2","level":"warning","message":{"text":"UserFormDialog.UserForm (cognitive 29): UserFormDialog.UserForm has cognitive complexity 29 (threshold 15). Drivers by points: ternaries 12 (15 pts), if/else 6 (10 pts), boolean chains 2, error handling 2 (nesting depth added 7). Most of this is not in the body itself: 13 of the 29 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 123, 108). 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":"invokeai/frontend/webv2/src/features/identity/ui/UserFormDialog.tsx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"46a809af470fe8384fdedfc88ed617261943819ba38c02fb6a57799675a86141"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowFieldInput.useMediaUpload.onFileChange (cognitive 29): WorkflowFieldInput.useMediaUpload.onFileChange has cognitive complexity 29 (threshold 15). Drivers by points: if/else 11 (14 pts), ternaries 5 (8 pts), boolean chains 4, error handling 1 (2 pts), loops 1 (nesting depth added 7). Most of this is not in the body itself: 6 of the 29 points are its own statements and the rest belongs to one function literal inside it that branches (line 629). 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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":604}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1fe61f745d65a39db1f5c347c36551bb1c27ffe37539f68db16861c64346df5"}},{"ruleId":"D2","level":"warning","message":{"text":"usePreviewNavigation.usePreviewNavigation (cognitive 29): usePreviewNavigation.usePreviewNavigation has cognitive complexity 29 (threshold 15). Drivers by points: boolean chains 14, ternaries 11 (12 pts), if/else 3 (nesting depth added 1). Of this number, 25 points are the body\u0027s own statements and 4 belong to 2 function literals 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewNavigation.ts"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"adbc6d960dd2dec678a381195ab4871578647dffb8fd16824e7fd97a227dfba8"}},{"ruleId":"D2","level":"warning","message":{"text":"PreviewFilmstrip.FilmstripLiveThumb (cognitive 29): PreviewFilmstrip.FilmstripLiveThumb has cognitive complexity 29 (threshold 15). Drivers by points: ternaries 12 (18 pts), if/else 7 (8 pts), boolean chains 3 (nesting depth added 7). Of this number, 21 points are the body\u0027s own statements and 8 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFilmstrip.tsx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"21e5558c93eca6856941cbcaa540ce7bfc5bb4dbcccb549c0261058ac80a413f"}},{"ruleId":"D2","level":"warning","message":{"text":"workbenchState.compileInvocationSnapshot (cognitive 29): workbenchState.compileInvocationSnapshot has cognitive complexity 29 (threshold 15). Drivers by points: if/else 12 (18 pts), ternaries 6 (10 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":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":2705}}}],"partialFingerprints":{"codehealthFindingId/v1":"961830f670609b9c12cefc13be4b5b541c242c243402fc9960e6f5bc050a7c1e"}},{"ruleId":"D2","level":"warning","message":{"text":"documentMirror.diffForests (cognitive 29): documentMirror.diffForests has cognitive complexity 29 (threshold 15). Drivers by points: if/else 11 (24 pts), boolean chains 3, loops 2 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentMirror.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cf031b1723a22bb6bcd082961c78735591df3b78d01a6a1fca6b6d13241c06b"}},{"ruleId":"D2","level":"warning","message":{"text":"documentMirror.createDocumentMirror.refresh (cognitive 29): documentMirror.createDocumentMirror.refresh has cognitive complexity 29 (threshold 15). Drivers by points: if/else 11 (23 pts), ternaries 1 (4 pts), boolean chains 2 (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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentMirror.ts"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b6a59741230acc487879d81c5d12eca448c21a7390b69a9c2a1125a4b26ca72"}},{"ruleId":"D2","level":"warning","message":{"text":"shapeTool.createShapeTool.commitPixels (cognitive 29): shapeTool.createShapeTool.commitPixels has cognitive complexity 29 (threshold 15). Drivers by points: if/else 16 (17 pts), boolean chains 7, ternaries 4, error handling 1 (nesting depth added 1). Of this number, 25 points are the body\u0027s own statements and 4 belong 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/shapeTool.ts"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"819598ffdf5b01f18675b76541b0f24f46e0719e95af420661683aef4bf0f5b9"}},{"ruleId":"D2","level":"warning","message":{"text":"mediaReferences.collectMediaNames (cognitive 29): mediaReferences.collectMediaNames has cognitive complexity 29 (threshold 15). Drivers by points: if/else 8 (21 pts), loops 3 (6 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":"invokeai/frontend/webv2/src/workbench/mediaReferences.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9d54e76cd29e033d27c7904dfc2d0195b7b94b6c487b3ad4025203de7a04f4b"}},{"ruleId":"D2","level":"warning","message":{"text":"LayerFilterControls.FilterParamField (cognitive 29): LayerFilterControls.FilterParamField has cognitive complexity 29 (threshold 15). Drivers by points: ternaries 12 (16 pts), if/else 7, boolean chains 6 (nesting depth added 4). Of this number, 23 points are the body\u0027s own statements and 6 belong to 4 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerFilterControls.tsx"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"af641d3bb3f8d0a690d75a93de0bf1535309d3e02a0b1133e99b5fa4576412c9"}},{"ruleId":"D2","level":"warning","message":{"text":"baseinvocation.validate_fields (cognitive 28): baseinvocation.validate_fields has cognitive complexity 28 (threshold 15). Drivers by points: if/else 10 (21 pts), boolean chains 6, 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":"invokeai/app/invocations/baseinvocation.py"},"region":{"startLine":573}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbc85c3f9a6042327284736d1e3ea4dc91a59683aa128ed56177c9d997ee03da"}},{"ruleId":"D2","level":"warning","message":{"text":"Flux2KleinLoRACollectionLoader.invoke (cognitive 28): Flux2KleinLoRACollectionLoader.invoke has cognitive complexity 28 (threshold 15). Drivers by points: if/else 10 (19 pts), boolean chains 4, ternaries 2 (4 pts), loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux2/flux2_klein_lora_loader.py"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"d476d5334840dfc750724d44c5dd956a3a68514723b634a7efbe5838707b3ac5"}},{"ruleId":"D2","level":"warning","message":{"text":"ZImageLoRACollectionLoader.invoke (cognitive 28): ZImageLoRACollectionLoader.invoke has cognitive complexity 28 (threshold 15). Drivers by points: if/else 10 (19 pts), boolean chains 4, ternaries 2 (4 pts), loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/z_image/z_image_lora_loader.py"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"b16ea5546fce57e8ff12e9cab08cede5a52a5bf5466567864e39e4835ee8bf74"}},{"ruleId":"D2","level":"warning","message":{"text":"ExternalGenerationService._validate_request (cognitive 28): ExternalGenerationService._validate_request has cognitive complexity 28 (threshold 15). Drivers by points: if/else 13 (20 pts), boolean chains 8 (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":"invokeai/app/services/external_generation/external_generation_default.py"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"44aac3b0ea1de44c98811416335a697c590dcf9bd7e6bfebfaf5982561e13740"}},{"ruleId":"D2","level":"warning","message":{"text":"DiskImageFileStorage.__recover_pending_deletes (cognitive 28): DiskImageFileStorage.__recover_pending_deletes has cognitive complexity 28 (threshold 15). Drivers by points: if/else 6 (18 pts), loops 3 (7 pts), error handling 1 (2 pts), boolean chains 1 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_files/image_files_disk.py"},"region":{"startLine":695}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cd376bdfa2dc61b7a18f0c6f55c1e86878d2479d8f70c0de5f1164a61d223d6"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelInstallService._migrate_yaml (cognitive 28): ModelInstallService._migrate_yaml has cognitive complexity 28 (threshold 15). Drivers by points: if/else 7 (19 pts), error handling 1 (4 pts), loops 1 (3 pts), boolean chains 2 (nesting depth added 17). 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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":1409}}}],"partialFingerprints":{"codehealthFindingId/v1":"85e551524939b1b560edf7d6c2e92e0feba2e50756558fe8bb4ca30e03d30466"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_if_runtime.validate_if_iteration_axes (cognitive 28): graph_if_runtime.validate_if_iteration_axes has cognitive complexity 28 (threshold 15). Drivers by points: if/else 6 (17 pts), loops 3 (6 pts), boolean chains 5 (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":"invokeai/app/services/shared/graph_if_runtime.py"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"80490bb123477c7c210ceb094c923b4281c78acc1e4d126e15e7121caf5a7424"}},{"ruleId":"D2","level":"warning","message":{"text":"h264_splice._sample_locations (cognitive 28): h264_splice._sample_locations has cognitive complexity 28 (threshold 15). Drivers by points: if/else 6 (12 pts), boolean chains 6, loops 3 (6 pts), ternaries 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":"invokeai/app/util/h264_splice.py"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"79eb081e2441ef87157f97fef1314325b01f1be4106a60a9bde0b4aea5af5ce5"}},{"ruleId":"D2","level":"warning","message":{"text":"main._get_flux2_variant (cognitive 28): main._get_flux2_variant has cognitive complexity 28 (threshold 15). Drivers by points: if/else 10 (26 pts), loops 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":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":450}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7ac23a32b4e69027cc1191641d45bb010a9fe093f2345709214c28423b66187"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelCache.put (cognitive 28): ModelCache.put has cognitive complexity 28 (threshold 15). Drivers by points: boolean chains 12, if/else 12, loops 2 (3 pts), ternaries 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":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":928}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b5089ec573e8b8965a83c7a21fd115aa17c3631c7e06843d8c4c95c4d7caa66"}},{"ruleId":"D2","level":"warning","message":{"text":"TorchDevice.get_generation_devices (cognitive 28): TorchDevice.get_generation_devices has cognitive complexity 28 (threshold 15). Drivers by points: if/else 11 (24 pts), boolean chains 3, 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":"invokeai/backend/util/devices.py"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd5c67fa0ef6034ba81ae0ccf96c504cef392d017f00e040fda3171a0cedafa6"}},{"ruleId":"D2","level":"warning","message":{"text":"TextToolOptions.FontSelect (cognitive 28): TextToolOptions.FontSelect has cognitive complexity 28 (threshold 15). Drivers by points: if/else 16 (18 pts), boolean chains 7, ternaries 2, loops 1 (nesting depth added 2). None of this is in the body itself: all 28 points belong to 14 function literals inside it that branch (lines 123, 216, 265, \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"35c0eea637af000053860fd8881b2721edffb06950ed8a1e9089d2b0871fcc20"}},{"ruleId":"D2","level":"warning","message":{"text":"DeleteBoardModal.DeleteBoardModal (cognitive 28): DeleteBoardModal.DeleteBoardModal has cognitive complexity 28 (threshold 15). Drivers by points: ternaries 9 (13 pts), boolean chains 9, if/else 6 (nesting depth added 4). Most of this is not in the body itself: 8 of the 28 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 105, 123, 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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f303ec8ef97cea6faf9e33c86fb6bbc0ffad621173f45d234febeea7c1e0f94"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryImageGrid.useKeyboardNavigation (cognitive 28): GalleryImageGrid.useKeyboardNavigation has cognitive complexity 28 (threshold 15). Drivers by points: if/else 16 (23 pts), boolean chains 3, match/switch 1, ternaries 1 (nesting depth added 7). None of this is in the body itself: all 28 points belong to one function literal inside it that branches (line 144). 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":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6823bdc749bbaf752cb085d5ffd62b5ec364cb2b466ab9ebe2685fa03192391"}},{"ruleId":"D2","level":"warning","message":{"text":"addRegionalGuidance.addRegionalGuidance (cognitive 28): addRegionalGuidance.addRegionalGuidance has cognitive complexity 28 (threshold 15). Drivers by points: if/else 10 (21 pts), boolean chains 4, loops 2 (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":"invokeai/frontend/webv2/src/features/generation/core/canvas/addRegionalGuidance.ts"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"555537fda52a45871e450f99f40b0dca4d60be7fb5cc0cf18d0f5398aa67a86c"}},{"ruleId":"D2","level":"warning","message":{"text":"attention.groupWeightedLeaves (cognitive 28): attention.groupWeightedLeaves has cognitive complexity 28 (threshold 15). Drivers by points: if/else 4 (13 pts), ternaries 4 (10 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 16). Of this number, 25 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":"invokeai/frontend/webv2/src/features/generation/core/prompt/attention.ts"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba69d7aa9946d5596fdc864beaca404a6629e98b12465f5099535067f9a05271"}},{"ruleId":"D2","level":"warning","message":{"text":"modelSettingsIO.validateImportData (cognitive 28): modelSettingsIO.validateImportData has cognitive complexity 28 (threshold 15). Drivers by points: if/else 13 (18 pts), boolean chains 10 (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":"invokeai/frontend/webv2/src/features/models/core/modelSettingsIO.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"d99607d1a8f534a7ef2cd73c43847452e2cfe43438befe7caea7615a039c141f"}},{"ruleId":"D2","level":"warning","message":{"text":"OrphanedModelsDialog.OrphanedModelsDialog (cognitive 28): OrphanedModelsDialog.OrphanedModelsDialog has cognitive complexity 28 (threshold 15). Drivers by points: ternaries 6 (19 pts), if/else 6 (7 pts), boolean chains 1, error handling 1 (nesting depth added 14). Of this number, 16 points are the body\u0027s own statements and 12 belong to 5 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":"invokeai/frontend/webv2/src/features/models/ui/library/OrphanedModelsDialog.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"468bd6305bc72ea19775ab6481902b945d0d971030cd303e46b88138ee8fd407"}},{"ruleId":"D2","level":"warning","message":{"text":"invocation.resolveInvocationRouteInput (cognitive 28): invocation.resolveInvocationRouteInput has cognitive complexity 28 (threshold 15). Drivers by points: if/else 12 (16 pts), boolean chains 6, ternaries 4 (6 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":"invokeai/frontend/webv2/src/workbench/invocation.ts"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6c72a409b0b864b7a27776dd60d3319d877be4cb7d03e799ee8743a1b734916"}},{"ruleId":"D2","level":"warning","message":{"text":"MissingFontsDialog.RecoveryRow (cognitive 28): MissingFontsDialog.RecoveryRow has cognitive complexity 28 (threshold 15). Drivers by points: ternaries 9 (11 pts), boolean chains 9, if/else 6 (7 pts), error handling 1 (nesting depth added 3). Most of this is not in the body itself: 12 of the 28 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 166, 193). 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/MissingFontsDialog.tsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b687adcf6db6996aceb725946ba969681e708e32ecc0297070342d66b6c0bbc"}},{"ruleId":"D2","level":"warning","message":{"text":"LayerGroupContextMenu.LayerGroupContextMenu (cognitive 28): LayerGroupContextMenu.LayerGroupContextMenu has cognitive complexity 28 (threshold 15). Drivers by points: ternaries 10 (12 pts), if/else 8, boolean chains 7, error handling 1 (nesting depth added 2). Of this number, 18 points are the body\u0027s own statements and 10 belong to 5 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerGroupContextMenu.tsx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"7797c3ec0e60c17d5feb466f3251fd216a29f93e1e2ce98fdb761dedfa5e55fa"}},{"ruleId":"D2","level":"warning","message":{"text":"SelectionPixelController.edit (cognitive 28): SelectionPixelController.edit has cognitive complexity 28 (threshold 15). Drivers by points: if/else 12 (13 pts), ternaries 7 (9 pts), boolean chains 6 (nesting depth added 3). Of this number, 24 points are the body\u0027s own statements and 4 belong to one function item 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/selectionPixelController.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"46c5928862c35d8dd401864df71bd4dcde374bc45959c8ab579dd29f8d62c87f"}},{"ruleId":"D2","level":"warning","message":{"text":"revealGalleryItem.revealGalleryItem (cognitive 28): revealGalleryItem.revealGalleryItem has cognitive complexity 28 (threshold 15). Drivers by points: boolean chains 11, if/else 10, ternaries 6 (7 pts) (nesting depth added 1). Most of this is not in the body itself: 1 of the 28 points is its own statement and the rest belongs to 2 function items inside it that branch (a function literal at line 69, isCurrent). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/revealGalleryItem.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce941ca10802ca9732214467a6bdeacd3e8eda5e07f7bd15258822af69ccab3d"}},{"ruleId":"D2","level":"warning","message":{"text":"PreferencesPage.PreferencesPage (cognitive 28): PreferencesPage.PreferencesPage has cognitive complexity 28 (threshold 15). Drivers by points: ternaries 11 (13 pts), boolean chains 9, if/else 5 (6 pts) (nesting depth added 3). Of this number, 18 points are the body\u0027s own statements and 10 belong to 6 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":"invokeai/frontend/webv2/src/workbench/settings/PreferencesPage.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"05d2b5cf9a992ac34369f95c7f2241c76b846175ab234bfae415d6afd2c3a6b3"}},{"ruleId":"D2","level":"warning","message":{"text":"VideoConcatInvocation._execute_smart_render (cognitive 27): VideoConcatInvocation._execute_smart_render has cognitive complexity 27 (threshold 15). Drivers by points: if/else 9 (16 pts), loops 6 (8 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":"invokeai/app/invocations/video_concat.py"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a57f74807c08d069ebe86465b7521a090719aee5e14ba24c9560b650fc7070a"}},{"ruleId":"D2","level":"warning","message":{"text":"fonts_parsing.parse_font_bytes (cognitive 27): fonts_parsing.parse_font_bytes has cognitive complexity 27 (threshold 15). Drivers by points: boolean chains 9, if/else 8 (9 pts), loops 2 (4 pts), ternaries 3, error handling 2 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/fonts/fonts_parsing.py"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"0160e7a82275a59f20b492c69ee223b18bfb295fd06484da98e9819edc2a9978"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_if_dependencies._can_use_fresh_literal_if_iterate_collect (cognitive 27): graph_if_dependencies._can_use_fresh_literal_if_iterate_collect has cognitive complexity 27 (threshold 15). Drivers by points: if/else 16 (20 pts), boolean chains 6, loops 1 (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":"invokeai/app/services/shared/graph_if_dependencies.py"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"d05e24a1bff04e04797d437314f8cd92a92ce86dfadb7eac8ed859e59c496123"}},{"ruleId":"D2","level":"warning","message":{"text":"video_thumbnails._iter_video_frames_unbounded (cognitive 27): video_thumbnails._iter_video_frames_unbounded has cognitive complexity 27 (threshold 15). Drivers by points: if/else 7 (13 pts), ternaries 3 (7 pts), error handling 2 (4 pts), boolean chains 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":"invokeai/app/util/video_thumbnails.py"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"26e29b4132b9110d635bcc80bb547650ac8453876679b90b89985fdd223d7878"}},{"ruleId":"D2","level":"warning","message":{"text":"mistral_encoder._load_tokenizer_for_model (cognitive 27): mistral_encoder._load_tokenizer_for_model has cognitive complexity 27 (threshold 15). Drivers by points: if/else 9 (22 pts), loops 2 (5 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":"invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py"},"region":{"startLine":1008}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee7f523777f8595deaba209887ddd413aaefb5b99417f2a136ade4938beacaee"}},{"ruleId":"D2","level":"warning","message":{"text":"model_util.calc_model_size_by_fs (cognitive 27): model_util.calc_model_size_by_fs has cognitive complexity 27 (threshold 15). Drivers by points: if/else 14 (18 pts), loops 3 (4 pts), boolean chains 3, error handling 1 (2 pts) (nesting depth added 6). 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":"invokeai/backend/model_manager/load/model_util.py"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f642323f7ca5f4cd6aa3fa8ffc930d34b459c507e23e7eaadedde0c93c044cf"}},{"ruleId":"D2","level":"warning","message":{"text":"HuggingFaceMetadataFetch.from_id (cognitive 27): HuggingFaceMetadataFetch.from_id has cognitive complexity 27 (threshold 15). Drivers by points: if/else 6 (11 pts), error handling 4 (8 pts), boolean chains 3, ternaries 2 (3 pts), 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":"invokeai/backend/model_manager/metadata/fetch/huggingface.py"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"466802eb111cf30f1b64b394998d6be8e21655bac8820795dc84db3583181c62"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelSettingsImportButton.ModelSettingsImportButton (cognitive 27): ModelSettingsImportButton.ModelSettingsImportButton has cognitive complexity 27 (threshold 15). Drivers by points: if/else 13 (17 pts), error handling 2 (5 pts), boolean chains 3, loops 1, ternaries 1 (nesting depth added 7). None of this is in the body itself: all 27 points belong to 3 function literals inside it that branch (lines 23, 122, 129). 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelSettingsImportButton.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"835bd8662199a6bbc7dd17cab2a588acd31acaa5c9bc4d36ac52163bdfbfc576"}},{"ruleId":"D2","level":"warning","message":{"text":"buildFLUXGraph.buildFLUXGraph::addFlux2Features (cognitive 27): buildFLUXGraph.buildFLUXGraph::addFlux2Features has cognitive complexity 27 (threshold 15). Drivers by points: if/else 16 (22 pts), boolean chains 3, loops 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. This shape REPEATS in the file: one other method here (buildFLUXGraph.buildFLUXGraph) 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"70dda724452386a8ff5e5e8495b801366e8c22b9a349ace6069e5166612e1f36"}},{"ruleId":"D2","level":"warning","message":{"text":"ast.tokenizePrompt (cognitive 27): ast.tokenizePrompt has cognitive complexity 27 (threshold 15). Drivers by points: if/else 10 (21 pts), ternaries 1 (3 pts), boolean chains 2, 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":"invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca7ee6a3519e84f9e7566724211ae74f952046f38c0f534d8202a34d2df7768c"}},{"ruleId":"D2","level":"warning","message":{"text":"SystemPromptsField.SystemPromptsField (cognitive 27): SystemPromptsField.SystemPromptsField has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 9 (14 pts), if/else 7, boolean chains 3, error handling 3 (nesting depth added 5). Of this number, 15 points are the body\u0027s own statements and 12 belong to 6 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/SystemPromptsField.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f116933cd02b093cec263846a43d92e9e3ddc28a9e5bc7cefb435196a255f65"}},{"ruleId":"D2","level":"warning","message":{"text":"runtime.createQueueItemBackendSubmission (cognitive 27): runtime.createQueueItemBackendSubmission has cognitive complexity 27 (threshold 15). Drivers by points: boolean chains 10, if/else 9 (10 pts), ternaries 4 (7 pts) (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"c89664d392b00ff94391ca9d632f253d696cf0b5144654d989afa0652310131c"}},{"ruleId":"D2","level":"warning","message":{"text":"settings.sanitizeVideoReferences (cognitive 27): settings.sanitizeVideoReferences has cognitive complexity 27 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 7, loops 4 (5 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":"invokeai/frontend/webv2/src/features/video/core/settings.ts"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"593eb32825ad4cf82a7c06b671ac1622b92124154c0c7b1b7585626fd72f228d"}},{"ruleId":"D2","level":"warning","message":{"text":"adjustments.buildCurveLut (cognitive 27): adjustments.buildCurveLut has cognitive complexity 27 (threshold 15). Drivers by points: if/else 8 (13 pts), loops 8 (11 pts), ternaries 1 (2 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/adjustments.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"346adc8388d899f9caeab2c2dc38a36b3aba40b89c8731cee876ccfbba0825eb"}},{"ruleId":"D2","level":"warning","message":{"text":"SelectObjectCoordinator.createSelectObjectOperationCoordinator.save (cognitive 27): SelectObjectCoordinator.createSelectObjectOperationCoordinator.save has cognitive complexity 27 (threshold 15). Drivers by points: if/else 15 (20 pts), ternaries 2 (4 pts), boolean chains 2, error handling 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/SelectObjectCoordinator.ts"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"37e3a65aa9531ee83fa3e94931653bb18c194cb3cbe3df0aa0e9548479ae448b"}},{"ruleId":"D2","level":"warning","message":{"text":"executeImageRecall.executeLoadMediaWorkflow (cognitive 27): executeImageRecall.executeLoadMediaWorkflow has cognitive complexity 27 (threshold 15). Drivers by points: if/else 13 (20 pts), boolean chains 4, ternaries 2, error handling 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/executeImageRecall.ts"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ffb8b108d27501e41659f07560e0259c2060bb8d0eafb57c2b01876b8a55493"}},{"ruleId":"D2","level":"warning","message":{"text":"ReferenceImageSettings.ReferenceImageEditor (cognitive 27): ReferenceImageSettings.ReferenceImageEditor has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 14 (17 pts), if/else 6, boolean chains 4 (nesting depth added 3). Most of this is not in the body itself: 11 of the 27 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 328, 278, 291, \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/ReferenceImageSettings.tsx"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfc79b219ff1e15168cad0a3ee1fd4edf9bfdcff7aad16d6e96bedf956593f78"}},{"ruleId":"D2","level":"warning","message":{"text":"recall_parameters.resolve_ip_adapter_models (cognitive 26): recall_parameters.resolve_ip_adapter_models has cognitive complexity 26 (threshold 15). Drivers by points: if/else 10 (25 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":"invokeai/app/api/routers/recall_parameters.py"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ffb5608d90b2486c2fed5809ac5e2ef1863888aee828f9279d6a5428256fb45"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimaLoRACollectionLoader.invoke (cognitive 26): AnimaLoRACollectionLoader.invoke has cognitive complexity 26 (threshold 15). Drivers by points: if/else 11 (19 pts), ternaries 2 (4 pts), boolean chains 2, 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":"invokeai/app/invocations/anima/anima_lora_loader.py"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a5a6c1983f13c85bf378c6bee79bb40585e131f4c979b2826dd5997683b4829"}},{"ruleId":"D2","level":"warning","message":{"text":"run_app.run_app (cognitive 26): run_app.run_app has cognitive complexity 26 (threshold 15). Drivers by points: if/else 10 (15 pts), loops 4 (6 pts), ternaries 1 (3 pts), boolean chains 1, error handling 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":"invokeai/app/run_app.py"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"8648ea10629983246bec0bcf48cad747787fece1b82a9c698fe6fe69978db5d6"}},{"ruleId":"D2","level":"warning","message":{"text":"StreamBuffer._coerce_event (cognitive 26): StreamBuffer._coerce_event has cognitive complexity 26 (threshold 15). Drivers by points: if/else 14 (22 pts), boolean chains 3, 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":"invokeai/app/services/shared/execution_engine/primitives.py"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"915e7e6879245f51bf5253bd99e46eae062f58f02db49e401ac8afb30704d357"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._record_iterate_stream (cognitive 26): GraphExecutionState._record_iterate_stream has cognitive complexity 26 (threshold 15). Drivers by points: if/else 14 (22 pts), ternaries 2 (3 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1625}}}],"partialFingerprints":{"codehealthFindingId/v1":"22a1453d4356f965431391398b1f69a8a40cf07d0c05e7b51056e04c71afa8c8"}},{"ruleId":"D2","level":"warning","message":{"text":"Graph._resolve_collection_input_types (cognitive 26): Graph._resolve_collection_input_types has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (17 pts), loops 3 (7 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":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":1731}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6a36e0a1ab6564d6bd96e85d455a92dea5f6d56a2cc7cc7b3ad5c4d28c9bc0c"}},{"ruleId":"D2","level":"warning","message":{"text":"LQProjection2D.init_weights (cognitive 26): LQProjection2D.init_weights has cognitive complexity 26 (threshold 15). Drivers by points: if/else 11 (24 pts), loops 2 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/lq_projection_2d.py"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"181223f29477d5baf687633c1ea6a63f35ddf52a1ac9af126154e7713ce6339f"}},{"ruleId":"D2","level":"warning","message":{"text":"loaders.gguf_sd_loader (cognitive 26): loaders.gguf_sd_loader has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (17 pts), ternaries 2 (5 pts), boolean chains 2, loops 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":"invokeai/backend/quantization/gguf/loaders.py"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec5f0c740cabd65400a29a6f4b0f6f7c8161bc6cd80ba955fdad92f74cef9aaa"}},{"ruleId":"D2","level":"warning","message":{"text":"MultiDiffusionPipeline.multi_diffusion_denoise (cognitive 26): MultiDiffusionPipeline.multi_diffusion_denoise has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (23 pts), loops 2 (3 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":"invokeai/backend/stable_diffusion/multi_diffusion_pipeline.py"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c688deae1792ac8b1539a7d94fd8414ccd3d25c7a11bd63efc7e0b0cb2910fc"}},{"ruleId":"D2","level":"warning","message":{"text":"calibrate_flux2_working_memory.report_denoise (cognitive 26): calibrate_flux2_working_memory.report_denoise has cognitive complexity 26 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 5 (10 pts), ternaries 2 (3 pts), boolean chains 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":"scripts/calibrate_flux2_working_memory.py"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"420b6a930ae47f73b79aba6695d2ddca5367d70c4a73d24b405a6335a8432579"}},{"ruleId":"D2","level":"warning","message":{"text":"Picker.PickerSyncer (cognitive 26): Picker.PickerSyncer has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (21 pts), boolean chains 3, loops 1 (2 pts) (nesting depth added 13). None of this is in the body itself: all 26 points belong to 2 function literals inside it that branch (lines 687, 689). 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":"invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx"},"region":{"startLine":669}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6ff87595ce32d7d24d6453c577874e8b1eba465e2e95f56fe8d378275795070"}},{"ruleId":"D2","level":"warning","message":{"text":"ChangeBoardModal.ChangeBoardModal (cognitive 26): ChangeBoardModal.ChangeBoardModal has cognitive complexity 26 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 7, ternaries 4 (5 pts), loops 1 (2 pts) (nesting depth added 4). Most of this is not in the body itself: 1 of the 26 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 87, 59, 182, \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":"invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"341430cb671b5ee64a78f843d34ad930e7fb781849c66dec848030b892cda7fa"}},{"ruleId":"D2","level":"warning","message":{"text":"pressure.appendPressureStrokeRenderOpsToCanvas (cognitive 26): pressure.appendPressureStrokeRenderOpsToCanvas has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (18 pts), loops 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/pressure.ts"},"region":{"startLine":491}}}],"partialFingerprints":{"codehealthFindingId/v1":"5aff690cc963c7a962af77649d1db2dd01b80311c8739d41f36ef2e22d5012ed"}},{"ruleId":"D2","level":"warning","message":{"text":"buildAnimaGraph.buildAnimaGraph (cognitive 26): buildAnimaGraph.buildAnimaGraph has cognitive complexity 26 (threshold 15). Drivers by points: if/else 16 (18 pts), boolean chains 6, ternaries 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"73b81d62931d838d52f7f7ade0a869b8ca638f329fe1e71ac690d68333a2ec9a"}},{"ruleId":"D2","level":"warning","message":{"text":"parseSchema.parseSchema (cognitive 26): parseSchema.parseSchema has cognitive complexity 26 (threshold 15). Drivers by points: if/else 14, ternaries 6 (8 pts), boolean chains 2, error handling 2 (nesting depth added 2). None of this is in the body itself: all 26 points belong to 5 function literals inside it that branch (lines 120, 200, 108, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/schema/parseSchema.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"12f3bcef8a9b75241434f142c652864de6fb9a4a1c03687268f8bf7195c094a0"}},{"ruleId":"D2","level":"warning","message":{"text":"validateWorkflow.refreshCallSavedWorkflowDynamicInputs (cognitive 26): validateWorkflow.refreshCallSavedWorkflowDynamicInputs has cognitive complexity 26 (threshold 15). Drivers by points: if/else 6 (15 pts), loops 3 (5 pts), boolean chains 4, error handling 1 (2 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":"invokeai/frontend/webv1/src/features/nodes/util/workflow/validateWorkflow.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"74923695b6c62cedf64b778f877ece54d9bdf3ab8bf604d6024c31f6c820a78d"}},{"ruleId":"D2","level":"warning","message":{"text":"tsSourceAnalysis.collectModuleReferences::visit (cognitive 26): tsSourceAnalysis.collectModuleReferences::visit has cognitive complexity 26 (threshold 15). Drivers by points: if/else 7 (9 pts), ternaries 4 (9 pts), boolean chains 8 (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":"invokeai/frontend/webv2/src/architecture/tsSourceAnalysis.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"a664622a83ec7418198bd2d87e43c814736cf975334860056bff12795f2fda47"}},{"ruleId":"D2","level":"warning","message":{"text":"dependencyPolicy.checkDependency (cognitive 26): dependencyPolicy.checkDependency has cognitive complexity 26 (threshold 15). Drivers by points: if/else 13 (15 pts), boolean chains 11 (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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/architecture/dependencyPolicy.ts"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"3be66d43ef363a1b1946c94b667d52e95ee103d7c3c0fcd136c442d227ba4ca4"}},{"ruleId":"D2","level":"warning","message":{"text":"react.createDeferredFontRuntime (cognitive 26): react.createDeferredFontRuntime has cognitive complexity 26 (threshold 15). Drivers by points: if/else 17 (18 pts), loops 4, boolean chains 2, ternaries 2 (nesting depth added 1). None of this is in the body itself: all 26 points belong to 13 function items inside it that branch (a function literal at line 107, a function literal at line 132, a function literal at line 156, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/fonts/react.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8ce3533117a6d90fd5501b7304b36b47cc4c7ceaf10d627e4eff771057f1472"}},{"ruleId":"D2","level":"warning","message":{"text":"galleryGridLayout.buildSparseGalleryNavigationEntries (cognitive 26): galleryGridLayout.buildSparseGalleryNavigationEntries has cognitive complexity 26 (threshold 15). Drivers by points: ternaries 5 (14 pts), boolean chains 4, if/else 3 (4 pts), loops 3 (4 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":"invokeai/frontend/webv2/src/features/gallery/ui/galleryGridLayout.ts"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"21d54073ee8dc55333454d846a124f5b207d67e19ed107e50d5f3aa892ad5708"}},{"ruleId":"D2","level":"warning","message":{"text":"PromptParser.parseQuotedPromptFunction (cognitive 26): PromptParser.parseQuotedPromptFunction has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (16 pts), boolean chains 5, loops 3 (5 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":"invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"236106f5f7745b43dc27baee3d14c9aa85600961eb11e8bf0de0f8747e569255"}},{"ruleId":"D2","level":"warning","message":{"text":"WildcardsPanel.WildcardsPanel (cognitive 26): WildcardsPanel.WildcardsPanel has cognitive complexity 26 (threshold 15). Drivers by points: ternaries 10 (16 pts), if/else 5, boolean chains 3, error handling 2 (nesting depth added 6). Of this number, 18 points are the body\u0027s own statements and 8 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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardsPanel.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"03c32c9e2ca5fd457fc94d7ed96d8083d5df15e37a4320a8e5a908836fa4b5ee"}},{"ruleId":"D2","level":"warning","message":{"text":"settings.isVideoSettings (cognitive 26): settings.isVideoSettings has cognitive complexity 26 (threshold 15). Drivers by points: boolean chains 25, if/else 1. 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":"invokeai/frontend/webv2/src/features/video/core/settings.ts"},"region":{"startLine":446}}}],"partialFingerprints":{"codehealthFindingId/v1":"61dd8c18c35809872bdcaddd3404d18fb38ed464fa697571e0617985c8a5d683"}},{"ruleId":"D2","level":"warning","message":{"text":"shortcutHints.getCanvasShortcutHints (cognitive 26): shortcutHints.getCanvasShortcutHints has cognitive complexity 26 (threshold 15). Drivers by points: if/else 12, ternaries 4 (8 pts), boolean chains 6 (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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/shortcutHints.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d79e661059721eb14f24ffc176e8923c0e540c44a11a6ff3a44aec96d60d833"}},{"ruleId":"D2","level":"warning","message":{"text":"documentModel.createDocumentModel::prepareReorder (cognitive 26): documentModel.createDocumentModel::prepareReorder has cognitive complexity 26 (threshold 15). Drivers by points: if/else 12 (24 pts), loops 1, ternaries 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. This shape REPEATS in the file: 3 other methods here (documentModel.createDocumentModel::prepareInsert, documentModel.createDocumentModel::checkReparent, documentModel.createDocumentModel::preparePatchConfigBatch) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 4 times rather than 4 independent problems. Splitting this body alone leaves the other 3 exactly as they are. Where these are variations on one operation, the change that clears all 4 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts"},"region":{"startLine":734}}}],"partialFingerprints":{"codehealthFindingId/v1":"01b4dd5107d069aeb10fb4624e1db50683d8b7b6db13b05008ccf18b115813f2"}},{"ruleId":"D2","level":"warning","message":{"text":"workbenchState.assembleWorkbenchProject (cognitive 26): workbenchState.assembleWorkbenchProject has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (13 pts), boolean chains 6, ternaries 4 (5 pts), loops 2 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":1657}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb2043e5d2d5ee63c05f43c675e3127f9004255c4085e25144f481af6c1827b4"}},{"ruleId":"D2","level":"warning","message":{"text":"fontLoader.createFontLoader.ensureSource (cognitive 26): fontLoader.createFontLoader.ensureSource has cognitive complexity 26 (threshold 15). Drivers by points: if/else 7 (13 pts), ternaries 4 (9 pts), boolean chains 4 (nesting depth added 11). Of this number, 24 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/fontLoader.ts"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"64f8ef899b1336bfbf4668ac16941c5783861768678300c5d05968febdeec94b"}},{"ruleId":"D2","level":"warning","message":{"text":"DiagnosticsPanel.DiagnosticsPanel (cognitive 26): DiagnosticsPanel.DiagnosticsPanel has cognitive complexity 26 (threshold 15). Drivers by points: ternaries 11 (19 pts), if/else 4, boolean chains 2, error handling 1 (nesting depth added 8). Of this number, 13 points are the body\u0027s own statements and 13 belong to 9 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":"invokeai/frontend/webv2/src/workbench/diagnostics/DiagnosticsPanel.tsx"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"56f23033027204b45a7335de19d3d6778a2a98cb0a62fec56ed7a6a844ca7e74"}},{"ruleId":"D2","level":"warning","message":{"text":"exportProject.executeInvkExport (cognitive 26): exportProject.executeInvkExport has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (14 pts), boolean chains 5, ternaries 4, loops 1 (2 pts), error handling 1 (nesting depth added 6). Of this number, 14 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":"invokeai/frontend/webv2/src/workbench/projects/invk/exportProject.ts"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3bdd8e6eb6c03547c1b6d3080f0e0867dc207d5dd8bd54e166781f4adcabfb7"}},{"ruleId":"D2","level":"warning","message":{"text":"FLUXLoRACollectionLoader.invoke (cognitive 25): FLUXLoRACollectionLoader.invoke has cognitive complexity 25 (threshold 15). Drivers by points: if/else 10 (17 pts), ternaries 2 (4 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":"invokeai/app/invocations/flux/flux_lora_loader.py"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"3254b495ab42748c24338a3d6e4dd62dbc69e67772c2bd5d719cd997ccba1119"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExpertSwapper.get (cognitive 25): _ExpertSwapper.get has cognitive complexity 25 (threshold 15). Drivers by points: if/else 12 (17 pts), ternaries 4, boolean chains 2, error handling 1 (2 pts) (nesting depth added 6). 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":"invokeai/app/invocations/wan/wan_denoise.py"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa9fc56086de17fe777abe83dfa376fcb96cefa9f3a936f8c863ca5f19c4e9d7"}},{"ruleId":"D2","level":"warning","message":{"text":"DiskImageFileStorage.__iter_supported_paths (cognitive 25): DiskImageFileStorage.__iter_supported_paths has cognitive complexity 25 (threshold 15). Drivers by points: if/else 7 (18 pts), loops 3 (5 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":"invokeai/app/services/image_files/image_files_disk.py"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"059afbf1c6f7bcbb93f8957fcbbabb99a5b5485a2dc0529d200781074d4fcd3d"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelInstallService._multifile_download (cognitive 25): ModelInstallService._multifile_download has cognitive complexity 25 (threshold 15). Drivers by points: if/else 4 (9 pts), loops 4 (9 pts), error handling 1 (4 pts), ternaries 1 (2 pts), boolean chains 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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":2319}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce30009dd20d62265d0e8aab85b32ccb94887fd38a1d587763d4849bacffb700"}},{"ruleId":"D2","level":"warning","message":{"text":"_IfActivationController._branch_sources (cognitive 25): _IfActivationController._branch_sources has cognitive complexity 25 (threshold 15). Drivers by points: if/else 6 (11 pts), loops 5 (8 pts), boolean chains 6 (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":"invokeai/app/services/shared/graph_if_activation.py"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b275cb9b0fd53607a0e2fc6fc2618cdb3c8d2cdf774f4d6a0700c0cde8381f1"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_loop_topology._recognize_nested_iterate_body (cognitive 25): graph_loop_topology._recognize_nested_iterate_body has cognitive complexity 25 (threshold 15). Drivers by points: if/else 14 (17 pts), boolean chains 7, loops 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_loop_topology.py"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad55332ddcf9903d627199f71b0d4542d5f9ebba207089e0493ec419fed65c0b"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_loop_topology._recognize_nested_iterate_chain (cognitive 25): graph_loop_topology._recognize_nested_iterate_chain has cognitive complexity 25 (threshold 15). Drivers by points: if/else 17, boolean chains 8. 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":"invokeai/app/services/shared/graph_loop_topology.py"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4e5d2de8339f852314d1809900573ca3c85d0afcdb459f12fafb785b162d7b2"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_nested_iterate_planner._prepare_serial_nested_iterate_chain_for_outer (cognitive 25): graph_nested_iterate_planner._prepare_serial_nested_iterate_chain_for_outer has cognitive complexity 25 (threshold 15). Drivers by points: if/else 12 (20 pts), loops 3 (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":"invokeai/app/services/shared/graph_nested_iterate_planner.py"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa1cb43362a2f6dab9fe8f677ad421ee826f83dd1568161d8fe95c8d3e1a9da8"}},{"ruleId":"D2","level":"warning","message":{"text":"Main_Diffusers_LTX2_Config.from_model_on_disk (cognitive 25): Main_Diffusers_LTX2_Config.from_model_on_disk has cognitive complexity 25 (threshold 15). Drivers by points: if/else 11 (15 pts), boolean chains 5, loops 2 (3 pts), ternaries 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":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":1960}}}],"partialFingerprints":{"codehealthFindingId/v1":"c24f799f2f04952c0fdad875624917ea6a65a5d8892188c872ad9eea803291cf"}},{"ruleId":"D2","level":"warning","message":{"text":"flux2_state_dict_utils.convert_flux2_vae_bfl_to_diffusers (cognitive 25): flux2_state_dict_utils.convert_flux2_vae_bfl_to_diffusers has cognitive complexity 25 (threshold 15). Drivers by points: if/else 12 (24 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":"invokeai/backend/model_manager/load/model_loaders/flux2_state_dict_utils.py"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f1288ec017e4747f7a56b941436238b77d68e58c3dc943e458468cd58954ac3"}},{"ruleId":"D2","level":"warning","message":{"text":"GenericDiffusersLoader.get_hf_load_class (cognitive 25): GenericDiffusersLoader.get_hf_load_class has cognitive complexity 25 (threshold 15). Drivers by points: if/else 10 (19 pts), boolean chains 6 (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":"invokeai/backend/model_manager/load/model_loaders/generic_diffusers.py"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"b332a3f2c0e3fe44d773a98dd0ee97142ed8f9c41e1e8b9e5d5abb503ba3db01"}},{"ruleId":"D2","level":"warning","message":{"text":"LoRALoader._load_model (cognitive 25): LoRALoader._load_model has cognitive complexity 25 (threshold 15). Drivers by points: if/else 15 (24 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":"invokeai/backend/model_manager/load/model_loaders/lora.py"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"457326b3e1a0e06a511ab389bdd095d45d66d2d90557d776acc547d9e537136f"}},{"ruleId":"D2","level":"warning","message":{"text":"ggml_tensor.dequantize_and_run (cognitive 25): ggml_tensor.dequantize_and_run has cognitive complexity 25 (threshold 15). Drivers by points: if/else 7 (16 pts), boolean chains 6, loops 2 (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":"invokeai/backend/quantization/gguf/ggml_tensor.py"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"db06343fbb4b1bb2f9f66e18799cf7df7590ce7e610e8395d03ee597fb3f6252"}},{"ruleId":"D2","level":"warning","message":{"text":"calibrate_flux2_working_memory.main (cognitive 25): calibrate_flux2_working_memory.main has cognitive complexity 25 (threshold 15). Drivers by points: if/else 11 (15 pts), loops 2 (5 pts), ternaries 1 (3 pts), boolean chains 2 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/calibrate_flux2_working_memory.py"},"region":{"startLine":595}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3856147f6625b0dc9b91d8c312026ce9bd8b43dc66e61fdde0ec543e3e35a33"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowFormPreview.WorkflowFormPreview (cognitive 25): WorkflowFormPreview.WorkflowFormPreview has cognitive complexity 25 (threshold 15). Drivers by points: if/else 14 (19 pts), boolean chains 5, loops 1 (nesting depth added 5). 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 112, 93, 102). 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"25549472fda21f6e7ebc4ab8ba58aa7b41b34bd9dbcf8170271cfcb09a8ac77b"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryImageGridPaged.GalleryImageGridPaged (cognitive 25): GalleryImageGridPaged.GalleryImageGridPaged has cognitive complexity 25 (threshold 15). Drivers by points: if/else 18 (19 pts), boolean chains 6 (nesting depth added 1). Most of this is not in the body itself: 2 of the 25 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 36, 84, 67, \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":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGridPaged.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c8903b4318fd577d3a954bab21e073d761aeb8727e2d9bee977bf3215fee98a"}},{"ruleId":"D2","level":"warning","message":{"text":"RelatedModels.RelatedModels (cognitive 25): RelatedModels.RelatedModels has cognitive complexity 25 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 7, loops 3 (4 pts), ternaries 2 (nesting depth added 4). Most of this is not in the body itself: 4 of the 25 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 220, 246, 141, \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/RelatedModels.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"39de28a7c8a4abd76db7a4ae5e35eeda6a8b0de3897feea0f9b8059f60063d7b"}},{"ruleId":"D2","level":"warning","message":{"text":"fieldValidators.validateNumberFieldCollectionValue (cognitive 25): fieldValidators.validateNumberFieldCollectionValue has cognitive complexity 25 (threshold 15). Drivers by points: if/else 9 (16 pts), boolean chains 8, 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":"invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"48bec4ca9aa824f3859e124218ab7c726b7f9b8556d7e11cd1a06bec663cbb4f"}},{"ruleId":"D2","level":"warning","message":{"text":"run-project-file-journey.executeProjectFileJourney (cognitive 25): run-project-file-journey.executeProjectFileJourney has cognitive complexity 25 (threshold 15). Drivers by points: if/else 13 (15 pts), error handling 4, boolean chains 3, ternaries 2 (3 pts) (nesting depth added 3). Most of this is not in the body itself: 5 of the 25 points are its own statements and the rest belongs to 9 function items inside it that branch (stopPreview, a function literal at line 970, fail, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/run-project-file-journey.mjs"},"region":{"startLine":902}}}],"partialFingerprints":{"codehealthFindingId/v1":"37d571840fe1186a4b48f3b94183d033d1263a6174ed694a64a1ac4b75dc861d"}},{"ruleId":"D2","level":"warning","message":{"text":"backend.moveGalleryVideoItemsToBoard (cognitive 25): backend.moveGalleryVideoItemsToBoard has cognitive complexity 25 (threshold 15). Drivers by points: if/else 9 (17 pts), boolean chains 3, error handling 1 (2 pts), loops 2, ternaries 1 (nesting depth added 9). Most of this is not in the body itself: 8 of the 25 points are its own statements and the rest belongs to 2 function items inside it that branch (worker, claimNextVideo). 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":"invokeai/frontend/webv2/src/features/gallery/data/backend.ts"},"region":{"startLine":1415}}}],"partialFingerprints":{"codehealthFindingId/v1":"84bde55061b36f803b677b689cabed3b0e8b68d6dfb332b92fdf3982a2859622"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryBoardMenu.GalleryBoardMenu (cognitive 25): GalleryBoardMenu.GalleryBoardMenu has cognitive complexity 25 (threshold 15). Drivers by points: boolean chains 14, if/else 9, ternaries 2. Of this number, 14 points are the body\u0027s own statements and 11 belong to 10 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7a9ba43207900c6656429905e1bab35fec8081578f15cc2c8956428d03df24a"}},{"ruleId":"D2","level":"warning","message":{"text":"attention.adjustNodes (cognitive 25): attention.adjustNodes has cognitive complexity 25 (threshold 15). Drivers by points: if/else 8 (16 pts), ternaries 2 (5 pts), boolean chains 3, loops 1 (nesting depth added 11). Of this number, 19 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":"invokeai/frontend/webv2/src/features/generation/core/prompt/attention.ts"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"cabff93536539652172ab28702ec15792d4833ad7e8cf96d5e9f701ac54858e8"}},{"ruleId":"D2","level":"warning","message":{"text":"videoPolicies.getVideoComponentSectionPolicy (cognitive 25): videoPolicies.getVideoComponentSectionPolicy has cognitive complexity 25 (threshold 15). Drivers by points: boolean chains 10, ternaries 5 (9 pts), if/else 5 (6 pts) (nesting depth added 5). Of this number, 18 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":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":1508}}}],"partialFingerprints":{"codehealthFindingId/v1":"e957c5d799dbf5e16cbf3137d1239092f0f8c39f66846d4b69ee5919e2bc4263"}},{"ruleId":"D2","level":"warning","message":{"text":"connectors.resolveLoopLinkagePath (cognitive 25): connectors.resolveLoopLinkagePath has cognitive complexity 25 (threshold 15). Drivers by points: if/else 9 (17 pts), boolean chains 7, loops 1 (nesting depth added 8). Of this number, 24 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":"invokeai/frontend/webv2/src/features/workflow/core/connectors.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf3751f2ec61872413a7f9faa5eb532ca34d65deb59ac0fdf3d26a8e21e56330"}},{"ruleId":"D2","level":"warning","message":{"text":"batch.readProperty (cognitive 25): batch.readProperty has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 8 (18 pts), boolean chains 5, if/else 1, match/switch 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":"invokeai/frontend/webv2/src/features/workflow/core/batch.ts"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3b83d489271be5be7e75f59ca1c9017f13b6bf216707dac1ee3a2755490bb6e"}},{"ruleId":"D2","level":"warning","message":{"text":"templates.buildInputTemplate (cognitive 25): templates.buildInputTemplate has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 13 (17 pts), boolean chains 8 (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":"invokeai/frontend/webv2/src/features/workflow/data/templates.ts"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"9568d0853908acd888607351e2175539ee9553b19cb1ee248b767437883ad2e4"}},{"ruleId":"D2","level":"warning","message":{"text":"GeneratorFieldInput.GeneratorFieldInput (cognitive 25): GeneratorFieldInput.GeneratorFieldInput has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 9, boolean chains 8, if/else 7 (8 pts) (nesting depth added 1). Of this number, 16 points are the body\u0027s own statements and 9 belong to 5 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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"2239c35de6213b0c602a1e56a6522a901973795b20ecbca92333044f2b8f2eff"}},{"ruleId":"D2","level":"warning","message":{"text":"layerPanelState.reconcileLayerPanelState (cognitive 25): layerPanelState.reconcileLayerPanelState has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 8 (12 pts), boolean chains 8, if/else 4 (5 pts) (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/layerPanelState.ts"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"2297f5e7004b097aa535c095f8c88ee0cfb2af2c91080646be05db7299804e6b"}},{"ruleId":"D2","level":"warning","message":{"text":"durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject::pushHalves (cognitive 25): durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject::pushHalves has cognitive complexity 25 (threshold 15). Drivers by points: if/else 12 (17 pts), boolean chains 4, ternaries 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. This shape REPEATS in the file: 5 other methods here (durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::adoptNewestDraft, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::stageProject, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject, \u2026) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 6 times rather than 6 independent problems. Splitting this body alone leaves the other 5 exactly as they are. Where these are variations on one operation, the change that clears all 6 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":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":1431}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccd37e597ef4fcd8115f5c8b7febb8add157323bc65c275f77afb804a75bfc61"}},{"ruleId":"D2","level":"warning","message":{"text":"imageMapStore.refreshImageIndexStatus (cognitive 25): imageMapStore.refreshImageIndexStatus has cognitive complexity 25 (threshold 15). Drivers by points: boolean chains 10, if/else 7 (10 pts), ternaries 2 (5 pts) (nesting depth added 6). Most of this is not in the body itself: 1 of the 25 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 437, 496). 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":"invokeai/frontend/webv2/src/workbench/image-map/imageMapStore.ts"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cff6981019240f5a2ec0aa5fc452778fd88d7e414c0155b9ab859d80fc3be04"}},{"ruleId":"D2","level":"warning","message":{"text":"useCommandPaletteController.useCommandPaletteController (cognitive 25): useCommandPaletteController.useCommandPaletteController has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 11 (19 pts), boolean chains 6 (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":"invokeai/frontend/webv2/src/workbench/palette/useCommandPaletteController.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"1326d661cb16b4aeaaf224d6daa910c72c6e6fdd9fd08dafaf026ceb26395757"}},{"ruleId":"D2","level":"warning","message":{"text":"GenerationDevicesSettings.GenerationDevicesSettings (cognitive 25): GenerationDevicesSettings.GenerationDevicesSettings has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 11 (16 pts), if/else 5, boolean chains 3, error handling 1 (nesting depth added 5). Of this number, 17 points are the body\u0027s own statements and 8 belong to 5 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/GenerationDevicesSettings.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc0b907fe1598a93db985883f4725ea98cb37f05d59d9314c239d08cf24c3f50"}},{"ruleId":"D2","level":"warning","message":{"text":"QueueCluster.QueueCluster (cognitive 25): QueueCluster.QueueCluster has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 10 (14 pts), boolean chains 7, if/else 3 (4 pts) (nesting depth added 5). 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, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/shell/topbar/QueueCluster.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f005ebe0cfe20184627ae37b8eb7a9bc850962ec933642b1cedc4dee883bc47"}},{"ruleId":"D2","level":"warning","message":{"text":"WidgetInstanceContextMenu.WidgetInstanceContextMenu (cognitive 25): WidgetInstanceContextMenu.WidgetInstanceContextMenu has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 10 (18 pts), if/else 4, boolean chains 3 (nesting depth added 8). Of this number, 17 points are the body\u0027s own statements and 8 belong to 5 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":"invokeai/frontend/webv2/src/workbench/widget-frame/WidgetInstanceContextMenu.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1e3180fc01ae4867038324bb49975dd503bd112d0cbea3710886ec3ff7abd71"}},{"ruleId":"D2","level":"warning","message":{"text":"SocketIO._handle_connect (cognitive 24): SocketIO._handle_connect has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (18 pts), error handling 1 (4 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":"invokeai/app/api/sockets.py"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad980676c0027074015a2fd62477b024ba7874999c766b930479ab3ab95880db"}},{"ruleId":"D2","level":"warning","message":{"text":"MetadataToLorasInvocation.invoke (cognitive 24): MetadataToLorasInvocation.invoke has cognitive complexity 24 (threshold 15). Drivers by points: if/else 11 (22 pts), loops 1, ternaries 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":"invokeai/app/invocations/metadata_linked.py"},"region":{"startLine":999}}}],"partialFingerprints":{"codehealthFindingId/v1":"354dee525b719856bb6a860f93dff298fdbb4fdedfbb1ac7bd660d8e314c0fed"}},{"ruleId":"D2","level":"warning","message":{"text":"FontService._rescan_directory (cognitive 24): FontService._rescan_directory has cognitive complexity 24 (threshold 15). Drivers by points: if/else 11 (17 pts), boolean chains 4, error handling 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":"invokeai/app/services/fonts/fonts_default.py"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"eebc8feafd1243729aa7645151a5c8139ee8f8100f587f515c739616e81b1dd2"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultSessionRunner._run_session_loop (cognitive 24): DefaultSessionRunner._run_session_loop has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (18 pts), boolean chains 3, error handling 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":"invokeai/app/services/session_processor/session_processor_default.py"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"65ef7715969357977443e7c7f99dcc168676aac32218d346e79c0b1f6bc96ccc"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._coerce_execution_ref (cognitive 24): GraphExecutionState._coerce_execution_ref has cognitive complexity 24 (threshold 15). Drivers by points: if/else 16 (18 pts), boolean chains 6 (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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":2310}}}],"partialFingerprints":{"codehealthFindingId/v1":"d28d6fd9886686059427292d26a39e01aa185144588d67608f00aba7f2d64f4e"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState.complete (cognitive 24): GraphExecutionState.complete has cognitive complexity 24 (threshold 15). Drivers by points: if/else 6 (12 pts), error handling 2 (7 pts), boolean chains 3, ternaries 1 (2 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":3990}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d5f4bde4edb76ec4d8c51e27911ddecb14f76386e7ab7776d243dc584c4ed8c"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionRuntime._build_collect_collection (cognitive 24): _ExecutionRuntime._build_collect_collection has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (13 pts), ternaries 4 (7 pts), boolean chains 2, loops 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":"invokeai/app/services/shared/graph_execution_runtime.py"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"11206f7d0c4ea088760bacf80144d552842f26c2cb361d5b2396551d1a37956d"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_iterate_planner._get_direct_iterate_collect_fan_in (cognitive 24): graph_iterate_planner._get_direct_iterate_collect_fan_in has cognitive complexity 24 (threshold 15). Drivers by points: if/else 10 (16 pts), boolean chains 7, 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":"invokeai/app/services/shared/graph_iterate_planner.py"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"249fa12ddbad459a69f8e25b49f75e7d3bb51d09839c64c666036d674abdb5fb"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionNodeBuilder._expand_root_if_for_completed_collect_branch (cognitive 24): _ExecutionNodeBuilder._expand_root_if_for_completed_collect_branch has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (18 pts), boolean chains 5, 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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":2170}}}],"partialFingerprints":{"codehealthFindingId/v1":"abfe6b989d909bc293426ca4b657e67e47917a78dcbed41a2d77e4f4eefa47f6"}},{"ruleId":"D2","level":"warning","message":{"text":"VideoService.create (cognitive 24): VideoService.create has cognitive complexity 24 (threshold 15). Drivers by points: error handling 6 (12 pts), if/else 7 (10 pts), boolean chains 2 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/videos/videos_default.py"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bcf94bd2e31e4a0538d7f19b31089ddb770a9ab97df260b775b7da8efc70141"}},{"ruleId":"D2","level":"warning","message":{"text":"CachedModelWithPartialLoad.partial_load_to_vram_chunk (cognitive 24): CachedModelWithPartialLoad.partial_load_to_vram_chunk has cognitive complexity 24 (threshold 15). Drivers by points: if/else 12 (18 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":"invokeai/backend/model_manager/load/model_cache/cached_model/cached_model_with_partial_load.py"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5414dac96e193759f0698d805584da7efc9e8d4f8f1991eaeb8d77a017aa571"}},{"ruleId":"D2","level":"warning","message":{"text":"model_util.read_checkpoint_meta (cognitive 24): model_util.read_checkpoint_meta has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (20 pts), error handling 1 (2 pts), ternaries 1 (2 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":"invokeai/backend/model_manager/util/model_util.py"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"82ffc5cf4775520b90acceee03a07abdf2d90369477ff1c2742bd675b5ef731c"}},{"ruleId":"D2","level":"warning","message":{"text":"nvfp4._find_nvfp4_layers (cognitive 24): nvfp4._find_nvfp4_layers has cognitive complexity 24 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 8, error handling 1 (2 pts), loops 2 (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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/nvfp4.py"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"70378a81699bb73487c8e133a4f23617298b346a7987a5d7711f2d653c23dc45"}},{"ruleId":"D2","level":"warning","message":{"text":"attention._chunked_sdpa (cognitive 24): attention._chunked_sdpa has cognitive complexity 24 (threshold 15). Drivers by points: if/else 6 (10 pts), ternaries 3 (7 pts), loops 2 (4 pts), boolean chains 3 (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":"invokeai/backend/util/attention.py"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"124f5ebd663aa06c95d3c1be543ec05eb53774ec285af5f409d7bc52be0cb027"}},{"ruleId":"D2","level":"warning","message":{"text":"typegen.generateTypes (cognitive 24): typegen.generateTypes has cognitive complexity 24 (threshold 15). Drivers by points: if/else 6 (14 pts), boolean chains 5, loops 1 (3 pts), ternaries 1 (2 pts) (nesting depth added 11). Of this number, 17 points are the body\u0027s own statements and 7 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":"invokeai/frontend/api/scripts/typegen.js"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"424b7eb1df2fdd13943eb26c8c9d3a578c95cf6e83b812195dde765f4c03fbfa"}},{"ruleId":"D2","level":"warning","message":{"text":"AdministratorSetup.AdministratorSetup (cognitive 24): AdministratorSetup.AdministratorSetup has cognitive complexity 24 (threshold 15). Drivers by points: boolean chains 12, ternaries 4 (6 pts), if/else 5, error handling 1 (nesting depth added 2). Of this number, 18 points are the body\u0027s own statements and 6 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"e12736c3b13943d9fdd31755e494591652acc9566f6fcc4380d2244c7dc147ba"}},{"ruleId":"D2","level":"warning","message":{"text":"SyncModelsDialog.SyncModelsDialog (cognitive 24): SyncModelsDialog.SyncModelsDialog has cognitive complexity 24 (threshold 15). Drivers by points: if/else 16, boolean chains 4, ternaries 3, error handling 1. Most of this is not in the body itself: 5 of the 24 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 80, 111, 142, \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/SyncModelsDialog.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"3930aa74df960e640b341d470ca2877cebc6177280a356755b3333962735afb2"}},{"ruleId":"D2","level":"warning","message":{"text":"UpscaleTabAdvancedSettingsAccordion.UpscaleTabAdvancedSettingsAccordion (cognitive 24): UpscaleTabAdvancedSettingsAccordion.UpscaleTabAdvancedSettingsAccordion has cognitive complexity 24 (threshold 15). Drivers by points: if/else 11 (21 pts), boolean chains 2, ternaries 1 (nesting depth added 10). Most of this is not in the body itself: 2 of the 24 points are its own statements and the rest belongs to one function literal inside it that branches (line 26). 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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"21a953ee6c0f362c3f636ef01004bd6af79908af9b6089230a5d486522b53d8f"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryPickerGrid.GalleryPickerGrid (cognitive 24): GalleryPickerGrid.GalleryPickerGrid has cognitive complexity 24 (threshold 15). Drivers by points: boolean chains 10, if/else 8, ternaries 6. Most of this is not in the body itself: 6 of the 24 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 386, 281, 332, \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":"invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerGrid.tsx"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"94d0b3681f4904c1bfa9e929e853b86c5028df066c9003720f6ba1fa245b5d12"}},{"ruleId":"D2","level":"warning","message":{"text":"PositivePromptActions.ExpandPromptButton (cognitive 24): PositivePromptActions.ExpandPromptButton has cognitive complexity 24 (threshold 15). Drivers by points: ternaries 10 (13 pts), boolean chains 8, if/else 2, error handling 1 (nesting depth added 3). Of this number, 17 points are the body\u0027s own statements and 7 belong to 3 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0919f79561a4df937e793451c7a0e64188ab98a37dd57a20a977d26d13417b3"}},{"ruleId":"D2","level":"warning","message":{"text":"graph.buildQwenImageGraph (cognitive 24): graph.buildQwenImageGraph has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (13 pts), ternaries 6, boolean chains 3, loops 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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":963}}}],"partialFingerprints":{"codehealthFindingId/v1":"2004813b7ba9bee532147a2a60e1b0e932aa5f00add433b4dfa74f520fa24acf"}},{"ruleId":"D2","level":"warning","message":{"text":"WildcardTransferActions.WildcardTransferActions (cognitive 24): WildcardTransferActions.WildcardTransferActions has cognitive complexity 24 (threshold 15). Drivers by points: ternaries 7 (10 pts), if/else 6 (9 pts), error handling 3, boolean chains 2 (nesting depth added 6). Most of this is not in the body itself: 2 of the 24 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 62, 102, 140, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardTransferActions.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"22ca08ee2cb76852292e1d1c94843b2e4d090f41662fba1186a72729d7984a3a"}},{"ruleId":"D2","level":"warning","message":{"text":"ClearDialog.ClearDialog (cognitive 24): ClearDialog.ClearDialog has cognitive complexity 24 (threshold 15). Drivers by points: ternaries 11 (13 pts), boolean chains 10, if/else 1 (nesting depth added 2). Of this number, 21 points are the body\u0027s own statements and 3 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/intermediates/ui/ClearDialog.tsx"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"9244e2dd22ca9892712c5d841e52fd2331fffb75de7c3177913e9db1ebededc4"}},{"ruleId":"D2","level":"warning","message":{"text":"ExternalProviderKeyCards.ExternalProviderKeyCard (cognitive 24): ExternalProviderKeyCards.ExternalProviderKeyCard has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (10 pts), boolean chains 8, ternaries 6 (nesting depth added 1). Most of this is not in the body itself: 9 of the 24 points are its own statements and the rest belongs to 6 function items inside it that branch (handleSave, a function literal at line 127, a function literal at line 186, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/credentials/ExternalProviderKeyCards.tsx"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"59afc08db44185c6e5fbda40620b0ce6b02f5ff7f536544bae4c7f3b926f92d1"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultSettingsSection.FieldControl (cognitive 24): DefaultSettingsSection.FieldControl has cognitive complexity 24 (threshold 15). Drivers by points: ternaries 7 (12 pts), if/else 6 (8 pts), boolean chains 4 (nesting depth added 7). Of this number, 15 points are the body\u0027s own statements and 9 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":"invokeai/frontend/webv2/src/features/models/ui/detail/DefaultSettingsSection.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"14c6abc17640e7eacf4d3d0c2065aa9750c5fafbae4e77ec5e20829ac751e67c"}},{"ruleId":"D2","level":"warning","message":{"text":"runtime.createQueueRuntime.handleUnadoptedRerunSettled (cognitive 24): runtime.createQueueRuntime.handleUnadoptedRerunSettled has cognitive complexity 24 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 7, ternaries 4 (5 pts) (nesting depth added 3). Of this number, 12 points are the body\u0027s own statements and 12 belong to 4 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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":1672}}}],"partialFingerprints":{"codehealthFindingId/v1":"41455dd25e396888f424ebc6207f65ca3de03414068d0a07737445d52dcae496"}},{"ruleId":"D2","level":"warning","message":{"text":"callSavedWorkflow.syncCallSavedWorkflowFields (cognitive 24): callSavedWorkflow.syncCallSavedWorkflowFields has cognitive complexity 24 (threshold 15). Drivers by points: boolean chains 12, ternaries 4 (7 pts), if/else 2 (3 pts), loops 2 (nesting depth added 4). Of this number, 23 points are the body\u0027s own statements and 1 belongs 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":"invokeai/frontend/webv2/src/features/workflow/core/callSavedWorkflow.ts"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"148c2a850f1a1fd0e948f95d0553af5651107dcaed028fb4d441090de60d89c4"}},{"ruleId":"D2","level":"warning","message":{"text":"workflowJson.parseForm (cognitive 24): workflowJson.parseForm has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (15 pts), loops 3 (6 pts), ternaries 1 (2 pts), boolean chains 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/workflowJson.ts"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee5eb6f6254ddfccc89046f363ee14f069ae33c5d83c42900fb1d961c3560b5e"}},{"ruleId":"D2","level":"warning","message":{"text":"assetTransport.createAssetResponseReader (cognitive 24): assetTransport.createAssetResponseReader has cognitive complexity 24 (threshold 15). Drivers by points: if/else 12 (17 pts), loops 2 (3 pts), boolean chains 2, error handling 2 (nesting depth added 6). None of this is in the body itself: all 24 points belong to 4 function items inside it that branch (a function literal at line 140, refuseTooLarge, cancelReader, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/assetTransport.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"b36a6a25dd9c9a5b3a492c3117a71d49686de74275fa7aaed41df54b23dad3a2"}},{"ruleId":"D2","level":"warning","message":{"text":"ColorPane.ColorPane (cognitive 24): ColorPane.ColorPane has cognitive complexity 24 (threshold 15). Drivers by points: if/else 12 (14 pts), ternaries 8, boolean chains 2 (nesting depth added 2). Most of this is not in the body itself: 8 of the 24 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 127, 54, 111, \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/ColorPane.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce488cf17e4af011f46ffd06c159203935644a2207435be64112358a27c650f2"}},{"ruleId":"D2","level":"warning","message":{"text":"rasterComposite.renderRasterComposite (cognitive 24): rasterComposite.renderRasterComposite has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (17 pts), ternaries 2 (5 pts), boolean chains 1, loops 1 (nesting depth added 12). None of this is in the body itself: all 24 points belong to 2 function items inside it that branch (drawLayer, renderRange). 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterComposite.ts"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b46f92ef48307665000b9decc72c6f731a95eeaaf1f27eaa4a65784e07b6a4e"}},{"ruleId":"D2","level":"warning","message":{"text":"layerRasterizer.createLayerRasterizer.getOrStartLayerRasterization (cognitive 24): layerRasterizer.createLayerRasterizer.getOrStartLayerRasterization has cognitive complexity 24 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 6, error handling 2 (3 pts), ternaries 1 (nesting depth added 5). Most of this is not in the body itself: 11 of the 24 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 151, 120). 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/layerRasterizer.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"87a2655694bf18e11c191d690bc8e4cb68d7eb9947332767d92ad5fbb6e9919c"}},{"ruleId":"D2","level":"warning","message":{"text":"groupSurfaceCache.createGroupSurfaceCache.resolve (cognitive 24): groupSurfaceCache.createGroupSurfaceCache.resolve has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 6, ternaries 2 (5 pts), 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/groupSurfaceCache.ts"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1aba4a4073bb10410d0972070244afb968d148a054845d92a2efdb1db64ccb8"}},{"ruleId":"D2","level":"warning","message":{"text":"CommandPaletteDialog.CommandPaletteContent (cognitive 24): CommandPaletteDialog.CommandPaletteContent has cognitive complexity 24 (threshold 15). Drivers by points: ternaries 12 (13 pts), if/else 5 (6 pts), boolean chains 5 (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":"invokeai/frontend/webv2/src/workbench/palette/CommandPaletteDialog.tsx"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"420606248cd602610830a776dc66d4ec8d0f0da65e69b841cdc91ab4011becb7"}},{"ruleId":"D2","level":"warning","message":{"text":"queueRecallCache.createIndexedDbQueueRecallCache.put (cognitive 24): queueRecallCache.createIndexedDbQueueRecallCache.put has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 4, error handling 3, loops 2 (nesting depth added 6). Of this number, 23 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":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRecallCache.ts"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"20ecd146406b2ffa32aad49c1de30d1c37a12d471872f491983b3e1f22e1dfdf"}},{"ruleId":"D2","level":"warning","message":{"text":"image_map.search_image_map (cognitive 23): image_map.search_image_map has cognitive complexity 23 (threshold 15). Drivers by points: error handling 4 (11 pts), if/else 8 (10 pts), boolean chains 1, ternaries 1 (nesting depth added 9). 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":"invokeai/app/api/routers/image_map.py"},"region":{"startLine":617}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bc1f4647feb55f311b665d13bd1d48176586f02dbff646d526afe88175b3b29"}},{"ruleId":"D2","level":"warning","message":{"text":"InvokeImageBlendInvocation.prepare_tensors_from_images (cognitive 23): InvokeImageBlendInvocation.prepare_tensors_from_images has cognitive complexity 23 (threshold 15). Drivers by points: if/else 14, ternaries 4 (8 pts), boolean chains 1 (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":"invokeai/app/invocations/composition-nodes.py"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf9dada1e9dac8fd1593441fc53d6060e26b9267c57d69e6c3673116a799f18d"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultSessionRunner.run_node (cognitive 23): DefaultSessionRunner.run_node has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (13 pts), error handling 4 (5 pts), boolean chains 4, loops 1 (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":"invokeai/app/services/session_processor/session_processor_default.py"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ddbd9e6a0c0fefd78635c798b0bf31781cc26268fe73251681b292c909f9cfe"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._validate_persisted_activation_tokens (cognitive 23): GraphExecutionState._validate_persisted_activation_tokens has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (21 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":3636}}}],"partialFingerprints":{"codehealthFindingId/v1":"79d63c0e351d2fa4e3117c1ffa993d92948339569b3e920a95154f56af8aa0d7"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_if_runtime._get_edge_frame_axes (cognitive 23): graph_if_runtime._get_edge_frame_axes has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (19 pts), loops 2 (3 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":"invokeai/app/services/shared/graph_if_runtime.py"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a08f80085ffff7f001a80448cc1ce0f07c4e9c9fc92b66f342014ae466f8f86"}},{"ruleId":"D2","level":"warning","message":{"text":"workflow_graph_builder._resolve_for_connector_loop_linkage_path (cognitive 23): workflow_graph_builder._resolve_for_connector_loop_linkage_path has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (16 pts), boolean chains 6, 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":"invokeai/app/services/shared/workflow_graph_builder.py"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"7327a0910a28e47e163733169e8e283f24f902a98d5b3f5ec38e8b249feaf90a"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimaControlNetLLLite.from_state_dict (cognitive 23): AnimaControlNetLLLite.from_state_dict has cognitive complexity 23 (threshold 15). Drivers by points: if/else 11 (16 pts), boolean chains 4, loops 3 (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":"invokeai/backend/anima/control_net_lllite.py"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"88f25643c29c1e5cb8515e9be9eda8a2721dfa43d8aadc436123ab14368e8ba8"}},{"ruleId":"D2","level":"warning","message":{"text":"checkpoint_layout.classify_roles (cognitive 23): checkpoint_layout.classify_roles has cognitive complexity 23 (threshold 15). Drivers by points: if/else 13 (15 pts), ternaries 3 (5 pts), boolean chains 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":"invokeai/backend/ltx2/checkpoint_layout.py"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"3791152bf386f421ad532cb97d5005a35824c34a05b116f35ca3332c0e9770a3"}},{"ruleId":"D2","level":"warning","message":{"text":"pid_decoder._int8_sidecar_keys (cognitive 23): pid_decoder._int8_sidecar_keys has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (15 pts), boolean chains 4, error handling 2 (3 pts), 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":"invokeai/backend/model_manager/configs/pid_decoder.py"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f9c505764e80fc3ff0ea30cbcf30694fe1a0f0a8618fcb09b80c9e6be328488"}},{"ruleId":"D2","level":"warning","message":{"text":"Ideogram4CheckpointModel._load_model (cognitive 23): Ideogram4CheckpointModel._load_model has cognitive complexity 23 (threshold 15). Drivers by points: if/else 13 (18 pts), boolean chains 3, ternaries 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":"invokeai/backend/model_manager/load/model_loaders/ideogram4.py"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"e13aa551c6f1ef3ccfe3b74ebca8ea7f9666e6fc7d58c058741ddd19f81d2f28"}},{"ruleId":"D2","level":"warning","message":{"text":"loaders._get_original_shape (cognitive 23): loaders._get_original_shape has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (19 pts), boolean chains 4 (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":"invokeai/backend/quantization/sdnq/loaders.py"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"41ed19e3890e7b57a5644651a7c21113efcd1d26ed8259d4d3587df5b85435d4"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaImportProcessor.import_image (cognitive 23): MediaImportProcessor.import_image has cognitive complexity 23 (threshold 15). Drivers by points: if/else 16 (19 pts), boolean chains 2, ternaries 1 (2 pts) (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/install/import_images.py"},"region":{"startLine":569}}}],"partialFingerprints":{"codehealthFindingId/v1":"aed6907da5afedc73bfe5525c75e1f038b89bf4a8ac610e0765ae51bec55f5ef"}},{"ruleId":"D2","level":"warning","message":{"text":"Picker.useKeyboardNavigation (cognitive 23): Picker.useKeyboardNavigation has cognitive complexity 23 (threshold 15). Drivers by points: if/else 20 (23 pts) (nesting depth added 3). None of this is in the body itself: all 23 points belong to 4 function literals inside it that branch (lines 407, 438, 470, \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":"invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"c337eb607421369cb6bddc786fb6758594d643f9d962d54d73cab989f4ec33f3"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasToolModule.syncCursorStyle (cognitive 23): CanvasToolModule.syncCursorStyle has cognitive complexity 23 (threshold 15). Drivers by points: if/else 22 (23 pts) (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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"caa36a0d3de944100da790e0918f8a455acc737ebfda305446e1cdfadca059f7"}},{"ruleId":"D2","level":"warning","message":{"text":"worker.getImageDataBboxArrayBufferLike (cognitive 23): worker.getImageDataBboxArrayBufferLike has cognitive complexity 23 (threshold 15). Drivers by points: if/else 5 (19 pts), loops 2 (3 pts), ternaries 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/worker.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"148ce9ba3ef37bdfc02052d5a91ac3ee443f570bbb4d587b4170c0cf440f8369"}},{"ruleId":"D2","level":"warning","message":{"text":"validators.getGlobalReferenceImageWarnings (cognitive 23): validators.getGlobalReferenceImageWarnings has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (19 pts), boolean chains 4 (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":"invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"263fd3cfed13090039a00c53426095c9c3c44b4e6b54796062ae5d3ed8b9e92f"}},{"ruleId":"D2","level":"warning","message":{"text":"Flow.Flow (cognitive 23): Flow.Flow has cognitive complexity 23 (threshold 15). Drivers by points: if/else 15, boolean chains 5, ternaries 3. Most of this is not in the body itself: 2 of the 23 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 284, 342, 111, \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe2650fb6fcc1a50a243c0eb43888439c1a2a1a9d989ff9dbd4fa171421e5606"}},{"ruleId":"D2","level":"warning","message":{"text":"useNodeCopyPaste._pasteSelection (cognitive 23): useNodeCopyPaste._pasteSelection has cognitive complexity 23 (threshold 15). Drivers by points: if/else 13 (17 pts), boolean chains 3, ternaries 2, loops 1 (nesting depth added 4). Most of this is not in the body itself: 5 of the 23 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 122, 59, 87, \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":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeCopyPaste.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"b23ac30ff0b286a8b5e8351e63c209cdac9770b3b2d8da0ad06d2ca9ae1c25d4"}},{"ruleId":"D2","level":"warning","message":{"text":"PromptTriggerSelect.PromptTriggerSelect (cognitive 23): PromptTriggerSelect.PromptTriggerSelect has cognitive complexity 23 (threshold 15). Drivers by points: if/else 12 (17 pts), boolean chains 5, loops 1 (nesting depth added 5). None of this is in the body itself: all 23 points belong to 8 function literals inside it that branch (lines 67, 100, 35, \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":"invokeai/frontend/webv1/src/features/prompt/PromptTriggerSelect.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd1fdee198cdaf47748a998a6b1a1a51bed5f79f39b2b76fe4e31490cbf446ca"}},{"ruleId":"D2","level":"warning","message":{"text":"index.dynamicBaseQuery (cognitive 23): index.dynamicBaseQuery has cognitive complexity 23 (threshold 15). Drivers by points: boolean chains 14, if/else 6 (7 pts), ternaries 2 (nesting depth added 1). Of this number, 21 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":"invokeai/frontend/webv1/src/services/api/index.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b10ab1c86e135d5c12a147a0d0837a9e0ba8de5f4bb53c7e7f43297d91a8aaf"}},{"ruleId":"D2","level":"warning","message":{"text":"onModelInstallError.buildOnModelInstallError (cognitive 23): onModelInstallError.buildOnModelInstallError has cognitive complexity 23 (threshold 15). Drivers by points: if/else 15 (23 pts) (nesting depth added 8). None of this is in the body itself: all 23 points belong to 2 function literals inside it that branch (lines 55, 148). 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":"invokeai/frontend/webv1/src/services/events/onModelInstallError.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6325d2518abc82f4c43be04ab3c050b2271959c6559ed46fa4281e0da358514"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelSettingsMenuItems.ModelSettingsMenuItems (cognitive 23): ModelSettingsMenuItems.ModelSettingsMenuItems has cognitive complexity 23 (threshold 15). Drivers by points: if/else 14 (16 pts), error handling 2 (4 pts), boolean chains 2, ternaries 1 (nesting depth added 4). None of this is in the body itself: all 23 points belong to 3 function items inside it that branch (a function literal at line 59, handleExport, handleFileChange). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/detail/ModelSettingsMenuItems.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2abf8ff93b254e5d7cd73e0ea633ba8dd9358cc3b05ec9dddde5dd90331a88e"}},{"ruleId":"D2","level":"warning","message":{"text":"QueueItemRow.QueueItemRow (cognitive 23): QueueItemRow.QueueItemRow has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 13 (16 pts), boolean chains 5, if/else 2 (nesting depth added 3). Of this number, 20 points are the body\u0027s own statements and 3 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":"invokeai/frontend/webv2/src/features/queue/ui/QueueItemRow.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"eddc07d114dd571d52f0e0ec6e3ab1af644612338447ab166935c60d80641578"}},{"ruleId":"D2","level":"warning","message":{"text":"forLoops.validateForLoopGraph::supportsNestedIterateBody (cognitive 23): forLoops.validateForLoopGraph::supportsNestedIterateBody has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (13 pts), boolean chains 9, loops 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition. This shape REPEATS in the file: 2 other methods here (forLoops.validateForLoopGraph, forLoops.validateForLoopGraph::getSupportedNestedForBody) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 3 times rather than 3 independent problems. Splitting this body alone leaves the other 2 exactly as they are. Where these are variations on one operation, the change that clears all 3 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":"invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c0bec85911fed321abfa77ce9651c47e5eb41a38a6fdcb67e51295031ed5a32"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowSelectionRequestRuntime.WorkflowSelectionRequestRuntime (cognitive 23): WorkflowSelectionRequestRuntime.WorkflowSelectionRequestRuntime has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (11 pts), boolean chains 6, ternaries 5 (6 pts) (nesting depth added 2). None of this is in the body itself: all 23 points belong to 6 function items inside it that branch (a function literal at line 168, a function literal at line 146, a function literal at line 109, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowSelectionRequestRuntime.tsx"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"68e85c4c7596b1256d21a3bfd8c82e16d22aabca944b2200dbb683715408ce2c"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowFieldInput.MediaInput (cognitive 23): WorkflowFieldInput.MediaInput has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 15 (19 pts), boolean chains 3, if/else 1 (nesting depth added 4). Of this number, 21 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":964}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc33d29b34f41c23809138d4678f24cda561508554482c2086e0ccf8a5f2b21f"}},{"ruleId":"D2","level":"warning","message":{"text":"draftStore.isProjectDraftCandidate (cognitive 23): draftStore.isProjectDraftCandidate has cognitive complexity 23 (threshold 15). Drivers by points: boolean chains 20, if/else 3. 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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5ede21f05dba2ac719a06292e230c4b72aa6d044e6ceec057dd3aa4c57c6bdc"}},{"ruleId":"D2","level":"warning","message":{"text":"draftStore.createMemoryProjectDraftStore.reconcileUnloadJournal (cognitive 23): draftStore.createMemoryProjectDraftStore.reconcileUnloadJournal has cognitive complexity 23 (threshold 15). Drivers by points: if/else 5 (10 pts), ternaries 4 (10 pts), boolean chains 2, loops 1 (nesting depth added 11). Of this number, 22 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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":1244}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7215d9b0b229701b02d6986b51ae0460bd8af6546bfbbc9910fa3b9942b41e8"}},{"ruleId":"D2","level":"warning","message":{"text":"durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::stageProject (cognitive 23): durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::stageProject has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (12 pts), ternaries 5 (9 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. This shape REPEATS in the file: 5 other methods here (durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::adoptNewestDraft, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject::pushHalves, \u2026) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 6 times rather than 6 independent problems. Splitting this body alone leaves the other 5 exactly as they are. Where these are variations on one operation, the change that clears all 6 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":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":1066}}}],"partialFingerprints":{"codehealthFindingId/v1":"921b9361ffa576d1edd288beceb718c293187617e2b5fd565909e2b368c51077"}},{"ruleId":"D2","level":"warning","message":{"text":"canvasProjectMutations.applyMoves (cognitive 23): canvasProjectMutations.applyMoves has cognitive complexity 23 (threshold 15). Drivers by points: if/else 12 (13 pts), boolean chains 6, ternaries 3, loops 1 (nesting depth added 1). Most of this is not in the body itself: 10 of the 23 points are its own statements and the rest belongs to 7 function items inside it that branch (a function literal at line 342, a function literal at line 367, namesMoving, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"26facbea6c9e011d20c5e8e071b1b25d2ba9257496ef6c341a1230f7565e3c2b"}},{"ruleId":"D2","level":"warning","message":{"text":"documentModel.createDocumentModel::checkReparent (cognitive 23): documentModel.createDocumentModel::checkReparent has cognitive complexity 23 (threshold 15). Drivers by points: if/else 13 (15 pts), boolean chains 5, ternaries 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. This shape REPEATS in the file: 3 other methods here (documentModel.createDocumentModel::prepareInsert, documentModel.createDocumentModel::prepareReorder, documentModel.createDocumentModel::preparePatchConfigBatch) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 4 times rather than 4 independent problems. Splitting this body alone leaves the other 3 exactly as they are. Where these are variations on one operation, the change that clears all 4 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts"},"region":{"startLine":832}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4dd122f3db9fa35cfcf6b906ea18f342d15281e9880cc04c19a200e3aabd072"}},{"ruleId":"D2","level":"warning","message":{"text":"PixelEditController.beginMaterialized (cognitive 23): PixelEditController.beginMaterialized has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (10 pts), ternaries 5 (6 pts), error handling 3 (4 pts), boolean chains 3 (nesting depth added 3). Of this number, 13 points are the body\u0027s own statements and 10 belong to 4 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, 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/controlPixelController.ts"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8f2b3ba2b8b245d860017ccf06dab3fd11cade7341d0aec12f5546756e6feab"}},{"ruleId":"D2","level":"warning","message":{"text":"imageRecall.getMetadataConcepts (cognitive 23): imageRecall.getMetadataConcepts has cognitive complexity 23 (threshold 15). Drivers by points: if/else 8 (10 pts), ternaries 4 (8 pts), boolean chains 4, 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":"invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts"},"region":{"startLine":872}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5a6ebde109696739a595a0b26bb7c692488d23732a78b423ebdd1d9328c6007"}},{"ruleId":"D2","level":"warning","message":{"text":"video_recall.apply_media_precedence (cognitive 22): video_recall.apply_media_precedence has cognitive complexity 22 (threshold 15). Drivers by points: if/else 4 (13 pts), loops 3 (7 pts), boolean chains 1, ternaries 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":"invokeai/app/api/routers/video_recall.py"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"99c44b002661b7ce781d0bd9f4710f9dc2c62c686ec25e061953aa64f58b217b"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelInstallService._resume_remote_download (cognitive 22): ModelInstallService._resume_remote_download has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 3, ternaries 3, loops 1 (2 pts), error handling 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":625}}}],"partialFingerprints":{"codehealthFindingId/v1":"812d2acad4775c283a2d4159d6b5e80644a7d287c266d3165a6ba7a48321b0cf"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelInstallService._download_cancelled_callback (cognitive 22): ModelInstallService._download_cancelled_callback has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (19 pts), boolean chains 3 (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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":2503}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d559731840aa0e47ef364dc2f4370068a6f0090073440617e8e9ec47d7ebd82"}},{"ruleId":"D2","level":"warning","message":{"text":"ChildDependencyRecord._record_completion (cognitive 22): ChildDependencyRecord._record_completion has cognitive complexity 22 (threshold 15). Drivers by points: if/else 11 (17 pts), boolean chains 5 (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":"invokeai/app/services/shared/execution_engine/child.py"},"region":{"startLine":638}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cb7be1e5dff0f6ecd5189a9f327492404983768dc0954bbb11f8b9cb2b1e825"}},{"ruleId":"D2","level":"warning","message":{"text":"execution_state_migration._compact_effects (cognitive 22): execution_state_migration._compact_effects has cognitive complexity 22 (threshold 15). Drivers by points: if/else 3 (8 pts), ternaries 2 (6 pts), boolean chains 5, loops 2 (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":"invokeai/app/services/shared/execution_state_migration.py"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"e79b1674e277ba6dd543e0dc2862e6caa4046b4f0d0680aad0054d950fa05a50"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionNodeBuilder.create_for_body_iteration (cognitive 22): _ExecutionNodeBuilder.create_for_body_iteration has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (19 pts), loops 2 (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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":460}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6d711e81d669ea66f99cbf01ec9cdafbad12a968bb0ddb51bc39a18e645668f"}},{"ruleId":"D2","level":"warning","message":{"text":"Graph._get_upstream_collector_ids (cognitive 22): Graph._get_upstream_collector_ids has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (18 pts), boolean chains 3, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":737}}}],"partialFingerprints":{"codehealthFindingId/v1":"acca09a7ff083b0c0623ef8e7d5753a22f4e69a0c2da9ebdfe82fb4184880e46"}},{"ruleId":"D2","level":"warning","message":{"text":"media_references.extract_media_references (cognitive 22): media_references.extract_media_references has cognitive complexity 22 (threshold 15). Drivers by points: if/else 6 (18 pts), loops 2 (3 pts), boolean chains 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":"invokeai/app/services/shared/media_references.py"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"db0215a6f4c09719b1683afcb01b58765e9f6e2cfc4434ab2d7e544d332040ab"}},{"ruleId":"D2","level":"warning","message":{"text":"model_cache._run_deferred_work (cognitive 22): model_cache._run_deferred_work has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (16 pts), error handling 2 (5 pts), loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6fec2aa0d9b5c417d55c38bc4b088fa5e680f94ba117d3c0c1cb3a7387ae1c1"}},{"ruleId":"D2","level":"warning","message":{"text":"QwenVLEncoderCheckpointLoader._load_text_encoder_from_singlefile (cognitive 22): QwenVLEncoderCheckpointLoader._load_text_encoder_from_singlefile has cognitive complexity 22 (threshold 15). Drivers by points: if/else 11 (15 pts), error handling 2 (4 pts), loops 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":"invokeai/backend/model_manager/load/model_loaders/qwen_image.py"},"region":{"startLine":433}}}],"partialFingerprints":{"codehealthFindingId/v1":"732299e3d9633eaa9d2fffe3d93e3449e3c4dd5285dbb69da7953e73e5bc8b0c"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelOnDisk.load_state_dict (cognitive 22): ModelOnDisk.load_state_dict has cognitive complexity 22 (threshold 15). Drivers by points: if/else 12 (19 pts), error handling 1 (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":"invokeai/backend/model_manager/model_on_disk.py"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea61260688d288f75dd4d1a20f9f3258a1896b7e6ecce72765a7ecfdbb7e2fa4"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelSearch._walk_directory (cognitive 22): ModelSearch._walk_directory has cognitive complexity 22 (threshold 15). Drivers by points: error handling 4 (10 pts), if/else 7 (8 pts), boolean chains 2, loops 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":"invokeai/backend/model_manager/search.py"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f3593dc7c0563e32dd518f54c94f8c0898ba3c7405d1c372435b36a2201e580"}},{"ruleId":"D2","level":"warning","message":{"text":"LQProjection2D.__init__ (cognitive 22): LQProjection2D.__init__ has cognitive complexity 22 (threshold 15). Drivers by points: if/else 11 (12 pts), loops 3 (6 pts), boolean chains 4 (nesting depth added 4). 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":"invokeai/backend/pid/_src/networks/lq_projection_2d.py"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"449e8b573410680af5df5ffa5f5540219f37a4c861756a7a3b19bb4b72b3ae9f"}},{"ruleId":"D2","level":"warning","message":{"text":"sage_attention._ineligible (cognitive 22): sage_attention._ineligible has cognitive complexity 22 (threshold 15). Drivers by points: if/else 13, boolean chains 9. 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":"invokeai/backend/util/sage_attention.py"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbfdb271bdb9803f5fb7939fe81b08e4906d85c71341762ecf0195b82fc1bd89"}},{"ruleId":"D2","level":"warning","message":{"text":"promptAttention.adjustPromptAttention (cognitive 22): promptAttention.adjustPromptAttention has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (20 pts), error handling 1, loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/util/promptAttention.ts"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d92e83204c36e1ff4b53a0d6d0a3615ef0f762ccffbc4534f9ddf3d275e20aa"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryImage.buildOnClick (cognitive 22): GalleryImage.buildOnClick has cognitive complexity 22 (threshold 15). Drivers by points: if/else 12 (18 pts), boolean chains 4 (nesting depth added 6). None of this is in the body itself: all 22 points belong to one function literal inside it that branches (line 42). 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":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"2aaaf93da2ffc1a04b4bde93cae95455a323c90a72388566dfb3baace5c63619"}},{"ruleId":"D2","level":"warning","message":{"text":"buildSD1Graph.buildSD1Graph (cognitive 22): buildSD1Graph.buildSD1Graph has cognitive complexity 22 (threshold 15). Drivers by points: if/else 16 (18 pts), ternaries 3, boolean chains 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f2f02a99febdb2246cd8ee292a7baa2590c91cf987431203b77863c49027ff7"}},{"ruleId":"D2","level":"warning","message":{"text":"buildSD3Graph.buildSD3Graph (cognitive 22): buildSD3Graph.buildSD3Graph has cognitive complexity 22 (threshold 15). Drivers by points: if/else 16 (20 pts), boolean chains 2 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"67d67b9dd5127ed2efb5949c58cc1c42754d7a40ae6620a05a36dc8fba9846c2"}},{"ruleId":"D2","level":"warning","message":{"text":"mock-backend.filterGalleryItems (cognitive 22): mock-backend.filterGalleryItems has cognitive complexity 22 (threshold 15). Drivers by points: if/else 11 (12 pts), boolean chains 9, ternaries 1 (nesting depth added 1). None of this is in the body itself: all 22 points belong to 2 function literals inside it that branch (lines 577, 616). 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":"invokeai/frontend/webv2/scripts/mock-backend.mjs"},"region":{"startLine":565}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb4f821e8092db9a1829c1af24c4142232a11939de5ec50690be87b8f146b4cb"}},{"ruleId":"D2","level":"warning","message":{"text":"galleryStateView.getGallerySelectedImageQuery (cognitive 22): galleryStateView.getGallerySelectedImageQuery has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 11 (12 pts), boolean chains 10 (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":"invokeai/frontend/webv2/src/features/gallery/ui/galleryStateView.ts"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"023041f801efe32ef4e69936ec33f57578a8f49778c66019b86fae6fa787d5f9"}},{"ruleId":"D2","level":"warning","message":{"text":"compileCanvasGraph.getCanvasValidationReasons (cognitive 22): compileCanvasGraph.getCanvasValidationReasons has cognitive complexity 22 (threshold 15). Drivers by points: if/else 11 (15 pts), boolean chains 7 (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":"invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"b81584cfb907078d069e76cce7ff0821f4923abd629f7985fb191b6a067dc164"}},{"ruleId":"D2","level":"warning","message":{"text":"graph.buildFlux2Graph (cognitive 22): graph.buildFlux2Graph has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 13 (16 pts), boolean chains 5, if/else 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":745}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9ebd0fc955df3c6eb1967a5f14972d229f2ee11b2c874ed94d4bba5bfd3df1c"}},{"ruleId":"D2","level":"warning","message":{"text":"highlight.forEachTokenAnnotation (cognitive 22): highlight.forEachTokenAnnotation has cognitive complexity 22 (threshold 15). Drivers by points: if/else 4 (12 pts), loops 4 (7 pts), boolean chains 3 (nesting depth added 11). 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 into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/prompt/highlight.ts"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"83485b3ffb68fbdaf10dc1e8e9b02f4ea1629bcf151b80a50daa909bf9b9dfc1"}},{"ruleId":"D2","level":"warning","message":{"text":"GenerateRenderSection.GenerateRenderSection::renderFields (cognitive 22): GenerateRenderSection.GenerateRenderSection::renderFields has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 16 (18 pts), boolean chains 4 (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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/GenerateRenderSection.tsx"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e775ea1afa28c6172637d958725897a685803787b1d714c6c6fd5cfec20eaae"}},{"ruleId":"D2","level":"warning","message":{"text":"PromptTemplateEditor.PromptTemplateEditor (cognitive 22): PromptTemplateEditor.PromptTemplateEditor has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9, ternaries 8 (9 pts), boolean chains 3, error handling 1 (nesting depth added 1). Most of this is not in the body itself: 7 of the 22 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 103, 216, 81, \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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplateEditor.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6c32537504030d015efd4687b0402324f58b195276d3df0b42bca92bb10e407"}},{"ruleId":"D2","level":"warning","message":{"text":"InstallProgressCell.useInstallProgressCaption (cognitive 22): InstallProgressCell.useInstallProgressCaption has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 8 (16 pts), if/else 2 (3 pts), boolean chains 2, match/switch 1 (nesting depth added 9). Of this number, 21 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. 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":"invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallProgressCell.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"a94b916e937a1fa7c83c1c316cb5885d07d8e0b833c76782b1218bec6b3b6ba5"}},{"ruleId":"D2","level":"warning","message":{"text":"formFieldSettings.applyNodeFieldFormSettings (cognitive 22): formFieldSettings.applyNodeFieldFormSettings has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (16 pts), boolean chains 6 (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":"invokeai/frontend/webv2/src/features/workflow/core/formFieldSettings.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"043bc3f82a7404d6ed61cfc14050507100f87ff7893c7410ebb5ce1e74cb1866"}},{"ruleId":"D2","level":"warning","message":{"text":"layerWorkflow.buildLayerWorkflowGraph (cognitive 22): layerWorkflow.buildLayerWorkflowGraph has cognitive complexity 22 (threshold 15). Drivers by points: if/else 12 (14 pts), boolean chains 4, loops 2, ternaries 2 (nesting depth added 2). Of this number, 20 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/layerWorkflow.ts"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c547b7a8f64c410170ad192d1cd6dc9bbd6c7df685d1b462f3fd0fbe5732bf1"}},{"ruleId":"D2","level":"warning","message":{"text":"normalize.serializeErrorAtDepth (cognitive 22): normalize.serializeErrorAtDepth has cognitive complexity 22 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 5, ternaries 4 (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":"invokeai/frontend/webv2/src/platform/logging/normalize.ts"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"e266caeebbc04c4b794c049319f371d4669b625d9d05291bd9518ff234d7feb3"}},{"ruleId":"D2","level":"warning","message":{"text":"ColorPicker.ColorPicker (cognitive 22): ColorPicker.ColorPicker has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 10 (11 pts), if/else 8 (10 pts), boolean chains 1 (nesting depth added 3). Of this number, 16 points are the body\u0027s own statements and 6 belong to 4 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/ColorPicker.tsx"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3f6e5ed2d947ba3d3aa411c3f430f0829584edab56cc1bc27a4d774316b9992"}},{"ruleId":"D2","level":"warning","message":{"text":"prepareCanvasInvocation.resolveRegionalReferenceImages (cognitive 22): prepareCanvasInvocation.resolveRegionalReferenceImages has cognitive complexity 22 (threshold 15). Drivers by points: if/else 5 (11 pts), ternaries 2 (6 pts), boolean chains 4, 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/invoke/prepareCanvasInvocation.ts"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"09edaa72279382cc4d9bdaed6de325d0877aee14184d900b8108354622c24099"}},{"ruleId":"D2","level":"warning","message":{"text":"pointerPipeline.createPointerPipeline.onKeyDown (cognitive 22): pointerPipeline.createPointerPipeline.onKeyDown has cognitive complexity 22 (threshold 15). Drivers by points: if/else 11 (16 pts), boolean chains 6 (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":"invokeai/frontend/webv2/src/workbench/canvas-engine/input/pointerPipeline.ts"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"74fcaac500208c6ca10ca41ca60e1416a58b597d9755501a9e078c56713c30dc"}},{"ruleId":"D2","level":"warning","message":{"text":"groupSurfaceCache.createGroupSurfaceCache.drawRange (cognitive 22): groupSurfaceCache.createGroupSurfaceCache.drawRange has cognitive complexity 22 (threshold 15). Drivers by points: if/else 6 (12 pts), ternaries 3 (6 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/groupSurfaceCache.ts"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d5ec2b55c40f4b13ebd5d739d73b57b8793e81f76cffcdeee3bbe4b2b6ca104"}},{"ruleId":"D2","level":"warning","message":{"text":"paletteQueryModel.derivePaletteQueryModel (cognitive 22): paletteQueryModel.derivePaletteQueryModel has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 13 (14 pts), boolean chains 8 (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":"invokeai/frontend/webv2/src/workbench/palette/paletteQueryModel.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad66575ce2ba0b6e704063e87366ce68de05d6fab81d80c5762c5b1d08ff225c"}},{"ruleId":"D2","level":"warning","message":{"text":"queueRunJournal.createIndexedDbQueueRunJournal.record (cognitive 22): queueRunJournal.createIndexedDbQueueRunJournal.record has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (10 pts), error handling 4 (5 pts), boolean chains 4, ternaries 2 (3 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRunJournal.ts"},"region":{"startLine":381}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a74fe0a56c141818e583335ff633f783b4259db9dbac1a2f2828e9cff28c2af"}},{"ruleId":"D2","level":"warning","message":{"text":"queueRecall.buildQueueRecallValues (cognitive 22): queueRecall.buildQueueRecallValues has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 7 (13 pts), if/else 7 (8 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":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRecall.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"98fdc5533da2751b24546324d75f488fedd6f539cdafbcfb9f8f12dde0ce7c71"}},{"ruleId":"D2","level":"warning","message":{"text":"videos.ingest_uploaded_video (cognitive 21): videos.ingest_uploaded_video has cognitive complexity 21 (threshold 15). Drivers by points: error handling 7 (10 pts), if/else 6 (7 pts), boolean chains 4 (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":"invokeai/app/api/routers/videos.py"},"region":{"startLine":430}}}],"partialFingerprints":{"codehealthFindingId/v1":"49b777562c0b0a3fa5fbec5b50f579a58f40e8f3e710c69370887a1e33d506ce"}},{"ruleId":"D2","level":"warning","message":{"text":"videos._parse_range_header (cognitive 21): videos._parse_range_header has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (12 pts), error handling 3 (7 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":"invokeai/app/api/routers/videos.py"},"region":{"startLine":784}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad585aa93a7e15e25c2262a94946201222fc5ac108e25decd5f6eb4b82eea81c"}},{"ruleId":"D2","level":"warning","message":{"text":"Flux2DevLoRACollectionLoader.invoke (cognitive 21): Flux2DevLoRACollectionLoader.invoke has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (14 pts), ternaries 2 (4 pts), boolean chains 2, 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":"invokeai/app/invocations/flux2/flux2_dev_lora_loader.py"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed019e7cd5308f9cf1f1312ea833f121aa9d39c6ffce41b2b3e21a6abecdff47"}},{"ruleId":"D2","level":"warning","message":{"text":"WanLatentsToVideoInvocation.invoke (cognitive 21): WanLatentsToVideoInvocation.invoke has cognitive complexity 21 (threshold 15). Drivers by points: if/else 12, boolean chains 4, loops 1 (2 pts), ternaries 2, error handling 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":"invokeai/app/invocations/vae/wan_latents_to_video.py"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"104d42aec9d2fefd0bdb67ac1090294a42b9d986e1f21fea183ec2c0ebb47218"}},{"ruleId":"D2","level":"warning","message":{"text":"gemini._iter_response_parts (cognitive 21): gemini._iter_response_parts has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (19 pts), loops 1 (2 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":"invokeai/app/services/external_generation/providers/gemini.py"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"af2807db015bd40bc78964eece937d1f1a18137e0219f7a64b999feb1e2d2982"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryMaintenanceService._scan_archive_untracked (cognitive 21): GalleryMaintenanceService._scan_archive_untracked has cognitive complexity 21 (threshold 15). Drivers by points: if/else 5 (14 pts), loops 4 (6 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":"invokeai/app/services/gallery_maintenance/gallery_maintenance_default.py"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"6412dbbc0621e897f1a02e98d47c56169349452974f2211c5a6b0a5a08ce0f82"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageMoveService.preflight_moves (cognitive 21): ImageMoveService.preflight_moves has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (20 pts), loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_moves/image_moves_default.py"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"41f008c4a89f523b8b702fcd6294735469e5d9af0bb708e30116dd54f67f3831"}},{"ruleId":"D2","level":"warning","message":{"text":"IntermediatesService._resolve_scope (cognitive 21): IntermediatesService._resolve_scope has cognitive complexity 21 (threshold 15). Drivers by points: if/else 12 (19 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":"invokeai/app/services/intermediates/intermediates_default.py"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e215c5bdb1827e3998ede33c38e53b656cc35865e555274407da79910df78f6"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelInstallService._move_with_retries (cognitive 21): ModelInstallService._move_with_retries has cognitive complexity 21 (threshold 15). Drivers by points: if/else 4 (11 pts), error handling 2 (7 pts), boolean chains 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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":882}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cf9072b97eb58d9c5fc2f732559064069dbc223ef2df85b251f08fd79377a0e"}},{"ruleId":"D2","level":"warning","message":{"text":"OrphanedModelsService.find_orphaned_models (cognitive 21): OrphanedModelsService.find_orphaned_models has cognitive complexity 21 (threshold 15). Drivers by points: if/else 5 (11 pts), error handling 2 (5 pts), loops 4 (5 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":"invokeai/app/services/orphaned_models/orphaned_models_service.py"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb3939c9ef096350f1e3573f25af65bdac83e7aa240e077d9d15c7603f047446"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._value_from_object (cognitive 21): GraphExecutionState._value_from_object has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (15 pts), loops 3 (5 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":2374}}}],"partialFingerprints":{"codehealthFindingId/v1":"88b1cf86e7d95eb030fb4d72e4e40ad1fdd4364d61d8204ddb9eeb41aa1b3334"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_if_dependencies._get_fresh_if_branch_sources (cognitive 21): graph_if_dependencies._get_fresh_if_branch_sources has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (12 pts), loops 4 (6 pts), boolean chains 3 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_if_dependencies.py"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"aae125e252dc23c482abd992864893a34db88aeda47480c8da5d7eb7d97088fa"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_if_runtime._get_reopened_source_axes (cognitive 21): graph_if_runtime._get_reopened_source_axes has cognitive complexity 21 (threshold 15). Drivers by points: if/else 5 (15 pts), boolean chains 3, loops 2 (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":"invokeai/app/services/shared/graph_if_runtime.py"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"7db8f35eca8a57e43757f065334bcb90d803e6c62b1b4f1ab3d63b7e0925bbe0"}},{"ruleId":"D2","level":"warning","message":{"text":"Graph._validate_special_nodes (cognitive 21): Graph._validate_special_nodes has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (20 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":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":945}}}],"partialFingerprints":{"codehealthFindingId/v1":"210ea7e7f480396599edf8dc75b07b7f4e981dc90bf34c71af98140c1120624f"}},{"ruleId":"D2","level":"warning","message":{"text":"workflow_call_compatibility._get_placeholder_for_annotation (cognitive 21): workflow_call_compatibility._get_placeholder_for_annotation has cognitive complexity 21 (threshold 15). Drivers by points: if/else 14 (20 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":"invokeai/app/services/shared/workflow_call_compatibility.py"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c0e0c1e889bf9418f7352981c9d943d243d6d67ad96f29dc4271f2dce8d2e0d"}},{"ruleId":"D2","level":"warning","message":{"text":"DiskVideoFileStorage.__recover_staged_deletes (cognitive 21): DiskVideoFileStorage.__recover_staged_deletes has cognitive complexity 21 (threshold 15). Drivers by points: if/else 5 (11 pts), error handling 2 (6 pts), loops 2 (4 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":"invokeai/app/services/video_files/video_files_disk.py"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"73e07a71089cd69da3a2b214ebbb2e32514e355301e1a1ca2aa42ef2296088df"}},{"ruleId":"D2","level":"warning","message":{"text":"aac_splice.splice_soundtrack (cognitive 21): aac_splice.splice_soundtrack has cognitive complexity 21 (threshold 15). Drivers by points: if/else 12 (13 pts), boolean chains 6, error handling 1, 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":"invokeai/app/util/aac_splice.py"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"0801631bdec73aa1b2eb0135a97add1d93c2d883ebbcf5c931d35ea3dedbbf88"}},{"ruleId":"D2","level":"warning","message":{"text":"h264_splice.read_h264_layout (cognitive 21): h264_splice.read_h264_layout has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 3, ternaries 1 (2 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":"invokeai/app/util/h264_splice.py"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"35dd1c7e9a73a24cc40d851af788fc01c93556bfd0fb2ff236838880da0d93c2"}},{"ruleId":"D2","level":"warning","message":{"text":"video_thumbnails.extract_representative_video_frame (cognitive 21): video_thumbnails.extract_representative_video_frame has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (16 pts), boolean chains 2, error handling 1, loops 1, ternaries 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":"invokeai/app/util/video_thumbnails.py"},"region":{"startLine":548}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2ee7f3174ded34b34dcd11f6bb4aa172a2842b9555eece2b10d1f7218b49f70"}},{"ruleId":"D2","level":"warning","message":{"text":"LLLiteModuleDiT.forward (cognitive 21): LLLiteModuleDiT.forward has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (11 pts), ternaries 3 (6 pts), boolean chains 4 (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":"invokeai/backend/anima/control_net_lllite.py"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"52f2438a72f759b7fb6db762a12ca0d5e3304601a23169d9a5bf9d400a0674c0"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelConfigFactory.from_model_on_disk (cognitive 21): ModelConfigFactory.from_model_on_disk has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (10 pts), error handling 4 (8 pts), boolean chains 1, loops 1, match/switch 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":"invokeai/backend/model_manager/configs/factory.py"},"region":{"startLine":865}}}],"partialFingerprints":{"codehealthFindingId/v1":"205e719d517280f240a45724f9a487c032c9fa5d9a658b8e3700d306646c2003"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelCache._log_cache_state (cognitive 21): ModelCache._log_cache_state has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 6 (12 pts), if/else 4, boolean chains 3, loops 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":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2655}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca77fb2201db7d1c415eb4c2ccc80edd98e03aa37b0873fdaec5182404309bf4"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelCache._reconcile_budget_if_pending (cognitive 21): ModelCache._reconcile_budget_if_pending has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (15 pts), boolean chains 3, 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":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2915}}}],"partialFingerprints":{"codehealthFindingId/v1":"358f1b2213030f628862ac853570b025c01aa3e14197759fe0e130ed21270569"}},{"ruleId":"D2","level":"warning","message":{"text":"FluxSDNQDiffusersModel._convert_diffusers_sd_to_bfl (cognitive 21): FluxSDNQDiffusersModel._convert_diffusers_sd_to_bfl has cognitive complexity 21 (threshold 15). Drivers by points: if/else 5 (13 pts), loops 6 (8 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":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":2134}}}],"partialFingerprints":{"codehealthFindingId/v1":"d80e1d4645c3005c89da289e02216e4912341cb2108e825517cc82d1dab2700e"}},{"ruleId":"D2","level":"warning","message":{"text":"flux2_state_dict_utils._convert_flux2_weight_keys (cognitive 21): flux2_state_dict_utils._convert_flux2_weight_keys has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (19 pts), boolean chains 1, loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux2_state_dict_utils.py"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1c195b34553447a388fed443040cd2b71ddb953bbbfa751561c08aac57c167d"}},{"ruleId":"D2","level":"warning","message":{"text":"ZImageCheckpointModel._load_from_singlefile (cognitive 21): ZImageCheckpointModel._load_from_singlefile has cognitive complexity 21 (threshold 15). Drivers by points: if/else 12 (15 pts), boolean chains 3, ternaries 1 (2 pts), loops 1 (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":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6c56bbe2aed22abd9f8e43ad25e5351207ea89fe6087da56dd539bfeefb7f68"}},{"ruleId":"D2","level":"warning","message":{"text":"flux_bfl_peft_lora_conversion_utils._convert_bfl_layer_to_diffusers (cognitive 21): flux_bfl_peft_lora_conversion_utils._convert_bfl_layer_to_diffusers has cognitive complexity 21 (threshold 15). Drivers by points: if/else 11 (19 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":"invokeai/backend/patches/lora_conversions/flux_bfl_peft_lora_conversion_utils.py"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c3398250a03463a7cdbaf7b7bcc0d3a670024117af18241060358db7d1392f8"}},{"ruleId":"D2","level":"warning","message":{"text":"calibrate_qwen_vae_working_memory.run_grid (cognitive 21): calibrate_qwen_vae_working_memory.run_grid has cognitive complexity 21 (threshold 15). Drivers by points: if/else 4 (8 pts), loops 4 (6 pts), error handling 1 (3 pts), ternaries 1 (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":"scripts/calibrate_qwen_vae_working_memory.py"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ce3f0e560400d4405c24c28f14026bf719b54d0ea4f05a84e5a1679a5c099d9"}},{"ruleId":"D2","level":"warning","message":{"text":"calibrate_wan_vae_working_memory._measure (cognitive 21): calibrate_wan_vae_working_memory._measure has cognitive complexity 21 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 5, loops 1 (2 pts), ternaries 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/calibrate_wan_vae_working_memory.py"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"06e2e22e2bfc16e27184d3727e0eb87fe5dea2912b3e00b724d49349218d70e6"}},{"ruleId":"D2","level":"warning","message":{"text":"check_platform_locks.has_wheel (cognitive 21): check_platform_locks.has_wheel has cognitive complexity 21 (threshold 15). Drivers by points: if/else 4 (13 pts), boolean chains 3, loops 2 (3 pts), error handling 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":"scripts/check_platform_locks.py"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"17e79a93430a30467a418c4c5aa44c1fbf8697fcf611ef92535431b7f3379e79"}},{"ruleId":"D2","level":"warning","message":{"text":"wanComponentSync.getWanComponentUpdates (cognitive 21): wanComponentSync.getWanComponentUpdates has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (17 pts), boolean chains 4 (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":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/wanComponentSync.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2035b384a5b483d7d2b2d37621392d56949396e704a0a6b442d976fce0185ad"}},{"ruleId":"D2","level":"warning","message":{"text":"workflowHasImageField.workflowHasImageField (cognitive 21): workflowHasImageField.workflowHasImageField has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (20 pts), loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/workflowHasImageField.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"04b9fa6a41511ea2ba45f88e89d13d5998cba86c04979dc7f8dd213010a3c290"}},{"ruleId":"D2","level":"warning","message":{"text":"RasterLayerCurvesAdjustmentsGraph.RasterLayerCurvesAdjustmentsGraph (cognitive 21): RasterLayerCurvesAdjustmentsGraph.RasterLayerCurvesAdjustmentsGraph has cognitive complexity 21 (threshold 15). Drivers by points: if/else 11, error handling 3 (5 pts), boolean chains 4, ternaries 1 (nesting depth added 2). None of this is in the body itself: all 21 points belong to 9 function literals inside it that branch (lines 260, 306, 335, \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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"974837a1398c1efe1a2236e789e30c30a35e032589651b423c92d6a2f552d537"}},{"ruleId":"D2","level":"warning","message":{"text":"Editor.exportImage (cognitive 21): Editor.exportImage has cognitive complexity 21 (threshold 15). Drivers by points: if/else 12 (16 pts), error handling 3 (5 pts) (nesting depth added 6). None of this is in the body itself: all 21 points belong to 2 function literals inside it that branch (lines 1143, 1215). 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":"invokeai/frontend/webv1/src/features/cropper/lib/editor.ts"},"region":{"startLine":1138}}}],"partialFingerprints":{"codehealthFindingId/v1":"b026fa8854404684f3b4cbc34ea92e53ab123cbf9c8789a372a589e733478464"}},{"ruleId":"D2","level":"warning","message":{"text":"getFirstValidConnection.getSourceCandidateFields (cognitive 21): getFirstValidConnection.getSourceCandidateFields has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (13 pts), ternaries 3 (6 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":"invokeai/frontend/webv1/src/features/nodes/store/util/getFirstValidConnection.ts"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"a350fd20cb4ba4fbe2472e278d8088cb04e1c11fef2ca6f6c53afd0b91d12871"}},{"ruleId":"D2","level":"warning","message":{"text":"QueueItemDetail.QueueItemComponent (cognitive 21): QueueItemDetail.QueueItemComponent has cognitive complexity 21 (threshold 15). Drivers by points: boolean chains 11, ternaries 4 (7 pts), if/else 3 (nesting depth added 3). Of this number, 11 points are the body\u0027s own statements and 10 belong to 3 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":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueItemDetail.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"a928b1a20bfa5697cbd85ce273e6591b26173692b961d54e8eaecd645cfae38e"}},{"ruleId":"D2","level":"warning","message":{"text":"QueueItemComponent.QueueItemComponent (cognitive 21): QueueItemComponent.QueueItemComponent has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9, boolean chains 8, ternaries 4. Most of this is not in the body itself: 10 of the 21 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 53, 109, 40, \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":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueItemComponent.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"92c663091a92e07018dfbfc8a489c50d4035a88110dce172043f126cd5a0dcb3"}},{"ruleId":"D2","level":"warning","message":{"text":"onInvocationComplete.buildOnInvocationComplete::addImagesToGallery (cognitive 21): onInvocationComplete.buildOnInvocationComplete::addImagesToGallery has cognitive complexity 21 (threshold 15). Drivers by points: if/else 13 (16 pts), loops 3, boolean chains 2 (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. This shape REPEATS in the file: one other method here (onInvocationComplete.buildOnInvocationComplete::getResultVideoDTOs) 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":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ae0566bd1d5dbff262afd4aa803b7e8cfc7b99ce25bbd69c2cc9b6371137139"}},{"ruleId":"D2","level":"warning","message":{"text":"useGalleryGridSelection.useGalleryGridSelection.selectItemRange (cognitive 21): useGalleryGridSelection.useGalleryGridSelection.selectItemRange has cognitive complexity 21 (threshold 15). Drivers by points: if/else 14 (15 pts), boolean chains 5, error handling 1 (nesting depth added 1). Of this number, 13 points are the body\u0027s own statements and 8 belong to 4 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":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryGridSelection.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"15b6df9f100d2d6290d3a838c8748b16bf6dacb794b2d3db77b3ab4f0de8b033"}},{"ruleId":"D2","level":"warning","message":{"text":"promptFocus.getActiveTriggerQuery (cognitive 21): promptFocus.getActiveTriggerQuery has cognitive complexity 21 (threshold 15). Drivers by points: if/else 5 (9 pts), ternaries 2 (6 pts), boolean chains 5, 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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/promptFocus.ts"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f35776c18a6373a14c874116fca1d5e3fb2b3d8938353825f15cdb3fcd8a5f3"}},{"ruleId":"D2","level":"warning","message":{"text":"referenceImage.resolveRatioDrag (cognitive 21): referenceImage.resolveRatioDrag has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 10 (13 pts), boolean chains 4, if/else 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":"invokeai/frontend/webv2/src/features/generation/core/referenceImage.ts"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d24a891f99b687c1198ee85bd8ac4d059cc025ffe48f1605e1cc23e1bd75530"}},{"ruleId":"D2","level":"warning","message":{"text":"attention.unifyEqualWeights (cognitive 21): attention.unifyEqualWeights has cognitive complexity 21 (threshold 15). Drivers by points: if/else 5 (15 pts), loops 3 (6 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":"invokeai/frontend/webv2/src/features/generation/core/prompt/attention.ts"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dbb9942e92812c5c5719edccb717d8bbf0a25f9a874a8be5b962157f22c9a85"}},{"ruleId":"D2","level":"warning","message":{"text":"GenerateConditioningRebalanceField.GenerateConditioningRebalanceField (cognitive 21): GenerateConditioningRebalanceField.GenerateConditioningRebalanceField has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 10 (13 pts), boolean chains 4, if/else 4 (nesting depth added 3). Of this number, 14 points are the body\u0027s own statements and 7 belong to 7 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/GenerateConditioningRebalanceField.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"aac7b58210dd3ab9980861946c8d17bd41f6697300ee7c654c4bc7ec2063ee05"}},{"ruleId":"D2","level":"warning","message":{"text":"fields.isWorkflowFieldValueValid (cognitive 21): fields.isWorkflowFieldValueValid has cognitive complexity 21 (threshold 15). Drivers by points: boolean chains 14, if/else 4 (6 pts), match/switch 1 (nesting depth added 2). 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":"invokeai/frontend/webv2/src/features/workflow/core/fields.ts"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbecfd32c0b5ad7dd67c75572b4cfd843c35e862cd810fbeec54ac1769793590"}},{"ruleId":"D2","level":"warning","message":{"text":"NodeFieldControl.NodeFieldControl (cognitive 21): NodeFieldControl.NodeFieldControl has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 10 (13 pts), boolean chains 6, if/else 2 (nesting depth added 3). Of this number, 18 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/linear/NodeFieldControl.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b82deea18adc8af69f744bb4114eef5fb58b041df1baddb061456d110c8fcea"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowFieldInput.WorkflowFieldSnapshot (cognitive 21): WorkflowFieldInput.WorkflowFieldSnapshot has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 5 (11 pts), if/else 5 (6 pts), boolean chains 4 (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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":2021}}}],"partialFingerprints":{"codehealthFindingId/v1":"93eb20f20d09b58ff865709d5d647b4806aadf533ed083da85cb7e8a20bc8d48"}},{"ruleId":"D2","level":"warning","message":{"text":"normalize.normalizeValue (cognitive 21): normalize.normalizeValue has cognitive complexity 21 (threshold 15). Drivers by points: if/else 11 (12 pts), ternaries 3 (6 pts), boolean chains 2, match/switch 1 (nesting depth added 4). 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: 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":"invokeai/frontend/webv2/src/platform/logging/normalize.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"796c62760ee2c51edebb3dead88f81a7980a1aac18645b038ad074a13c6bd51f"}},{"ruleId":"D2","level":"warning","message":{"text":"http.getApiErrorMessage (cognitive 21): http.getApiErrorMessage has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (13 pts), boolean chains 5, error handling 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":"invokeai/frontend/webv2/src/platform/transport/http.ts"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfdadbcc48a15957d214f3e57a4e39cdff6d97254d1cacb469148b5576d8927a"}},{"ruleId":"D2","level":"warning","message":{"text":"persistenceRuntime.createWorkbenchPersistenceRuntime.load (cognitive 21): persistenceRuntime.createWorkbenchPersistenceRuntime.load has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 6, error handling 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":"invokeai/frontend/webv2/src/workbench/persistenceRuntime.ts"},"region":{"startLine":484}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ed1989647990a98edadddd9db1d8e52c312c43c6e02bcf42c94d2c4425c30bd"}},{"ruleId":"D2","level":"warning","message":{"text":"canvasProjectMutations.applyLayerStackMutation (cognitive 21): canvasProjectMutations.applyLayerStackMutation has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (11 pts), boolean chains 5, loops 2 (3 pts), ternaries 2 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"583fb41dcc238bd74729f5e41ec6260b0ada73eeda7d44491a8f1fa45b98b805"}},{"ruleId":"D2","level":"warning","message":{"text":"layerExportActions.saveLayerToBoard (cognitive 21): layerExportActions.saveLayerToBoard has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (14 pts), ternaries 1 (3 pts), boolean chains 2, error handling 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerExportActions.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5e34036b3834cb5bd05558bfff26feee48db74251b610433ca5cc5e9ffc82de"}},{"ruleId":"D2","level":"warning","message":{"text":"SelectionImageController.replace (cognitive 21): SelectionImageController.replace has cognitive complexity 21 (threshold 15). Drivers by points: if/else 11 (12 pts), boolean chains 4, ternaries 2 (4 pts), error handling 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/selectionImageController.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf8534b74100ef4843e1f64c35780ba4382c14cc31cbf920c02f3eb6afc85f84"}},{"ruleId":"D2","level":"warning","message":{"text":"bitmapStore.createBitmapStore.uploadWithRetry (cognitive 21): bitmapStore.createBitmapStore.uploadWithRetry has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (18 pts), error handling 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"452e48d3881e10ede9ea9d5e69f71c8960ed3eef65103fdde38f24f61de14e16"}},{"ruleId":"D2","level":"warning","message":{"text":"alphaBounds.alphaBounds (cognitive 21): alphaBounds.alphaBounds has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (16 pts), loops 3 (5 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/alphaBounds.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"3abe639340cd2b90258d867ff07fb48c7dfe9d716770495f62849b3d026734f6"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageMapVocabularySettings.ImageMapVocabularySettings (cognitive 21): ImageMapVocabularySettings.ImageMapVocabularySettings has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (12 pts), ternaries 6 (8 pts), boolean chains 1 (nesting depth added 4). Most of this is not in the body itself: 8 of the 21 points are its own statements and the rest belongs to 6 function items inside it that branch (addTerms, a function literal at line 52, a function literal at line 62, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/ImageMapVocabularySettings.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"a97ed61b26838b98465606bfc1602764d8243dd73d90f3ed0db717691aae4ae3"}},{"ruleId":"D2","level":"warning","message":{"text":"ClusterStrengthField.ClusterStrengthField (cognitive 21): ClusterStrengthField.ClusterStrengthField has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10, ternaries 9, boolean chains 2. Most of this is not in the body itself: 9 of the 21 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 139, 67, 110, \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":"invokeai/frontend/webv2/src/workbench/widgets/image-map/ClusterStrengthField.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bda700d4d9d550f1904bf5cf184042e44fe2e759e4ad21ebf1856af6eeb3740"}},{"ruleId":"D2","level":"warning","message":{"text":"extract_metadata.extract_metadata (cognitive 20): extract_metadata.extract_metadata has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (11 pts), error handling 3 (6 pts), ternaries 3 (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":"invokeai/app/api/extract_metadata.py"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea59f9770fc93438af0511bfa9d443c5ea41451a2fd1fc4a4067eb16b56eef29"}},{"ruleId":"D2","level":"warning","message":{"text":"SocketIO._handle_user_access_changed (cognitive 20): SocketIO._handle_user_access_changed has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (18 pts), error handling 1, 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":"invokeai/app/api/sockets.py"},"region":{"startLine":708}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5cb74c8f86817354dd73419c009521876c20bcb339fe9e882f29751f3411be8"}},{"ruleId":"D2","level":"warning","message":{"text":"InvokeImageBlendInvocation.image_convert_with_xform (cognitive 20): InvokeImageBlendInvocation.image_convert_with_xform has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (11 pts), boolean chains 9 (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":"invokeai/app/invocations/composition-nodes.py"},"region":{"startLine":449}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd5f0a3c3cb908bb8ea8212fd9782aa68373c4c78cf7f455fae8b321cb1514f4"}},{"ruleId":"D2","level":"warning","message":{"text":"SDXLLoRACollectionLoader.invoke (cognitive 20): SDXLLoRACollectionLoader.invoke has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 3, loops 1, 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":"invokeai/app/invocations/model.py"},"region":{"startLine":690}}}],"partialFingerprints":{"codehealthFindingId/v1":"a76bef7153bbb92c5ef677f480da93f40b2547ab71bc84cea4129b4629a3c2fa"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageIndexService._process_batch (cognitive 20): ImageIndexService._process_batch has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (13 pts), error handling 3 (4 pts), loops 2, boolean chains 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":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1352}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb51a07f6b48add82293c7c301ec3638fc0e3225c3987c3048d675fa1ddd4af5"}},{"ruleId":"D2","level":"warning","message":{"text":"workflow_call_compatibility._build_compatibility_workflow_inputs (cognitive 20): workflow_call_compatibility._build_compatibility_workflow_inputs has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (18 pts), boolean chains 1, 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":"invokeai/app/services/shared/workflow_call_compatibility.py"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fb6c282de45bced6e40cb3f1ea657147fcee4da479fa39764ac7463892f4871"}},{"ruleId":"D2","level":"warning","message":{"text":"style_reference.parse_block_spec (cognitive 20): style_reference.parse_block_spec has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (11 pts), error handling 2 (6 pts), boolean chains 2, 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":"invokeai/backend/krea2/style_reference.py"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"413b496c49d39a9d8c77ea006736fb41889b4266398ee7871b1eee0e3d5ff138"}},{"ruleId":"D2","level":"warning","message":{"text":"denoise.build_denoise_state (cognitive 20): denoise.build_denoise_state has cognitive complexity 20 (threshold 15). Drivers by points: if/else 12 (15 pts), boolean chains 4, ternaries 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/ltx2/denoise.py"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff08743a80d272e24dfd7abc3bb120b308ca1e3f8afff0fdc75768dc7fa4d6e5"}},{"ruleId":"D2","level":"warning","message":{"text":"reference_conditioning.normalize_reference_video_frames_streaming (cognitive 20): reference_conditioning.normalize_reference_video_frames_streaming has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (16 pts), loops 2 (3 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":"invokeai/backend/minimax_h3/reference_conditioning.py"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"c373726e295a598c33101ecffe6e4062325b234285bb636d74aa1b62d181746b"}},{"ruleId":"D2","level":"warning","message":{"text":"qwen3_vl_encoder._has_complete_pretrained_weights (cognitive 20): qwen3_vl_encoder._has_complete_pretrained_weights has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (13 pts), boolean chains 4, loops 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":"invokeai/backend/model_manager/configs/qwen3_vl_encoder.py"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"81fe6ddf85b71a66aaf02deeef4f8f6f5ce86afeb8d43ed21357c5c6ce929c79"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelLoader._load_and_cache (cognitive 20): ModelLoader._load_and_cache has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (10 pts), ternaries 3 (5 pts), boolean chains 3, error handling 2 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/load_default.py"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"19841c6cce9007ebdecb9d1fc2a4474bae88afbf076daf098411f1c1a5e6d6b5"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelCache._make_room_internal (cognitive 20): ModelCache._make_room_internal has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 3, 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":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2740}}}],"partialFingerprints":{"codehealthFindingId/v1":"da36d9e7d32c770c1e97d7356b1fcd2df39d6f89051ae518e48caf001be53168"}},{"ruleId":"D2","level":"warning","message":{"text":"flux2_state_dict_utils._convert_flux2_double_block_key (cognitive 20): flux2_state_dict_utils._convert_flux2_double_block_key has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 4, loops 2 (4 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":"invokeai/backend/model_manager/load/model_loaders/flux2_state_dict_utils.py"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c995e1712d70ee66e92c4ee4413c6024e1f305d3db58ff76363df36763cb6cd"}},{"ruleId":"D2","level":"warning","message":{"text":"krea2_lora_conversion_utils.lora_model_from_krea2_state_dict (cognitive 20): krea2_lora_conversion_utils.lora_model_from_krea2_state_dict has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (14 pts), loops 3 (6 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":"invokeai/backend/patches/lora_conversions/krea2_lora_conversion_utils.py"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e6234088668e9595ad97df8a4bb7c046898a424d1d7185c71b42a201b201a41"}},{"ruleId":"D2","level":"warning","message":{"text":"sdxl_lora_conversion_utils._make_sdxl_unet_conversion_map (cognitive 20): sdxl_lora_conversion_utils._make_sdxl_unet_conversion_map has cognitive complexity 20 (threshold 15). Drivers by points: loops 8 (12 pts), if/else 4 (8 pts) (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":"invokeai/backend/patches/lora_conversions/sdxl_lora_conversion_utils.py"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"839d2aa88a43755691a7ec7bfc9ae5d848d5eefcb3e94fb2dc3bfef2a759528f"}},{"ruleId":"D2","level":"warning","message":{"text":"fp8_scaled.extract_fp8_scaled_layers (cognitive 20): fp8_scaled.extract_fp8_scaled_layers has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 3, loops 3, 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":"invokeai/backend/quantization/fp8_scaled.py"},"region":{"startLine":581}}}],"partialFingerprints":{"codehealthFindingId/v1":"890c66e970c9985017e08860d0409e17f4978fcf183138be003192c8256347ef"}},{"ruleId":"D2","level":"warning","message":{"text":"sage_attention.install_sage_attention (cognitive 20): sage_attention.install_sage_attention has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (11 pts), boolean chains 4, error handling 3, loops 1, 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":"invokeai/backend/util/sage_attention.py"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3752e68334349f85be04a98715eaa7b098e075d8b090438aacb42a0451d1287"}},{"ruleId":"D2","level":"warning","message":{"text":"ZImageControlTransformer2DModel.forward_control (cognitive 20): ZImageControlTransformer2DModel.forward_control has cognitive complexity 20 (threshold 15). Drivers by points: loops 5 (7 pts), ternaries 2 (6 pts), if/else 4 (5 pts), boolean chains 2 (nesting depth added 7). This file\u0027s own header attributes it to another copyright holder, so it is code this repository carries rather than code it wrote: restructuring the body in place forks it from upstream and turns every future re-sync into a manual merge. The performable moves are to leave the body as close to its upstream form as possible and keep it behind a narrow interface of your own, and to re-sync it when upstream changes \u2014 or, if it has already diverged far enough that you maintain it here, adopt it deliberately and then split the body into named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_transformer.py"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"61cbec289456bf68a59c4f12a6567986d4bd7b236939939080b7c59ecca66d31"}},{"ruleId":"D2","level":"warning","message":{"text":"ZImageControlNetExtension.compute_hints (cognitive 20): ZImageControlNetExtension.compute_hints has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (13 pts), loops 5 (7 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":"invokeai/backend/z_image/z_image_controlnet_extension.py"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"eaca5ed36feeab0a8da34ff20c1e90751649049bf052a47e47f7ac458983ebbe"}},{"ruleId":"D2","level":"warning","message":{"text":"z_image_controlnet_extension.z_image_forward_with_control (cognitive 20): z_image_controlnet_extension.z_image_forward_with_control has cognitive complexity 20 (threshold 15). Drivers by points: if/else 5 (11 pts), loops 7, boolean chains 1, 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":"invokeai/backend/z_image/z_image_controlnet_extension.py"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"332eedfed6bd73b5543196b083f2e6437b490ce11d7531a30c0992ec447b6183"}},{"ruleId":"D2","level":"warning","message":{"text":"TranslationCleaner._search_codebase (cognitive 20): TranslationCleaner._search_codebase has cognitive complexity 20 (threshold 15). Drivers by points: if/else 5 (16 pts), loops 2 (3 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":"invokeai/frontend/webv1/scripts/clean_translations.py"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a49ca53004792d51b597e564e8bfd217118e8d489a849b8d77de2288a72ca06"}},{"ruleId":"D2","level":"warning","message":{"text":"generate_docs_json._parse_docstring (cognitive 20): generate_docs_json._parse_docstring has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (17 pts), loops 2, 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":"scripts/generate_docs_json.py"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"429eba8e84b629e08aa2bb8bb1257b0a2a47a57173ca7e33fdcddc43acc2a28a"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasEntityGroupList.CanvasEntityGroupList (cognitive 20): CanvasEntityGroupList.CanvasEntityGroupList has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10, ternaries 5 (7 pts), boolean chains 3 (nesting depth added 2). Most of this is not in the body itself: 8 of the 20 points are its own statements and the rest belongs to one function literal inside it that branches (line 37). 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityGroupList.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"95a11412a0d0d1ff871cd331add733528c85659d81ce6b6e0a990f531f850d35"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasCompositorModule.getGrayscaleMaskCompositeImageDTO (cognitive 20): CanvasCompositorModule.getGrayscaleMaskCompositeImageDTO has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (13 pts), loops 2 (3 pts), ternaries 2 (3 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5450c5fe1ec8b2fd6a8406f25469250724eabd11bc431ab913f71094b88e9c2"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasBrushToolModule.onStagePointerDown (cognitive 20): CanvasBrushToolModule.onStagePointerDown has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (10 pts), boolean chains 6, ternaries 2 (4 pts) (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cd68dcc82f02d78a59a0c83b01b7eba7ac2b3574d3dd4efc6bc058ad1aa1729"}},{"ruleId":"D2","level":"warning","message":{"text":"LoRASelect.LoRASelect (cognitive 20): LoRASelect.LoRASelect has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8, ternaries 4 (8 pts), boolean chains 4 (nesting depth added 4). Most of this is not in the body itself: 1 of the 20 points is its own statement and the rest belongs to 5 function literals inside it that branch (lines 33, 88, 29, \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":"invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"e56b5cd5b7a96348493d46e577ccde6175ccc33fe4731e6818a0b46461fc0834"}},{"ruleId":"D2","level":"warning","message":{"text":"validateConnectionTypes.validateConnectionTypes (cognitive 20): validateConnectionTypes.validateConnectionTypes has cognitive complexity 20 (threshold 15). Drivers by points: boolean chains 18, if/else 2. 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":"invokeai/frontend/webv1/src/features/nodes/store/util/validateConnectionTypes.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1d8d7a253a0a150803bf391bad91b4656446c1a1e1b4083332f53601892ef6a"}},{"ruleId":"D2","level":"warning","message":{"text":"buildExternalGraph.buildExternalGraph (cognitive 20): buildExternalGraph.buildExternalGraph has cognitive complexity 20 (threshold 15). Drivers by points: if/else 14 (19 pts), ternaries 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"2889a15952bb147cf2f4b75fc96ea26a33e619119158b42b58bc7d5eb3719adf"}},{"ruleId":"D2","level":"warning","message":{"text":"buildKrea2Graph.buildKrea2Graph (cognitive 20): buildKrea2Graph.buildKrea2Graph has cognitive complexity 20 (threshold 15). Drivers by points: if/else 16, boolean chains 4. Of this number, 16 points are the body\u0027s own statements and 4 belong to 2 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"a79789b3823ffc8699e42bf7413448e8092fdeaf87663c63723e3fc67843b63e"}},{"ruleId":"D2","level":"warning","message":{"text":"readiness.getReasonsWhyCannotEnqueueUpscaleTab (cognitive 20): readiness.getReasonsWhyCannotEnqueueUpscaleTab has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (16 pts), loops 1 (3 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":726}}}],"partialFingerprints":{"codehealthFindingId/v1":"58489c8d6398edea6b79b0e2025d85e31091d6ed54feeefdb4e2c5a742eb84a0"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsGenerationDevices.SettingsGenerationDevices (cognitive 20): SettingsGenerationDevices.SettingsGenerationDevices has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (7 pts), ternaries 5 (6 pts), boolean chains 3, loops 3, error handling 1 (nesting depth added 2). Most of this is not in the body itself: 4 of the 20 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 79, 114, 128, \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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsGenerationDevices.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"42c0151d8a0d01cec3d6683234788994b6db9d8eedc2b3366c33e1207919dcd5"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsImageStorageMaintenance.SettingsImageStorageMaintenance (cognitive 20): SettingsImageStorageMaintenance.SettingsImageStorageMaintenance has cognitive complexity 20 (threshold 15). Drivers by points: boolean chains 9, if/else 7, error handling 2, ternaries 2. Most of this is not in the body itself: 9 of the 20 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 92, 70, 66, \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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageStorageMaintenance.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"53f2eb4ce986329f14cb506433a6612154d201f3d2c218dbbff912900d855dbe"}},{"ruleId":"D2","level":"warning","message":{"text":"images.bulkDownloadQueryFn (cognitive 20): images.bulkDownloadQueryFn has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (15 pts), boolean chains 3, loops 1, ternaries 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":"invokeai/frontend/webv1/src/services/api/endpoints/images.ts"},"region":{"startLine":502}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e838027e9ed0c58300108695f20902c65cbf73283a1ad655a8e4184c8ce6ad6"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryProgressSection.GalleryProgressTile (cognitive 20): GalleryProgressSection.GalleryProgressTile has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 11 (15 pts), if/else 3, boolean chains 2 (nesting depth added 4). Of this number, 17 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryProgressSection.tsx"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6fba51857f0a4a270869268533278813b761c8aa1552fd9cda88b4b416e7912"}},{"ruleId":"D2","level":"warning","message":{"text":"graph.buildSDGraph (cognitive 20): graph.buildSDGraph has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 11 (12 pts), if/else 6, boolean chains 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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c1c50f79f4fe06d368274f5ff973b00fbb40af43c494f9723312e68e0fb1438"}},{"ruleId":"D2","level":"warning","message":{"text":"GenerateReferenceImagesSection.GenerateReferenceImagesContent (cognitive 20): GenerateReferenceImagesSection.GenerateReferenceImagesContent has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8, ternaries 8, boolean chains 4. Most of this is not in the body itself: 7 of the 20 points are its own statements and the rest belongs to 8 function items inside it that branch (addGalleryImages, a function literal at line 69, a function literal at line 155, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/GenerateReferenceImagesSection.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"b74ccf9b7e4ed5143f5b7665ac5857d9b28d8f84e2d066f9b17595290c9c649b"}},{"ruleId":"D2","level":"warning","message":{"text":"RelatedModelsSection.RelatedModelsForModel (cognitive 20): RelatedModelsSection.RelatedModelsForModel has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (8 pts), ternaries 5 (8 pts), boolean chains 2, error handling 2 (nesting depth added 5). Most of this is not in the body itself: 5 of the 20 points are its own statements and the rest belongs to 4 function items inside it that branch (handleAdd, handleRemove, a function literal at line 45, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/detail/RelatedModelsSection.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"31ec36853abe4acab743d166ec75948e6c611768fc3a052003c92daa7a1f0802"}},{"ruleId":"D2","level":"warning","message":{"text":"modelDraftsStore.syncWithLibrary (cognitive 20): modelDraftsStore.syncWithLibrary has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (15 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/modelDraftsStore.ts"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"353738f1be6f973037b5c66fae17f98c07f10ba85f7bb76a2463d8e8012f28ce"}},{"ruleId":"D2","level":"warning","message":{"text":"InvocationCacheFooter.InvocationCacheFooter (cognitive 20): InvocationCacheFooter.InvocationCacheFooter has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 10 (16 pts), boolean chains 2, error handling 1, if/else 1 (nesting depth added 6). Of this number, 17 points are the body\u0027s own statements and 3 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":"invokeai/frontend/webv2/src/features/queue/ui/InvocationCacheFooter.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6970edb6b717a25a55f32ddef2c84abb3556b1d17b3ea4798dd47e4ad40fbe3"}},{"ruleId":"D2","level":"warning","message":{"text":"flowAdapters.toFlowNodes (cognitive 20): flowAdapters.toFlowNodes has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (10 pts), ternaries 3 (6 pts), boolean chains 4 (nesting depth added 6). None of this is in the body itself: all 20 points belong to one function literal inside it that branches (line 211). 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/flowAdapters.ts"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf7261a8ed4cd057e9f6e79f655006f89bd1b064de8ecae7ee089e9cbe38c8de"}},{"ruleId":"D2","level":"warning","message":{"text":"api.settleProjectCreate (cognitive 20): api.settleProjectCreate has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (9 pts), error handling 4 (5 pts), boolean chains 3, ternaries 2 (3 pts) (nesting depth added 5). Of this number, 10 points are the body\u0027s own statements and 10 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":"invokeai/frontend/webv2/src/workbench/projects/api.ts"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8439858529e2c6aa88600335084b7ef7226c2a5db700b925dc1c6e88e83941d"}},{"ruleId":"D2","level":"warning","message":{"text":"projectHalves.findRepeatedWorkflowItem (cognitive 20): projectHalves.findRepeatedWorkflowItem has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 5 (12 pts), if/else 2 (4 pts), boolean chains 3, loops 1 (nesting depth added 9). Of this number, 15 points are the body\u0027s own statements and 5 belong to 2 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":"invokeai/frontend/webv2/src/workbench/projects/projectHalves.ts"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"201408a70cea9833c6c45ce656ddd61af2dc4f1ea03c0ff3a48be869e7703b9c"}},{"ruleId":"D2","level":"warning","message":{"text":"runLayerWorkflow.runLayerWorkflow (cognitive 20): runLayerWorkflow.runLayerWorkflow has cognitive complexity 20 (threshold 15). Drivers by points: if/else 15 (16 pts), error handling 2 (3 pts), boolean chains 1 (nesting depth added 2). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/runLayerWorkflow.ts"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3a416f64bda9eb7f39f99a518c2c254624cc78fbf347c596061b33ab3082714"}},{"ruleId":"D2","level":"warning","message":{"text":"TransformPane.ConnectedTransform (cognitive 20): TransformPane.ConnectedTransform has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 11, boolean chains 6, if/else 3. Of this number, 13 points are the body\u0027s own statements and 7 belong to 3 function literals 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/TransformPane.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"85746bd839577ded834d6195c352353b5840990374e62b1b5ff2f5e398056247"}},{"ruleId":"D2","level":"warning","message":{"text":"documentModel.createDocumentModel::prepareInsert (cognitive 20): documentModel.createDocumentModel::prepareInsert has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 4, loops 2, ternaries 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. This shape REPEATS in the file: 3 other methods here (documentModel.createDocumentModel::prepareReorder, documentModel.createDocumentModel::checkReparent, documentModel.createDocumentModel::preparePatchConfigBatch) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 4 times rather than 4 independent problems. Splitting this body alone leaves the other 3 exactly as they are. Where these are variations on one operation, the change that clears all 4 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts"},"region":{"startLine":530}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8f8b86ef64510a3fb6ecf0a6411766ca71d39a8fc2407209ef19e0a8d4dca69"}},{"ruleId":"D2","level":"warning","message":{"text":"shapeRasterizer.buildParametricShapePath (cognitive 20): shapeRasterizer.buildParametricShapePath has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (11 pts), ternaries 3 (7 pts), loops 1 (2 pts) (nesting depth added 8). Of this number, 17 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterizers/shapeRasterizer.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"737a27f2b1bcf64a502d813badcc0c44d2b1ca1186aa3adb50e6fb8bfe6af2ad"}},{"ruleId":"D2","level":"warning","message":{"text":"workbenchStore.recordDiagnosticForAction (cognitive 20): workbenchStore.recordDiagnosticForAction has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 5 (11 pts), if/else 4 (8 pts), match/switch 1 (nesting depth added 10). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/workbenchStore.ts"},"region":{"startLine":744}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7aae687afd434a89065b6b6adb6595a52a43223bd0f85947350514fcc55caba"}},{"ruleId":"D2","level":"warning","message":{"text":"invocationSubmit.submitResolvedInvocation (cognitive 20): invocationSubmit.submitResolvedInvocation has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (10 pts), ternaries 4 (6 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":"invokeai/frontend/webv2/src/workbench/invocationSubmit.ts"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"204606e5b63fa8b1b257dd79f4f55ce0524a9e686721ebb3434402542dbaa3c9"}},{"ruleId":"D2","level":"warning","message":{"text":"MaskLayerController.invert (cognitive 20): MaskLayerController.invert has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11, ternaries 5 (6 pts), boolean chains 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskLayerController.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0a1d4af5a286f4e9cab3d826a58c1cfc21fd3633ceea510133d75200b2080de"}},{"ruleId":"D2","level":"warning","message":{"text":"StructuralLayerController.beginPreview (cognitive 20): StructuralLayerController.beginPreview has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11, boolean chains 6, ternaries 3. Most of this is not in the body itself: 1 of the 20 points is its own statement and the rest belongs to 7 function items inside it that branch (a function literal at line 225, a function literal at line 257, flushPending, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/structuralLayerController.ts"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"51ad9768c1d607a7f46c68f606837e66601b901f658cf0ba32ad00b1b5aa067f"}},{"ruleId":"D2","level":"warning","message":{"text":"engine.createCanvasEngine::getDuplicateRasterPlan (cognitive 20): engine.createCanvasEngine::getDuplicateRasterPlan has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (11 pts), boolean chains 8, ternaries 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts"},"region":{"startLine":2149}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe85ffc01be0f18b04ee0ac2d24a731db9a451cf0aeed24cd6204e03ecc068f0"}},{"ruleId":"D2","level":"warning","message":{"text":"filterOperationSession.createFilterOperationSession.commit (cognitive 20): filterOperationSession.createFilterOperationSession.commit has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 5, ternaries 2, error handling 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/filterOperationSession.ts"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"af5fb055a9bfdb4813e31fd537fac6c24f1253a3dfe36e9a9ed9f61dca4c230c"}},{"ruleId":"D2","level":"warning","message":{"text":"SelectObjectCoordinator.createSelectObjectOperationCoordinator.apply (cognitive 20): SelectObjectCoordinator.createSelectObjectOperationCoordinator.apply has cognitive complexity 20 (threshold 15). Drivers by points: if/else 12 (14 pts), ternaries 2 (4 pts), boolean chains 1, error handling 1 (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":"invokeai/frontend/webv2/src/workbench/canvas-operations/SelectObjectCoordinator.ts"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbf5af71c4bb3a2369ad88ee6a3b453c2cba1fc98ed0e9f995745637b8a8493f"}},{"ruleId":"D2","level":"warning","message":{"text":"resolve.getScopePriority (cognitive 20): resolve.getScopePriority has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 4 (9 pts), if/else 5 (6 pts), boolean chains 5 (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":"invokeai/frontend/webv2/src/workbench/hotkeys/resolve.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fe4b34e7c03ce8db2732734bdc6f855c3218f4a16cff27894a90509c7503854"}},{"ruleId":"D2","level":"warning","message":{"text":"videoRecall.getRecallableReferences (cognitive 20): videoRecall.getRecallableReferences has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 5 (10 pts), boolean chains 6, if/else 4 (nesting depth added 5). Most of this is not in the body itself: 2 of the 20 points are its own statements and the rest belongs to one function literal inside it that branches (line 446). 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":"invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"a36b6cbe0552dceb4983db21d5022f48dfb6f533435f2669fec1c69ce77e5dd7"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageContextMenu.SingleItemMenuItems (cognitive 20): ImageContextMenu.SingleItemMenuItems has cognitive complexity 20 (threshold 15). Drivers by points: boolean chains 7, ternaries 7, if/else 6. Of this number, 14 points are the body\u0027s own statements and 6 belong to 6 function literals 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":"invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"2926f21a36e717cf425a83b174cc867d2dcd4141fbdf5c22169314aee19f5d53"}},{"ruleId":"D2","level":"warning","message":{"text":"entries.buildProviderSectionRows (cognitive 20): entries.buildProviderSectionRows has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 3 (7 pts), if/else 3 (6 pts), boolean chains 4, loops 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":"invokeai/frontend/webv2/src/workbench/palette/entries.ts"},"region":{"startLine":610}}}],"partialFingerprints":{"codehealthFindingId/v1":"37a93ca0e847c12e86eae7e591a5f6e4cf5372940e3646492bf53fdb3e694119"}},{"ruleId":"D2","level":"warning","message":{"text":"importProject.readInvkArchive (cognitive 20): importProject.readInvkArchive has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (11 pts), ternaries 4, loops 2 (3 pts), boolean chains 1, error handling 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/importProject.ts"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fdf1dc749e4608a48e48959dd34597cb63beb2586f35af3d73893536b513a3b"}},{"ruleId":"D2","level":"warning","message":{"text":"unloadJournal.scenarios.createUnloadJournalServer (cognitive 20): unloadJournal.scenarios.createUnloadJournalServer has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11 (12 pts), ternaries 6, boolean chains 2 (nesting depth added 1). None of this is in the body itself: all 20 points belong to 6 function items inside it that branch (a function literal at line 124, a function literal at line 50, a function literal at line 97, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a72f2e7c22adece9623955d46cfdcda54fb62dcbdba68207a0e4fa1a43ea846"}},{"ruleId":"D2","level":"warning","message":{"text":"useProjectActions.useProjectActions.closeProject (cognitive 20): useProjectActions.useProjectActions.closeProject has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (16 pts), boolean chains 2, error handling 1, loops 1 (nesting depth added 7). Most of this is not in the body itself: 1 of the 20 points is its own statement and the rest belongs to 3 function items inside it that branch (a function literal at line 173, persistCanvasPixels, a function literal at line 211). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/useProjectActions.ts"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"12cea16bcce0577020c84eb418fe597c5ba2e37b70a557fa7673bc57ae6f697b"}},{"ruleId":"D2","level":"warning","message":{"text":"custom_nodes._import_workflows_from_pack (cognitive 19): custom_nodes._import_workflows_from_pack has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (12 pts), ternaries 1 (3 pts), error handling 1 (2 pts), boolean chains 1, 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":"invokeai/app/api/routers/custom_nodes.py"},"region":{"startLine":460}}}],"partialFingerprints":{"codehealthFindingId/v1":"45f5964ef8e0bd754c0e9e1c315fdae9d32f5528836ce9c1a0429b1f25e9ea1f"}},{"ruleId":"D2","level":"warning","message":{"text":"recall_parameters._assert_recall_image_access (cognitive 19): recall_parameters._assert_recall_image_access has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (12 pts), loops 4 (7 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":"invokeai/app/api/routers/recall_parameters.py"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf7131180367548759ef055f7470dd1b2c0f9196546db4921526a0786916519b"}},{"ruleId":"D2","level":"warning","message":{"text":"utilities.list_user_fonts (cognitive 19): utilities.list_user_fonts has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (12 pts), loops 3 (4 pts), boolean chains 3 (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":"invokeai/app/api/routers/utilities.py"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"9352525e6f416b915cb9b0cd8f0af9076c33a1b8176d969b8c04e169d1aecd50"}},{"ruleId":"D2","level":"warning","message":{"text":"workflows.list_workflows (cognitive 19): workflows.list_workflows has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (9 pts), boolean chains 4, ternaries 2 (3 pts), error handling 1 (2 pts), loops 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":"invokeai/app/api/routers/workflows.py"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"104b085f51c7ec6f9b012a3dd2083dbf4ad423b3a0efa7875c1e835786cf2ef0"}},{"ruleId":"D2","level":"warning","message":{"text":"SlidingWindowTokenMiddleware.dispatch (cognitive 19): SlidingWindowTokenMiddleware.dispatch has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (15 pts), error handling 1 (3 pts), boolean chains 1 (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":"invokeai/app/api_app.py"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"f46307c117c4a54beaaf8b62868523f05cd97d59f7e7534bd50b10edf3fadace"}},{"ruleId":"D2","level":"warning","message":{"text":"QwenImagePiDDecodeInvocation.invoke (cognitive 19): QwenImagePiDDecodeInvocation.invoke has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (11 pts), ternaries 3 (5 pts), boolean chains 3 (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":"invokeai/app/invocations/pid/qwen_image_pid_decode.py"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"017f927b71569e9557a3e5e2dbe47bd9b60b07978e1f798f003c46709a93880f"}},{"ruleId":"D2","level":"warning","message":{"text":"WanLoRACollectionLoader.invoke (cognitive 19): WanLoRACollectionLoader.invoke has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 3, loops 1, 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":"invokeai/app/invocations/wan/wan_lora_loader.py"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"49c6b03f038ed38174cf307a3e4fd0643feffc768a8d1f042e3f502401254447"}},{"ruleId":"D2","level":"warning","message":{"text":"AlibabaCloudProvider._parse_sync_response (cognitive 19): AlibabaCloudProvider._parse_sync_response has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (15 pts), loops 2 (3 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":"invokeai/app/services/external_generation/providers/alibabacloud.py"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed12c49ad7da548b7f49e45fe5e71835166c9fbf5817a82cd2f8417c6c5b6c05"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageIndexService._process_projection (cognitive 19): ImageIndexService._process_projection has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6, error handling 5, ternaries 3 (5 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1575}}}],"partialFingerprints":{"codehealthFindingId/v1":"5630ff2993a1d554cb64ca6046f0a70a8a76e2e7bb42191b7b9f1007f26c6d46"}},{"ruleId":"D2","level":"warning","message":{"text":"OrphanedModelsService.delete_orphaned_models (cognitive 19): OrphanedModelsService.delete_orphaned_models has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (10 pts), error handling 4 (8 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":"invokeai/app/services/orphaned_models/orphaned_models_service.py"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"74d6de019468e0c539befa5058881819d897fcd683513b0609dfc5205589e98a"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowCallQueueLifecycle.apply_execution_effects (cognitive 19): WorkflowCallQueueLifecycle.apply_execution_effects has cognitive complexity 19 (threshold 15). Drivers by points: if/else 14 (16 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/session_processor/workflow_call_runtime.py"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"083053e02a4eac7317f75da7fda240e76afcb3644d978dbb1298534ad3fca65f"}},{"ruleId":"D2","level":"warning","message":{"text":"ContinuationRecord.transition (cognitive 19): ContinuationRecord.transition has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (16 pts), boolean chains 3 (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":"invokeai/app/services/shared/execution_engine/primitives.py"},"region":{"startLine":470}}}],"partialFingerprints":{"codehealthFindingId/v1":"77eca82d741a720ff713e20a7e25cbbb262ab200caff0cb86944c34e4d61b90e"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._update_prepared_for_index (cognitive 19): GraphExecutionState._update_prepared_for_index has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (15 pts), boolean chains 4 (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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":3331}}}],"partialFingerprints":{"codehealthFindingId/v1":"58a2adac7a369330d72e04a08d3ac1bc9746e457b508a503153bf558cd0c0c91"}},{"ruleId":"D2","level":"warning","message":{"text":"users_common.validate_email_with_special_domains (cognitive 19): users_common.validate_email_with_special_domains has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (15 pts), boolean chains 3, error handling 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":"invokeai/app/services/users/users_common.py"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dbe80eef315d1d0fb188d3209c02dc31a6ad351f96e601d97cf2e41262e77fb"}},{"ruleId":"D2","level":"warning","message":{"text":"Main_SDNQ_Diffusers_Flux2_Config._get_submodels (cognitive 19): Main_SDNQ_Diffusers_Flux2_Config._get_submodels has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 2, match/switch 1 (2 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. This shape REPEATS in the file: one other method here (Main_SDNQ_Diffusers_ZImage_Config._get_submodels) 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":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":3568}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd7ba834dc53d94ccaebcdcb31051161a6d96842a4ddba477f41f61f5fb62499"}},{"ruleId":"D2","level":"warning","message":{"text":"Main_SDNQ_Diffusers_ZImage_Config._get_submodels (cognitive 19): Main_SDNQ_Diffusers_ZImage_Config._get_submodels has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 2, match/switch 1 (2 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. This shape REPEATS in the file: one other method here (Main_SDNQ_Diffusers_Flux2_Config._get_submodels) 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":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":3722}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3537fb4793c87f605c28be10b5e7be6c405e75a15d17dfeec0692540838d718"}},{"ruleId":"D2","level":"warning","message":{"text":"qwen3_encoder._has_qwen3_keys (cognitive 19): qwen3_encoder._has_qwen3_keys has cognitive complexity 19 (threshold 15). Drivers by points: if/else 3 (10 pts), loops 3 (7 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":"invokeai/backend/model_manager/configs/qwen3_encoder.py"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f0479b3b83ef406b76e5e09451e113239af940a2e50cb6856df1590629e5c51"}},{"ruleId":"D2","level":"warning","message":{"text":"ZImageControlCheckpointModel._load_control_adapter (cognitive 19): ZImageControlCheckpointModel._load_control_adapter has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (12 pts), ternaries 3, boolean chains 2, 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":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":1035}}}],"partialFingerprints":{"codehealthFindingId/v1":"89d70d3189133853c93fa321d7f8d49c2a0d6c7889a0b9842ba795271d7215db"}},{"ruleId":"D2","level":"warning","message":{"text":"flux_onetrainer_bfl_lora_conversion_utils.lora_model_from_flux_onetrainer_bfl_state_dict (cognitive 19): flux_onetrainer_bfl_lora_conversion_utils.lora_model_from_flux_onetrainer_bfl_state_dict has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 5 (6 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":"invokeai/backend/patches/lora_conversions/flux_onetrainer_bfl_lora_conversion_utils.py"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"18bde1e777f0304bd065da3571a862a97273e289c9ad052b20c054c0c205ec95"}},{"ruleId":"D2","level":"warning","message":{"text":"krea2_lora_conversion_utils._get_lora_layer_values (cognitive 19): krea2_lora_conversion_utils._get_lora_layer_values has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (16 pts), loops 1 (2 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":"invokeai/backend/patches/lora_conversions/krea2_lora_conversion_utils.py"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"99613c541ca4ba56271c5c9d71141799e7de3c56f02255d73cb5c1fec1a6f5aa"}},{"ruleId":"D2","level":"warning","message":{"text":"z_image_lora_conversion_utils.lora_model_from_z_image_state_dict (cognitive 19): z_image_lora_conversion_utils.lora_model_from_z_image_state_dict has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 3 (6 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":"invokeai/backend/patches/lora_conversions/z_image_lora_conversion_utils.py"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"73f99d6f5c1c18e8b6b694b3bec7ba1042c23e77ad559a60d1add1c0f6079fee"}},{"ruleId":"D2","level":"warning","message":{"text":"UNetAttentionPatcher._prepare_attention_processors (cognitive 19): UNetAttentionPatcher._prepare_attention_processors has cognitive complexity 19 (threshold 15). Drivers by points: if/else 3 (8 pts), loops 3 (8 pts), boolean chains 3 (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":"invokeai/backend/stable_diffusion/diffusion/unet_attention_patcher.py"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f49212fdd8f82fc26a937cbbd25056af0152cb2835c7d43a5b81896b873e7eb"}},{"ruleId":"D2","level":"warning","message":{"text":"LoginPage.LoginPage (cognitive 19): LoginPage.LoginPage has cognitive complexity 19 (threshold 15). Drivers by points: boolean chains 11, if/else 4, ternaries 2 (3 pts), error handling 1 (nesting depth added 1). Of this number, 11 points are the body\u0027s own statements and 8 belong to 3 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":"invokeai/frontend/webv1/src/features/auth/components/LoginPage.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"6487a744a99c9c2a3e2b416afae4ff423408a1c85035b9fe37a8f19e34875412"}},{"ruleId":"D2","level":"warning","message":{"text":"RefImageImage.RefImageImage (cognitive 19): RefImageImage.RefImageImage has cognitive complexity 19 (threshold 15). Drivers by points: boolean chains 11, if/else 7, ternaries 1. Most of this is not in the body itself: 6 of the 19 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 82, 59, 106, \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":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bcf668216336d7bc7cd1dfafee77dad3ae69d51c3ac7908e390c049b4420c78"}},{"ruleId":"D2","level":"warning","message":{"text":"shared.getOutputImageNames (cognitive 19): shared.getOutputImageNames has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (10 pts), loops 3 (7 pts), ternaries 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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/shared.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e6ebfabd857c0a49fc472b44c5907cc1f4f3d9581d89ad3b5a07d4e4c1469d0"}},{"ruleId":"D2","level":"warning","message":{"text":"dnd.canMoveFromSourceBoard (cognitive 19): dnd.canMoveFromSourceBoard has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (16 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":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":513}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1bf63d457e69a3bbb8d89e407e7c2f8c5ba177dc83f599074c72b0be6ecd74d"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryVideoItem.buildOnClick (cognitive 19): GalleryVideoItem.buildOnClick has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (15 pts), boolean chains 4 (nesting depth added 5). None of this is in the body itself: all 19 points belong to one function literal inside it that branches (line 44). 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":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"66111ba28362207679d316ff5d0c86609a47c4a8447af1f791a8e632421b2786"}},{"ruleId":"D2","level":"warning","message":{"text":"CurrentImagePreview.CurrentImagePreview (cognitive 19): CurrentImagePreview.CurrentImagePreview has cognitive complexity 19 (threshold 15). Drivers by points: boolean chains 12, if/else 7. Most of this is not in the body itself: 8 of the 19 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 68, 143, 80). 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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b63e0ba5cd68fa49507e2add04c4adc1e55015a9f48a0eebd5f0aba2dbbf70a"}},{"ruleId":"D2","level":"warning","message":{"text":"MainModelDefaultSettings.MainModelDefaultSettings (cognitive 19): MainModelDefaultSettings.MainModelDefaultSettings has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 10, boolean chains 7, if/else 2. Most of this is not in the body itself: 7 of the 19 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 84, 115). 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"87504a0d5e052df5a1b9503d09bb7b0b5f177c9e00d836d8104f5c56043b3ff4"}},{"ruleId":"D2","level":"warning","message":{"text":"use-collapsible-gridview-panel.useCollapsibleGridviewPanel (cognitive 19): use-collapsible-gridview-panel.useCollapsibleGridviewPanel has cognitive complexity 19 (threshold 15). Drivers by points: if/else 13, boolean chains 6. None of this is in the body itself: all 19 points belong to 4 function literals inside it that branch (lines 49, 29, 72, \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":"invokeai/frontend/webv1/src/features/ui/layouts/use-collapsible-gridview-panel.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5a037028fe91bb962c787b74ad4305bf64538c72ab41dbf3d7b0307204eb06d"}},{"ruleId":"D2","level":"warning","message":{"text":"workflowExecutionState.transitionWorkflowExecutionState (cognitive 19): workflowExecutionState.transitionWorkflowExecutionState has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 3, loops 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":"invokeai/frontend/webv1/src/services/events/workflowExecutionState.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"b57cfeba84d7453479d623a0690cc9fbf784a6a8d98cf81485dcc3e49ed3f2af"}},{"ruleId":"D2","level":"warning","message":{"text":"GenerationUiAdapter.getQueueInsights (cognitive 19): GenerationUiAdapter.getQueueInsights has cognitive complexity 19 (threshold 15). Drivers by points: if/else 3 (6 pts), loops 3 (5 pts), boolean chains 4, ternaries 3 (4 pts) (nesting depth added 6). Of this number, 15 points are the body\u0027s own statements and 4 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":"invokeai/frontend/webv2/src/app/GenerationUiAdapter.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2c0d5639f8daf66e201972d6515727bbc3228e60df85ea7db6fd4c21a760262"}},{"ruleId":"D2","level":"warning","message":{"text":"tsSourceAnalysis.collectTypographyLiterals::collectValue (cognitive 19): tsSourceAnalysis.collectTypographyLiterals::collectValue has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 3, loops 1 (2 pts) (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/architecture/tsSourceAnalysis.ts"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e682fa3f3e938a12d41d1e9edf6d0e19ae9ae1f5e9e02819374e3391123f154"}},{"ruleId":"D2","level":"warning","message":{"text":"PromptTemplatesPanel.PromptTemplatesPanel (cognitive 19): PromptTemplatesPanel.PromptTemplatesPanel has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 7 (13 pts), boolean chains 3, if/else 2, error handling 1 (nesting depth added 6). 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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplatesPanel.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"a47d9bd41180139918d9fe80a581666d356512cdbe66da58ad6cfda60f489586"}},{"ruleId":"D2","level":"warning","message":{"text":"generationMeta.extractGenerationMeta (cognitive 19): generationMeta.extractGenerationMeta has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (11 pts), boolean chains 6, loops 2 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/core/generationMeta.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"02056392e25228d336a710a420a9ddf27fe572004451fd008bbfb2627cf71b55"}},{"ruleId":"D2","level":"warning","message":{"text":"settings.syncUpscaleWidgetValuesWithModels (cognitive 19): settings.syncUpscaleWidgetValuesWithModels has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 13 (15 pts), boolean chains 3, if/else 1 (nesting depth added 2). Of this number, 15 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/core/settings.ts"},"region":{"startLine":860}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce5e56e725586c13cbe46393a2ea23ddc9af52aad3f284381b6fe3e3aacbc1e0"}},{"ruleId":"D2","level":"warning","message":{"text":"validation.validateConnectionTypes (cognitive 19): validation.validateConnectionTypes has cognitive complexity 19 (threshold 15). Drivers by points: boolean chains 17, if/else 2. 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":"invokeai/frontend/webv2/src/features/workflow/core/validation.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bce9894b7111f27d157f37de6b6f62cd856059af7a207440b1d256668139075"}},{"ruleId":"D2","level":"warning","message":{"text":"forLoops.getForLoopBodyBoundaries (cognitive 19): forLoops.getForLoopBodyBoundaries has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 5, loops 2, ternaries 1 (nesting depth added 3). Most of this is not in the body itself: 8 of the 19 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 216, 218, 254). 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":"invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"daaa07b8b9cf65e32814d0af6badf2e3012a3b1ba14ccfe5a5af688da184c176"}},{"ruleId":"D2","level":"warning","message":{"text":"fields.getWorkflowFieldInvalidReason (cognitive 19): fields.getWorkflowFieldInvalidReason has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9, boolean chains 5, ternaries 3 (5 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/fields.ts"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"924c3e39735aedc1169ecc03668afcf70022bfdb9e8af438b3e9faff946df288"}},{"ruleId":"D2","level":"warning","message":{"text":"NodeContextMenu.NodeContextMenu (cognitive 19): NodeContextMenu.NodeContextMenu has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 7 (18 pts), if/else 1 (nesting depth added 11). Of this number, 17 points are the body\u0027s own statements and 2 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/NodeContextMenu.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"3481ad5ff204e3f579b7b0f8e19d59b607ae5aba3e116a9d29b0456555d26b1b"}},{"ruleId":"D2","level":"warning","message":{"text":"NumericInput.NumericInput (cognitive 19): NumericInput.NumericInput has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 6 (9 pts), boolean chains 5, if/else 5 (nesting depth added 3). Of this number, 13 points are the body\u0027s own statements and 6 belong to 3 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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/NumericInput.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7e62db507ca2dddd99047d9079b63b08f23042e746f821198d8a9c378f0ec7e"}},{"ruleId":"D2","level":"warning","message":{"text":"http.getValidationIssueMessage (cognitive 19): http.getValidationIssueMessage has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 5 (9 pts), boolean chains 5, if/else 4 (5 pts) (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/transport/http.ts"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3b87e64e7f04aa880ab6ce7eaf42a87d693813c05fbd5cbc9d6b6120b067b44"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkbenchUnavailableScreen.WorkbenchUnavailableScreen (cognitive 19): WorkbenchUnavailableScreen.WorkbenchUnavailableScreen has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 7 (11 pts), if/else 5 (6 pts), boolean chains 1, error handling 1 (nesting depth added 5). Most of this is not in the body itself: 8 of the 19 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 57, 40, 75, \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":"invokeai/frontend/webv2/src/workbench/components/WorkbenchUnavailableScreen.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a8c2daf5644957c2f38d11cd87d5acfa0c5a04da8b7cdd17682714117c5da05"}},{"ruleId":"D2","level":"warning","message":{"text":"layerPanelState.selectLayerInPanel (cognitive 19): layerPanelState.selectLayerInPanel has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 5 (11 pts), if/else 5 (6 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":"invokeai/frontend/webv2/src/workbench/layerPanelState.ts"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7bc09464da08c32d8d03a50037c6f3a9a610cf796f1736900f2d73482fd75c4"}},{"ruleId":"D2","level":"warning","message":{"text":"indexedDbDraftStore.createIndexedDbProjectDraftStore.readRetargetedCopy (cognitive 19): indexedDbDraftStore.createIndexedDbProjectDraftStore.readRetargetedCopy has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7, ternaries 4 (7 pts), boolean chains 5 (nesting depth added 3). None of this is in the body itself: all 19 points belong to one function literal inside it that branches (line 200). 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7196638af45fa803ca2932f1396545c31f1658bf5f6092776dd4664cd833ffd"}},{"ruleId":"D2","level":"warning","message":{"text":"indexedDbDraftStore.createIndexedDbProjectDraftStore.deleteCorrupt (cognitive 19): indexedDbDraftStore.createIndexedDbProjectDraftStore.deleteCorrupt has cognitive complexity 19 (threshold 15). Drivers by points: boolean chains 12, ternaries 6, if/else 1. None of this is in the body itself: all 19 points belong to one function literal inside it that branches (line 559). 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":557}}}],"partialFingerprints":{"codehealthFindingId/v1":"82ccf97d60084b54f7accc5483fef512c7f0cdf32f8bf04cf2ba3b90f84e6588"}},{"ruleId":"D2","level":"warning","message":{"text":"projectHalves.joinProjectDocument (cognitive 19): projectHalves.joinProjectDocument has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 12, boolean chains 5, if/else 2. 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: 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":"invokeai/frontend/webv2/src/workbench/projects/projectHalves.ts"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"708f7f6c761d76827bcfc2fdb38389905df469b389a24564ad4a03df2b85c9d4"}},{"ruleId":"D2","level":"warning","message":{"text":"canvasStagingView.getCanvasStagingSlotsForQueueItem (cognitive 19): canvasStagingView.getCanvasStagingSlotsForQueueItem has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (15 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":"invokeai/frontend/webv2/src/workbench/canvasStagingView.ts"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d3951905bafa5d54a1631e4d25e428b18b856a917709afbe866ed214c23b795"}},{"ruleId":"D2","level":"warning","message":{"text":"layerTreeRows.buildLayerStackRows (cognitive 19): layerTreeRows.buildLayerStackRows has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (12 pts), boolean chains 4, ternaries 2, loops 1 (nesting depth added 6). Of this number, 18 points are the body\u0027s own statements and 1 belongs to one function item 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerTreeRows.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"809a0cf944516e82868346f7596f6480a51d7c2f9828a7fc5cfbba0de7c640bb"}},{"ruleId":"D2","level":"warning","message":{"text":"compositor.drawCachedLayer (cognitive 19): compositor.drawCachedLayer has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 5 (10 pts), if/else 5, 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositor.ts"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"f40f57a80622c855513bb856ff3e8d6fa823b8c1a5b08cc0cfe723361396c804"}},{"ruleId":"D2","level":"warning","message":{"text":"focusRegions.createWorkbenchFocusController.focusAdjacentRegion (cognitive 19): focusRegions.createWorkbenchFocusController.focusAdjacentRegion has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 8, boolean chains 6, if/else 4 (5 pts) (nesting depth added 1). Of this number, 14 points are the body\u0027s own statements and 5 belong to 3 function literals 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":"invokeai/frontend/webv2/src/workbench/focusRegions.tsx"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1a308aa4f2ed500d9060f8796a2ec33055940c72ff4dc12fac8c6b2cfd43491"}},{"ruleId":"D2","level":"warning","message":{"text":"previewPublisher.createPreviewPublisher.decodePreview (cognitive 19): previewPublisher.createPreviewPublisher.decodePreview has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (12 pts), ternaries 3 (6 pts), boolean chains 1 (nesting depth added 10). Of this number, 15 points are the body\u0027s own statements and 4 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/previewPublisher.ts"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"1410ec6561280ab9c342e7924edb71d8e7813601bcde49abb9b96a2d4b224186"}},{"ruleId":"D2","level":"warning","message":{"text":"groupSurfaceCache.createGroupSurfaceCache.drawnEntries (cognitive 19): groupSurfaceCache.createGroupSurfaceCache.drawnEntries has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 5 (11 pts), if/else 2 (4 pts), boolean chains 3, 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/groupSurfaceCache.ts"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6bfca141c1296a3dbb722b03f1b8b6f9ce3b2627010653b1105c5852913f9e3"}},{"ruleId":"D2","level":"warning","message":{"text":"importGalleryImages.importGalleryImagesToCanvas (cognitive 19): importGalleryImages.importGalleryImagesToCanvas has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 5, ternaries 2 (nesting depth added 2). Of this number, 18 points are the body\u0027s own statements and 1 belongs to one function item 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/importGalleryImages.ts"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"abc536f3ec59dbdd5fdf20e750d75388933658f90421af4972053efb4d7bbb7a"}},{"ruleId":"D2","level":"warning","message":{"text":"firstPartyCommands.useRegisterFirstPartyCommands (cognitive 19): firstPartyCommands.useRegisterFirstPartyCommands has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (10 pts), boolean chains 3, loops 3, ternaries 2, error handling 1 (nesting depth added 1). None of this is in the body itself: all 19 points belong to 9 function items inside it that branch (recallSelectedImage, a function literal at line 238, loadSelectedItemWorkflow, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/hotkeys/firstPartyCommands.ts"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"92cb9034a6d46aab5c3e5aa7ea448c6800e4cfbc5a5d0ff9be5bbe27a65e7b90"}},{"ruleId":"D2","level":"warning","message":{"text":"executeVideoRecall.placeVideoImage (cognitive 19): executeVideoRecall.placeVideoImage has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (8 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts"},"region":{"startLine":637}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ac8b9dfdc426892315816a0c6003336c8bbe9e0f7ee144ceea58da8adcbd673"}},{"ruleId":"D2","level":"warning","message":{"text":"MaxQueueHistorySettings.MaxQueueHistorySettings (cognitive 19): MaxQueueHistorySettings.MaxQueueHistorySettings has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 6 (7 pts), boolean chains 6, if/else 5, error handling 1 (nesting depth added 1). Of this number, 12 points are the body\u0027s own statements and 7 belong to 2 function literals 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":"invokeai/frontend/webv2/src/workbench/settings/MaxQueueHistorySettings.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4292c68bbb264b716a517387dab0476be1c810a6affaa883fd909614500ff7e"}},{"ruleId":"D2","level":"warning","message":{"text":"LayoutPresetStrip.PresetTab (cognitive 19): LayoutPresetStrip.PresetTab has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 11, if/else 5, boolean chains 3. Most of this is not in the body itself: 7 of the 19 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 390, 333, 352, \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":"invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetStrip.tsx"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"41136e172aeb8172654bf2ae07e3b33a3ce33d906e154f2e6cffd3db0c6a45f0"}},{"ruleId":"D2","level":"warning","message":{"text":"board_images.add_images_to_board (cognitive 18): board_images.add_images_to_board has cognitive complexity 18 (threshold 15). Drivers by points: error handling 7 (11 pts), if/else 1 (3 pts), loops 2 (3 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":"invokeai/app/api/routers/board_images.py"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"91ebcfae41edd92ab9a5945fdc0591d742eb5515697de370e2221848c724f28f"}},{"ruleId":"D2","level":"warning","message":{"text":"model_manager.get_starter_models (cognitive 18): model_manager.get_starter_models has cognitive complexity 18 (threshold 15). Drivers by points: loops 5 (9 pts), if/else 2 (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":"invokeai/app/api/routers/model_manager.py"},"region":{"startLine":1601}}}],"partialFingerprints":{"codehealthFindingId/v1":"e842c1fd88fb063510134d06697dd242f04fa85df1e7741f84bce1487a0e014a"}},{"ruleId":"D2","level":"warning","message":{"text":"Krea2LoRALoaderInvocation.invoke (cognitive 18): Krea2LoRALoaderInvocation.invoke has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9, boolean chains 5, ternaries 3 (4 pts) (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":"invokeai/app/invocations/krea2/krea2_lora_loader.py"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"418b01153f631acf457c4208073b39fe6ca293d8e54f9ee7984b3297d64d79a6"}},{"ruleId":"D2","level":"warning","message":{"text":"load_custom_nodes.load_custom_nodes (cognitive 18): load_custom_nodes.load_custom_nodes has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (11 pts), boolean chains 2, error handling 1 (2 pts), 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":"invokeai/app/invocations/load_custom_nodes.py"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"10dd9371c73ed45b0d753e13ec1b8237f9d5e7d8a38667023b00b39da1a734e2"}},{"ruleId":"D2","level":"warning","message":{"text":"DiskImageFileStorage.save (cognitive 18): DiskImageFileStorage.save has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (9 pts), error handling 2 (5 pts), boolean chains 2, loops 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":"invokeai/app/services/image_files/image_files_disk.py"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9341675e85084a056f772804bc1c360e423a90f4ca71a6c2821d5b6f59fd363"}},{"ruleId":"D2","level":"warning","message":{"text":"IntermediatesService._summary_rows (cognitive 18): IntermediatesService._summary_rows has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 6 (11 pts), if/else 4 (6 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":"invokeai/app/services/intermediates/intermediates_default.py"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"63d605a501d3b6b445368be09ce033b075ccc124e5860e976e086d3063811858"}},{"ruleId":"D2","level":"warning","message":{"text":"IntermediatesService._run (cognitive 18): IntermediatesService._run has cognitive complexity 18 (threshold 15). Drivers by points: if/else 3 (9 pts), error handling 1 (3 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":"invokeai/app/services/intermediates/intermediates_default.py"},"region":{"startLine":552}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cd8ea16208e35a718ffa9976e67780633d4aca75de9e596016f274fd53b4b2c"}},{"ruleId":"D2","level":"warning","message":{"text":"IntermediatesSizeMeasurer.measure_once (cognitive 18): IntermediatesSizeMeasurer.measure_once has cognitive complexity 18 (threshold 15). Drivers by points: if/else 4 (7 pts), error handling 2 (4 pts), loops 2 (3 pts), ternaries 1 (3 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":"invokeai/app/services/intermediates/intermediates_measurement.py"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f145e7ba1c639908c76bfa9d1df123971ca4fa74ee86d274e901f5536abd567"}},{"ruleId":"D2","level":"warning","message":{"text":"ExecutionScheduler.complete (cognitive 18): ExecutionScheduler.complete has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (15 pts), loops 2, boolean chains 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":"invokeai/app/services/shared/execution_engine/scheduler.py"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"39fc0ff3b2e84ff3721d78e8d323b1a8a0d0082e43a2868ff3fb14efb9bbae45"}},{"ruleId":"D2","level":"warning","message":{"text":"ExecutionScheduler.rebuild_ready (cognitive 18): ExecutionScheduler.rebuild_ready has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (11 pts), boolean chains 3, loops 2, ternaries 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":"invokeai/app/services/shared/execution_engine/scheduler.py"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef53b397945b70a69c96dcb5f077bcf53ddb90ae1b33247b462d09bab5ed4610"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._register_generic_child_dependency (cognitive 18): GraphExecutionState._register_generic_child_dependency has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (14 pts), boolean chains 3, loops 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":2126}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fb7ff09bda08f0708ed2d14db86ae1fdb27f53083863563328a5dc5d70bb77a"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_iterate_planner._prepare_body_iterate_collect_fan_in_unchecked (cognitive 18): graph_iterate_planner._prepare_body_iterate_collect_fan_in_unchecked has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (10 pts), loops 6 (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":"invokeai/app/services/shared/graph_iterate_planner.py"},"region":{"startLine":387}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa4f1dd51d3e1e8307cf0d6e018cc7ceed301ba8eda560500cfb5294627052a6"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionNodeBuilder._matches_sibling_if_collect_context (cognitive 18): _ExecutionNodeBuilder._matches_sibling_if_collect_context has cognitive complexity 18 (threshold 15). Drivers by points: if/else 4 (10 pts), ternaries 2 (4 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":1516}}}],"partialFingerprints":{"codehealthFindingId/v1":"539c6cfe8a73df973a47fca2191deec1247d1772f25a87cf6806f921fdc9fc2f"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionNodeBuilder._has_admitted_source_mapping (cognitive 18): _ExecutionNodeBuilder._has_admitted_source_mapping has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 3 (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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":1676}}}],"partialFingerprints":{"codehealthFindingId/v1":"16c9d944287934641aef82b55760a34a060786070ed726a7835d7b36191ec830"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionNodeBuilder._get_if_condition_iteration_mappings (cognitive 18): _ExecutionNodeBuilder._get_if_condition_iteration_mappings has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 4, loops 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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":1740}}}],"partialFingerprints":{"codehealthFindingId/v1":"33c61fdc6c3621d23480725cb4dbce9c8f581fd325ff692e2b02e9ea468e497c"}},{"ruleId":"D2","level":"warning","message":{"text":"Migration26Callback.__call__ (cognitive 18): Migration26Callback.__call__ has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (14 pts), error handling 1 (2 pts), boolean chains 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":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_26.py"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"30e59b5ba10b94497e6fa127501af87f65f128c4469e79e74c30addd16700c99"}},{"ruleId":"D2","level":"warning","message":{"text":"workflow_graph_builder.apply_workflow_inputs_to_workflow (cognitive 18): workflow_graph_builder.apply_workflow_inputs_to_workflow has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (15 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":"invokeai/app/services/shared/workflow_graph_builder.py"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"584b4f8bb5f72a35cdc9441e268bab181da35b623afc21b1ca0ae9bb5b4d2fc2"}},{"ruleId":"D2","level":"warning","message":{"text":"DiskVideoFileStorage.save (cognitive 18): DiskVideoFileStorage.save has cognitive complexity 18 (threshold 15). Drivers by points: error handling 5 (10 pts), if/else 7, boolean chains 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":"invokeai/app/services/video_files/video_files_disk.py"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"71f1e9af5999079307341d8482f6b5ffd712b68339ae766290a1fc7deafdfab3"}},{"ruleId":"D2","level":"warning","message":{"text":"KontextExtension._prepare_kontext (cognitive 18): KontextExtension._prepare_kontext has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (14 pts), error handling 1 (2 pts), boolean chains 1, 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":"invokeai/backend/flux/extensions/kontext_extension.py"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"751c6306c77728a584ac608d7618aae3d251269802f66c6d1af1bae94d21f031"}},{"ruleId":"D2","level":"warning","message":{"text":"Flux2RefImageExtension._prepare_ref_images (cognitive 18): Flux2RefImageExtension._prepare_ref_images has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 2, loops 1, 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":"invokeai/backend/flux2/ref_image_extension.py"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"12a91fa872c19f994e72e07e2e5a340aa29a1c25ed897a7694098d317e523c0f"}},{"ruleId":"D2","level":"warning","message":{"text":"mistral_encoder._count_mistral_layers (cognitive 18): mistral_encoder._count_mistral_layers has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (14 pts), boolean chains 2, loops 1, 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":"invokeai/backend/model_manager/configs/mistral_encoder.py"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c701762d39e659ac414a7557229e7bb12f6d3d2c62e22f10944b41f479f4353"}},{"ruleId":"D2","level":"warning","message":{"text":"qwen3_encoder._get_qwen3_variant_from_state_dict (cognitive 18): qwen3_encoder._get_qwen3_variant_from_state_dict has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (15 pts), boolean chains 2, loops 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":"invokeai/backend/model_manager/configs/qwen3_encoder.py"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ea3f2bc5d2b774d7df47f500b5388dd57e0b45ab4c2d7c8e9b13cee43402f9d"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelCache._offload_unlocked_models (cognitive 18): ModelCache._offload_unlocked_models has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (16 pts), boolean chains 1, 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":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2590}}}],"partialFingerprints":{"codehealthFindingId/v1":"69fcbe3a6a941387ef83290f50057115540918b8ef0e078614c2a9031c6f7a3f"}},{"ruleId":"D2","level":"warning","message":{"text":"flux2_state_dict_utils.convert_flux2_bfl_to_diffusers (cognitive 18): flux2_state_dict_utils.convert_flux2_bfl_to_diffusers has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (11 pts), loops 3 (5 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":"invokeai/backend/model_manager/load/model_loaders/flux2_state_dict_utils.py"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa912d32bffd745fcee629c4979750d93533c6cb4b914056a9365e189e500360"}},{"ruleId":"D2","level":"warning","message":{"text":"gemma2_encoder.load_gemma2_model_from_gguf (cognitive 18): gemma2_encoder.load_gemma2_model_from_gguf has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (10 pts), loops 3 (4 pts), ternaries 1 (3 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":"invokeai/backend/model_manager/load/model_loaders/gemma2_encoder.py"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"60a23ba871953b033199425dfdf5e0e0389f4bc5fc0c79788884121ed47a69c8"}},{"ruleId":"D2","level":"warning","message":{"text":"LTX2Gemma4EncoderModel._load_text_encoder (cognitive 18): LTX2Gemma4EncoderModel._load_text_encoder has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (13 pts), loops 3 (4 pts), ternaries 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":"invokeai/backend/model_manager/load/model_loaders/ltx2.py"},"region":{"startLine":485}}}],"partialFingerprints":{"codehealthFindingId/v1":"9aee3d7f3662ca11b8d4e8ebfcb6c68c9fd001e5ff94f0d845c55fae44320567"}},{"ruleId":"D2","level":"warning","message":{"text":"select_hf_files.filter_files (cognitive 18): select_hf_files.filter_files has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (15 pts), boolean chains 1, loops 1, ternaries 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":"invokeai/backend/model_manager/util/select_hf_files.py"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"44fbd7cee118c68cf09ad9811fa234b3cc8ec99a83af5b7e5ee11b867fc83964"}},{"ruleId":"D2","level":"warning","message":{"text":"flux_diffusers_lora_conversion_utils.is_state_dict_likely_in_flux_diffusers_format (cognitive 18): flux_diffusers_lora_conversion_utils.is_state_dict_likely_in_flux_diffusers_format has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 4, 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":"invokeai/backend/patches/lora_conversions/flux_diffusers_lora_conversion_utils.py"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4a51fadf3bd7fb54f4927f2dc6aec86fdda8db31925026e0b3eb8f57083208e"}},{"ruleId":"D2","level":"warning","message":{"text":"benchmark_database._seed (cognitive 18): benchmark_database._seed has cognitive complexity 18 (threshold 15). Drivers by points: loops 10, if/else 2 (4 pts), ternaries 2 (4 pts) (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/benchmark_database.py"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"38a84ff8b692719639a05018c4c2bc031afd5759525ec4c236cb7fcd05344b7f"}},{"ruleId":"D2","level":"warning","message":{"text":"calibrate_z_image_working_memory.report (cognitive 18): calibrate_z_image_working_memory.report has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (8 pts), loops 4 (6 pts), boolean chains 2, ternaries 2 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/calibrate_z_image_working_memory.py"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"081d6db2364020dd63df955eecf82e7d1435674e14e7fd853a22ef60689bad45"}},{"ruleId":"D2","level":"warning","message":{"text":"check_pins.check_pins (cognitive 18): check_pins.check_pins has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (9 pts), loops 6 (9 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/check_pins.py"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e7c29d6c8278fe6a99527c2620703fdaa53551a796d986fd585d8ae00513bea"}},{"ruleId":"D2","level":"warning","message":{"text":"addArchivedOrDeletedBoardListener.addArchivedOrDeletedBoardListener (cognitive 18): addArchivedOrDeletedBoardListener.addArchivedOrDeletedBoardListener has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 9, if/else 9. None of this is in the body itself: all 18 points belong to 4 function literals inside it that branch (lines 64, 26, 103, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/addArchivedOrDeletedBoardListener.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"2be468c7e9b934d5793ed5136054c6fe0a5900d7d94e8643bc85cc0d9e4f1174"}},{"ruleId":"D2","level":"warning","message":{"text":"promptAST.parseTokens::isUnquotedPromptFunctionAhead (cognitive 18): promptAST.parseTokens::isUnquotedPromptFunctionAhead has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (11 pts), loops 2 (5 pts), boolean chains 2 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body. This shape REPEATS in the file: 3 other methods here (promptAST.parseTokens::tryParsePromptFunction, promptAST.parseTokens::tryParseUnquotedPromptFunction, promptAST.parseTokens::parseGroup) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 4 times rather than 4 independent problems. Splitting this body alone leaves the other 3 exactly as they are. Where these are variations on one operation, the change that clears all 4 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":"invokeai/frontend/webv1/src/common/util/promptAST.ts"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"15f9dfa8659e602c3a455796ea19233838f5ab3d1300ca1e40e88109fb1c3f43"}},{"ruleId":"D2","level":"warning","message":{"text":"promptAttention.selectTerminals (cognitive 18): promptAttention.selectTerminals has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (10 pts), boolean chains 8 (nesting depth added 4). Most of this is not in the body itself: 4 of the 18 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 370, 396). 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":"invokeai/frontend/webv1/src/common/util/promptAttention.ts"},"region":{"startLine":369}}}],"partialFingerprints":{"codehealthFindingId/v1":"43a7a71cb304095fe2d3b0d9db4762d1990ace746b90beee79c2426aa2a60ac6"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryImageGrid.useStarImageHotkey (cognitive 18): GalleryImageGrid.useStarImageHotkey has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (13 pts), ternaries 4, boolean chains 1 (nesting depth added 4). Most of this is not in the body itself: 5 of the 18 points are its own statements and the rest belongs to one function literal inside it that branches (line 351). 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":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"605c67571d0716ac6806504366593fc0ae6c8f47d4533b08f8e02473843c09c2"}},{"ruleId":"D2","level":"warning","message":{"text":"fieldValidators.getFieldErrors (cognitive 18): fieldValidators.getFieldErrors has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (10 pts), boolean chains 8 (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":"invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"76c4a8c53ed3e7a4e28f31b1d7a7acf2cdd8bdd628232a1939b72bfc9c6ea7b3"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsGenerationDevices.DeviceTag (cognitive 18): SettingsGenerationDevices.DeviceTag has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (7 pts), ternaries 7, boolean chains 4 (nesting depth added 1). Of this number, 11 points are the body\u0027s own statements and 7 belong to 2 function literals 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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsGenerationDevices.tsx"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"6947bcef1e1e725ed7913b00f7fd9ca4ea51e5c310f6db5300791b2e225beee7"}},{"ruleId":"D2","level":"warning","message":{"text":"workflowExecutionCoordinator.createWorkflowExecutionCoordinator.onQueueItemStatusChanged (cognitive 18): workflowExecutionCoordinator.createWorkflowExecutionCoordinator.onQueueItemStatusChanged has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (14 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":"invokeai/frontend/webv1/src/services/events/workflowExecutionCoordinator.ts"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"a499d848ab84fefd219be2372b5c88ab4d0aa2094662b233b15e66446c5f4ec2"}},{"ruleId":"D2","level":"warning","message":{"text":"performance-budgets.checkBrowserRouteBudget (cognitive 18): performance-budgets.checkBrowserRouteBudget has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (9 pts), ternaries 3 (5 pts), boolean chains 2, loops 2 (nesting depth added 5). Of this number, 17 points are the body\u0027s own statements and 1 belongs to one function item 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":"invokeai/frontend/webv2/scripts/performance-budgets.mjs"},"region":{"startLine":810}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd48692c9e342d3f40b0b28f25db635c4cbf741a6767922980a215f14d97873b"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowUiAdapter.selectProjectPersistence (cognitive 18): WorkflowUiAdapter.selectProjectPersistence has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 6 (16 pts), boolean chains 2 (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":"invokeai/frontend/webv2/src/app/WorkflowUiAdapter.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"700512f8235e920ef7147ba770c3003f5795b4bdb5a9cb4c540f3c8bb5ea212c"}},{"ruleId":"D2","level":"warning","message":{"text":"compileCanvasGraph.compileCanvasGraph (cognitive 18): compileCanvasGraph.compileCanvasGraph has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (11 pts), boolean chains 5, ternaries 1 (2 pts) (nesting depth added 3). 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, 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":"invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts"},"region":{"startLine":728}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc87b69dd8e048b57b070f2928819e54b9759c8f0e15a22a27c1157f5a04312f"}},{"ruleId":"D2","level":"warning","message":{"text":"baseGenerationPolicies.getReferenceImageValidationReasons (cognitive 18): baseGenerationPolicies.getReferenceImageValidationReasons has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 4, ternaries 1 (2 pts) (nesting depth added 4). Most of this is not in the body itself: 4 of the 18 points are its own statements and the rest belongs to one function literal inside it that branches (line 1708). 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":"invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts"},"region":{"startLine":1695}}}],"partialFingerprints":{"codehealthFindingId/v1":"662bbc8373a9b93df170f2b997676be96a2fc82b7916ed3a58e2f53b6e71fb92"}},{"ruleId":"D2","level":"warning","message":{"text":"coordinator.createQueueCoordinator.handleStatusChanged (cognitive 18): coordinator.createQueueCoordinator.handleStatusChanged has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 4 (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":"invokeai/frontend/webv2/src/features/queue/runtime/coordinator.ts"},"region":{"startLine":771}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b5d2eff5aef218fc6168d99b373cf0fe564fc504ce23dfc60e693347659e12f"}},{"ruleId":"D2","level":"warning","message":{"text":"utilityGraph.reconcileUtilityCompletedOutput (cognitive 18): utilityGraph.reconcileUtilityCompletedOutput has cognitive complexity 18 (threshold 15). Drivers by points: if/else 4 (11 pts), boolean chains 4, loops 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":"invokeai/frontend/webv2/src/features/queue/runtime/utilityGraph.ts"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b1c64c8f152c94adab20aea9c133edcb65a8ed17b840fd8ef86000b047f2ff7"}},{"ruleId":"D2","level":"warning","message":{"text":"VideoModelField.VideoModelField (cognitive 18): VideoModelField.VideoModelField has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 8 (10 pts), if/else 6, boolean chains 2 (nesting depth added 2). Of this number, 10 points are the body\u0027s own statements and 8 belong to 4 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":"invokeai/frontend/webv2/src/features/video/ui/VideoModelField.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8199bcee4883915b7dc190c0a053e5304772442150bcf32ff4b75f7eb830dec"}},{"ruleId":"D2","level":"warning","message":{"text":"outputFields.formatOutputValue (cognitive 18): outputFields.formatOutputValue has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (10 pts), ternaries 2 (4 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":"invokeai/frontend/webv2/src/features/workflow/core/outputFields.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"df6553b570eb2e2093c2802a08ffb4b5f145db61cf0db767e8d60569eda1ffc5"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowLibraryGrid.WorkflowLibraryGrid (cognitive 18): WorkflowLibraryGrid.WorkflowLibraryGrid has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 7 (10 pts), boolean chains 5, if/else 3 (nesting depth added 3). Of this number, 10 points are the body\u0027s own statements and 8 belong to 3 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryGrid.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"3504222cb90be85fe354ca05e7f7163e177631ef258f4ac2d83efbd9f7fe11c4"}},{"ruleId":"D2","level":"warning","message":{"text":"Picker.PickerListbox (cognitive 18): Picker.PickerListbox has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 10 (14 pts), if/else 3, loops 1 (nesting depth added 4). Most of this is not in the body itself: 3 of the 18 points are its own statements and the rest belongs to 5 function items inside it that branch (a function literal at line 512, a function literal at line 408, a function literal at line 413, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/Picker.tsx"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc4944e397d4c5273ddc860dd69cd58a9158fcdcd480e5e725380abe2d568643"}},{"ruleId":"D2","level":"warning","message":{"text":"ResizableTextarea.ResizableTextarea (cognitive 18): ResizableTextarea.ResizableTextarea has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 8 (17 pts), if/else 1 (nesting depth added 9). Most of this is not in the body itself: 2 of the 18 points are its own statements and the rest belongs to one function literal inside it that branches (line 119). 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":"invokeai/frontend/webv2/src/platform/ui/ResizableTextarea.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3f7d2fadb7abbf53538639e97dd83bf208f3862474c72f5619b06ed3e22e84b"}},{"ruleId":"D2","level":"warning","message":{"text":"draftStore.decideUnloadJournalEntry (cognitive 18): draftStore.decideUnloadJournalEntry has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7, ternaries 5 (7 pts), boolean chains 4 (nesting depth added 2). Of this number, 17 points are the body\u0027s own statements and 1 belongs to one function item 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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":802}}}],"partialFingerprints":{"codehealthFindingId/v1":"996644a7ea77bef1ceb3002e5a6da188980cbc33957be5eb69416b1643f4fd29"}},{"ruleId":"D2","level":"warning","message":{"text":"draftStore.createMemoryProjectDraftStore.stage (cognitive 18): draftStore.createMemoryProjectDraftStore.stage has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (11 pts), boolean chains 4, ternaries 1 (3 pts) (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":1554}}}],"partialFingerprints":{"codehealthFindingId/v1":"71624e266bf13ee147cb07b314dfb6614f1d4d69020a1a64f4a4c7358a0cbaad"}},{"ruleId":"D2","level":"warning","message":{"text":"indexedDbDraftStore.createIndexedDbProjectDraftStore.settleAcknowledgement (cognitive 18): indexedDbDraftStore.createIndexedDbProjectDraftStore.settleAcknowledgement has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (10 pts), boolean chains 4, ternaries 3 (4 pts) (nesting depth added 2). Most of this is not in the body itself: 6 of the 18 points are its own statements and the rest belongs to one function literal inside it that branches (line 1135). 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":1125}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9c92594b6686bf761fba95c8741cd776d34c3277f70e2e6631ef144b95ea22b"}},{"ruleId":"D2","level":"warning","message":{"text":"projectAssets.createOpenProjectsHeldMediaReader::collectParts (cognitive 18): projectAssets.createOpenProjectsHeldMediaReader::collectParts has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (12 pts), boolean chains 4, loops 1, ternaries 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":"invokeai/frontend/webv2/src/workbench/projects/projectAssets.ts"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"2eb2289236d9a00e46b0d8832851fe7d091f97f13bc31fdbf680650cfa7b00ee"}},{"ruleId":"D2","level":"warning","message":{"text":"projectDocument.applyAuthoritativeProjectBoard (cognitive 18): projectDocument.applyAuthoritativeProjectBoard has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 4 (9 pts), if/else 3 (5 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":"invokeai/frontend/webv2/src/workbench/projects/projectDocument.ts"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"07a4548e628eca6dd719d01342a2cd883218348dbe3393ea8f36f90975030573"}},{"ruleId":"D2","level":"warning","message":{"text":"useStagedResultGallerySave.useStagedResultGallerySave.save::run (cognitive 18): useStagedResultGallerySave.useStagedResultGallerySave.save::run has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 5 (8 pts), if/else 6 (7 pts), boolean chains 2, error handling 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/useStagedResultGallerySave.ts"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfab7534043de9ee1342bb13669a8b3c69f5cbdcf48765422ab4b1b7e87050a9"}},{"ruleId":"D2","level":"warning","message":{"text":"layerChildRows.projectLayerChildRows (cognitive 18): layerChildRows.projectLayerChildRows has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 9, if/else 5, ternaries 2 (4 pts) (nesting depth added 2). Of this number, 17 points are the body\u0027s own statements and 1 belongs to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerChildRows.ts"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"85c2cf173b4635c1e04abebe6ad6256f81fe8e65f961e38ed0f39af59338cbab"}},{"ruleId":"D2","level":"warning","message":{"text":"layerChildRows.getLayerChildItem (cognitive 18): layerChildRows.getLayerChildItem has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (9 pts), boolean chains 5, ternaries 2 (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":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerChildRows.ts"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"35a021bbe0bea4a41466849c16f19d56e59d08144ce446552ffe8cf43e0192ff"}},{"ruleId":"D2","level":"warning","message":{"text":"LayerSection.resolveChildEditor (cognitive 18): LayerSection.resolveChildEditor has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 5, ternaries 1 (2 pts) (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/LayerSection.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"edb7503d3c70443064ad4ceebb94aefd37c1eb80c3c57cd5f048996834a7b48a"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectWidgetView.DetailsSection (cognitive 18): ProjectWidgetView.DetailsSection has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 5 (11 pts), if/else 2 (3 pts), boolean chains 2, error handling 1, loops 1 (nesting depth added 7). Of this number, 17 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":"invokeai/frontend/webv2/src/workbench/widgets/project/ProjectWidgetView.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c7463c8b183553f36aae73ee6162ed67ff8480ff6361b47a8ee3367c40fc232"}},{"ruleId":"D2","level":"warning","message":{"text":"layerStacks.moveSelectedIds (cognitive 18): layerStacks.moveSelectedIds has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (9 pts), loops 2 (4 pts), boolean chains 3, 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/layerStacks.ts"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"712abb8bc5024814cab77e79a891a542b5563b90af66886f661b7f69d06cc82d"}},{"ruleId":"D2","level":"warning","message":{"text":"workbenchState.removeGalleryItemsFromAllProjects (cognitive 18): workbenchState.removeGalleryItemsFromAllProjects has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 10, boolean chains 5, if/else 3. Most of this is not in the body itself: 2 of the 18 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 3020, 3058, 3005, \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":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":2996}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb279426b590f923ef9c05f72e5b98f358348af7ca6135ae9dc290da9d33ee04"}},{"ruleId":"D2","level":"warning","message":{"text":"workbenchStore.createCommands (cognitive 18): workbenchStore.createCommands has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11, ternaries 5, boolean chains 2. None of this is in the body itself: all 18 points belong to 10 function literals inside it that branch (lines 393, 425, 478, \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":"invokeai/frontend/webv2/src/workbench/workbenchStore.ts"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2d0515f37a038f70b2962fb0c04df64192de1eeac067862213d42d61a332c02"}},{"ruleId":"D2","level":"warning","message":{"text":"prepareCanvasInvocation.runCanvasInvocation (cognitive 18): prepareCanvasInvocation.runCanvasInvocation has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 6 (12 pts), if/else 4 (5 pts), error handling 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/invoke/prepareCanvasInvocation.ts"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6afddce91ca2bf3d1945bdec46ef5888aa392cf6300d1844e1063816debc14b"}},{"ruleId":"D2","level":"warning","message":{"text":"StagedResultController.commit (cognitive 18): StagedResultController.commit has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 7, if/else 6, ternaries 4, error handling 1. Of this number, 12 points are the body\u0027s own statements and 6 belong to 5 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/stagedResultController.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa1850e32711309821956357792860121fa1c224173e798f8a03c4a1b6fa4553"}},{"ruleId":"D2","level":"warning","message":{"text":"psdExport.executePsdExport (cognitive 18): psdExport.executePsdExport has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (10 pts), ternaries 3 (5 pts), loops 2, boolean chains 1 (nesting depth added 7). Most of this is not in the body itself: 4 of the 18 points are its own statements and the rest belongs to 2 function items inside it that branch (drawPreview, a function literal at line 440). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/export/psdExport.ts"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e6017635c9c855b1bb2219917b0b932830c36865ecbfe04f74ac9efe199665e"}},{"ruleId":"D2","level":"warning","message":{"text":"selectionState.createSelectionState.commit (cognitive 18): selectionState.createSelectionState.commit has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (8 pts), boolean chains 6, ternaries 3, match/switch 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionState.ts"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"990dfac18b921cee16e129fc7dafe34e3ea7864bde011bdd276ea36c5fbb403c"}},{"ruleId":"D2","level":"warning","message":{"text":"layerImageResult.processSelectObjectSource (cognitive 18): layerImageResult.processSelectObjectSource has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 3 (9 pts), if/else 6 (7 pts), boolean chains 1, error handling 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/layerImageResult.ts"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4919a1263859863e8ec578ec8930a6baf7d4af1580077bfbbbea7a558249565"}},{"ruleId":"D2","level":"warning","message":{"text":"queueRecall.buildVideoQueueRecallPatch (cognitive 18): queueRecall.buildVideoQueueRecallPatch has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (9 pts), ternaries 3 (6 pts), boolean chains 3 (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":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRecall.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"df0f445e5a4f41b4cd0f9cee38e8b6c9a2921a8d1f7f580fb0e2857da289d811"}},{"ruleId":"D2","level":"warning","message":{"text":"widgetDnd.widgetCollisionDetection (cognitive 18): widgetDnd.widgetCollisionDetection has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (14 pts), boolean chains 2, ternaries 2 (nesting depth added 8). Of this number, 16 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":"invokeai/frontend/webv2/src/workbench/widgetDnd.ts"},"region":{"startLine":347}}}],"partialFingerprints":{"codehealthFindingId/v1":"63c1872a7101059969cb66709bc0d3fa176ac62965d62a88c345c25e575e2ed2"}},{"ruleId":"D2","level":"warning","message":{"text":"useMaskTintEditor.useMaskTintEditor (cognitive 18): useMaskTintEditor.useMaskTintEditor has cognitive complexity 18 (threshold 15). Drivers by points: if/else 12, boolean chains 4, ternaries 2. None of this is in the body itself: all 18 points belong to 8 function literals inside it that branch (lines 54, 102, 63, \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/color-system/useMaskTintEditor.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"1679a6417513c04da590b90d1a586e2736297a50bb8a6e758a563f63360ca866"}},{"ruleId":"D2","level":"warning","message":{"text":"AdjustmentSettings.CurvesEditor (cognitive 18): AdjustmentSettings.CurvesEditor has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9, boolean chains 6, ternaries 2, loops 1. None of this is in the body itself: all 18 points belong to 8 function literals inside it that branch (lines 552, 526, 582, \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/AdjustmentSettings.tsx"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"a105a5b98de0872bc539735358e83d6fdea277005e26f20fb26ae069eb9b831b"}},{"ruleId":"D2","level":"warning","message":{"text":"image_map.get_image_map_points (cognitive 17): image_map.get_image_map_points 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":"invokeai/app/api/routers/image_map.py"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f0e98342019b5cff20c15812cf6fe9bc3716ed4a184cbb692ea7d0bfba8b02c"}},{"ruleId":"D2","level":"warning","message":{"text":"SocketIO._handle_queue_event (cognitive 17): SocketIO._handle_queue_event has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (13 pts), boolean chains 3, error handling 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":"invokeai/app/api/sockets.py"},"region":{"startLine":960}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6444586a085ecff6954724d6e04810ab28cba7064b23b67299d8be8caa99991"}},{"ruleId":"D2","level":"warning","message":{"text":"DownloadQueueService._download_next_item (cognitive 17): DownloadQueueService._download_next_item has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (10 pts), error handling 3 (6 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":"invokeai/app/services/download/download_default.py"},"region":{"startLine":387}}}],"partialFingerprints":{"codehealthFindingId/v1":"0eaf9f719e70de79ae4ee225145a718edef2515501d3718bb771db8a2ae63198"}},{"ruleId":"D2","level":"warning","message":{"text":"DownloadQueueService._mfd_error (cognitive 17): DownloadQueueService._mfd_error has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (14 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/download/download_default.py"},"region":{"startLine":896}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba7a77faf56339f09814c620e59159a37d3c6fe65918347c491c4c7938910a29"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageMoveService._complete_partial_filesystem_move (cognitive 17): ImageMoveService._complete_partial_filesystem_move has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 9, if/else 7 (8 pts) (nesting depth added 1). 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":"invokeai/app/services/image_moves/image_moves_default.py"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"68baa2616fb2f6c81a5cee362f7ecd8de6e2f4c7ce8d274c4f6474c2e6cf5fd5"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelInstallService.restart_failed (cognitive 17): ModelInstallService.restart_failed has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8, boolean chains 5, ternaries 3, error handling 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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":1324}}}],"partialFingerprints":{"codehealthFindingId/v1":"db4a83c3b49f71c17f4f605cc9760eb39086ba65a860236db2c4ecc3e55f27f4"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowCallQueueLifecycle._resume_parent_from_completed_child (cognitive 17): WorkflowCallQueueLifecycle._resume_parent_from_completed_child has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (13 pts), error handling 2 (3 pts), boolean chains 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":"invokeai/app/services/session_processor/workflow_call_runtime.py"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2689191839a5d09d3051860661a4f6fe873addf79bd04aa97620bd1eb05f5ae"}},{"ruleId":"D2","level":"warning","message":{"text":"Batch.validate_types (cognitive 17): Batch.validate_types has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (11 pts), loops 3 (6 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":"invokeai/app/services/session_queue/session_queue_common.py"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"650c3ca8e283696350b02e8993abeb0ef053ce04e83e19080cf1fdeb1cdbdf79"}},{"ruleId":"D2","level":"warning","message":{"text":"copy.find_oversized (cognitive 17): copy.find_oversized has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (10 pts), ternaries 1 (4 pts), loops 2 (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":"invokeai/app/services/shared/database/copy.py"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b1843b7110190cda6f7351e652e90ed1ddbd78b1a9931fdeb9552c6ae1e3161"}},{"ruleId":"D2","level":"warning","message":{"text":"images._conditions (cognitive 17): images._conditions has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (12 pts), ternaries 3 (5 pts) (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/queries/images.py"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d6a9ef9806d694e4a5c1756b115fbf4607317c5d63ae3032bb7886428acefd6"}},{"ruleId":"D2","level":"warning","message":{"text":"ExecutionScheduler.discard (cognitive 17): ExecutionScheduler.discard has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (14 pts), loops 2, boolean chains 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":"invokeai/app/services/shared/execution_engine/scheduler.py"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"bae9bcd3c264314b8299ad624d0b90a23fe19690248c55f607d58b0916af9f0b"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._validate_output_owner (cognitive 17): GraphExecutionState._validate_output_owner has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 5 (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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":2531}}}],"partialFingerprints":{"codehealthFindingId/v1":"71402a0adf36f123a1e5e12266f60c4523dfa98379602e20ff83a754cee38bfa"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionNodeBuilder._get_parent_iteration_mappings_without_iterators (cognitive 17): _ExecutionNodeBuilder._get_parent_iteration_mappings_without_iterators has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (12 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":1408}}}],"partialFingerprints":{"codehealthFindingId/v1":"96eae0eadd030ad81a21c3d95e989c5ef04cd29a06cb845d1c0a4b2f12a4f6d6"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionNodeBuilder._get_parent_iteration_mappings (cognitive 17): _ExecutionNodeBuilder._get_parent_iteration_mappings has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 2, 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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":1551}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e4ae471a69247d8cfff0c4de0e1c6185c80ada5c157bcf2e11432f2b772d97c"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionNodeBuilder._get_unexecuted_root_collect_if_descendants (cognitive 17): _ExecutionNodeBuilder._get_unexecuted_root_collect_if_descendants has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (12 pts), boolean chains 4, 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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":2348}}}],"partialFingerprints":{"codehealthFindingId/v1":"2107c9af603820f84fffec7d6c8bbc42b3b169eba88ddc931457c16e9d0a45f6"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_nested_iterate_planner._get_exact_nested_iterate_body (cognitive 17): graph_nested_iterate_planner._get_exact_nested_iterate_body has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (11 pts), boolean chains 4, ternaries 2 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_nested_iterate_planner.py"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"f84691abc603e2bbf6fbabec143884fe1c41b854b6865f678e2f22b6ff4c4904"}},{"ruleId":"D2","level":"warning","message":{"text":"_GenericGraphSchedulerAdapter.complete (cognitive 17): _GenericGraphSchedulerAdapter.complete has cognitive complexity 17 (threshold 15). Drivers by points: if/else 11 (12 pts), loops 4, boolean chains 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":"invokeai/app/services/shared/graph_scheduler.py"},"region":{"startLine":605}}}],"partialFingerprints":{"codehealthFindingId/v1":"69af3e7db59fbe95db9c77c67c2ddb1b9ff0408c7be37a4ced6c8fa7187e55ef"}},{"ruleId":"D2","level":"warning","message":{"text":"StoreEmbeddingsFp16Callback._convert_table (cognitive 17): StoreEmbeddingsFp16Callback._convert_table has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (11 pts), error handling 1 (3 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":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_09_30_store_embeddings_fp16.py"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"70f77800b620f0c4409411d95e4ac542caaabae51054e5e71d9c9eb444487ac5"}},{"ruleId":"D2","level":"warning","message":{"text":"Migration24Callback._normalize_model_storage (cognitive 17): Migration24Callback._normalize_model_storage has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (12 pts), error handling 2 (3 pts), ternaries 1 (2 pts) (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_24.py"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b968a98d4f14f9fbd8704bd8b8e88f27acf16c75f1b40634dabcde1f158a7ad"}},{"ruleId":"D2","level":"warning","message":{"text":"ssrf._parse_ipv4_literal (cognitive 17): ssrf._parse_ipv4_literal has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (9 pts), boolean chains 3, error handling 2 (3 pts), loops 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":"invokeai/app/util/ssrf.py"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"33f58da83f0d41b011cbe12136dee0e87d91c511c750de7d800a60ff3a4ebb3b"}},{"ruleId":"D2","level":"warning","message":{"text":"video_audio._probe_audio_sample_rate (cognitive 17): video_audio._probe_audio_sample_rate has cognitive complexity 17 (threshold 15). Drivers by points: error handling 2 (6 pts), if/else 2 (6 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":"invokeai/app/util/video_audio.py"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"c23cb7f5c98746db8d7b7c626404ea95d186671ee06ae887e35a35d2921e75a5"}},{"ruleId":"D2","level":"warning","message":{"text":"mediapipe_face_common.draw_pupils (cognitive 17): mediapipe_face_common.draw_pupils has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (12 pts), boolean chains 4, loops 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":"invokeai/backend/image_util/mediapipe_face/mediapipe_face_common.py"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"b706f4ad4f625e4a332f8252884099721868c133177a8798dc3728d753dd1b6f"}},{"ruleId":"D2","level":"warning","message":{"text":"PiDiNet.__init__ (cognitive 17): PiDiNet.__init__ has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (8 pts), loops 4 (8 pts), boolean chains 1 (nesting depth added 5). 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":"invokeai/backend/image_util/pidi/model.py"},"region":{"startLine":497}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fc38deb4a9200cdf0a4eebb75025e0bcf1d674fd5451b49ef24c6a686b528a7"}},{"ruleId":"D2","level":"warning","message":{"text":"SegmentAnything2Pipeline.segment (cognitive 17): SegmentAnything2Pipeline.segment has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (10 pts), loops 2 (4 pts), ternaries 3 (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":"invokeai/backend/image_util/segment_anything/segment_anything_2_pipeline.py"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"44f09ec5ca0024a6ac776430a4a18b6834bbc59ba9aa1c8398d3dbe9c939bdab"}},{"ruleId":"D2","level":"warning","message":{"text":"SegmentAnythingPipeline.segment (cognitive 17): SegmentAnythingPipeline.segment has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (10 pts), loops 2 (4 pts), ternaries 3 (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":"invokeai/backend/image_util/segment_anything/segment_anything_pipeline.py"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f48788b79d5a7506c833a11661470aafa51acfbbf61e8fa20d26c937f4de205"}},{"ruleId":"D2","level":"warning","message":{"text":"AutoencoderKLMiniMaxH3._decode (cognitive 17): AutoencoderKLMiniMaxH3._decode has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (11 pts), loops 2 (3 pts), ternaries 1 (2 pts), boolean chains 1 (nesting depth added 7). This file\u0027s own header attributes it to another copyright holder, so it is code this repository carries rather than code it wrote: restructuring the body in place forks it from upstream and turns every future re-sync into a manual merge. The performable moves are to leave the body as close to its upstream form as possible and keep it behind a narrow interface of your own, and to re-sync it when upstream changes \u2014 or, if it has already diverged far enough that you maintain it here, adopt it deliberately and then split the body into named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/minimax_h3/autoencoder_kl_minimax_h3.py"},"region":{"startLine":795}}}],"partialFingerprints":{"codehealthFindingId/v1":"6560597279929f19906575fd277ed581570e74f7d87d1a24891d306c41e84c95"}},{"ruleId":"D2","level":"warning","message":{"text":"main._is_flux2_model (cognitive 17): main._is_flux2_model has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (14 pts), loops 2, 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":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"14b6ff68c3ea06037d036f9008c4381b1b575990e9daaee7cf5326b391abec8e"}},{"ruleId":"D2","level":"warning","message":{"text":"main._sdnq_component_declared_classes (cognitive 17): main._sdnq_component_declared_classes has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 2 (3 pts), error handling 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":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":3364}}}],"partialFingerprints":{"codehealthFindingId/v1":"c13c3bbd820433ed1f894e7c022dad4cbdf2eb36b9a0faa9a9806f7b06a63c71"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelCache._load_locked_model (cognitive 17): ModelCache._load_locked_model has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (7 pts), boolean chains 5, ternaries 4 (5 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":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2085}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ee5f705ebc47b8e60b38d4db9f513888f375a4e71c3e23740cb653db996ee61"}},{"ruleId":"D2","level":"warning","message":{"text":"Flux2CheckpointModel._dequantize_fp8_weights (cognitive 17): Flux2CheckpointModel._dequantize_fp8_weights has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (10 pts), loops 5, 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":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":1551}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a69c8da224f497cf8ce7b11f0f206dcff7d211cdd9d3f89d6515378e1193d8b"}},{"ruleId":"D2","level":"warning","message":{"text":"HuggingFaceMetadata.download_urls (cognitive 17): HuggingFaceMetadata.download_urls has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (8 pts), error handling 2 (4 pts), boolean chains 3, ternaries 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":"invokeai/backend/model_manager/metadata/metadata_base.py"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"e16e13c54b1eaa8bfe7078d2c722da3e4433db72bfd037c4979f3689a910a89f"}},{"ruleId":"D2","level":"warning","message":{"text":"model_util.lora_token_vector_length (cognitive 17): model_util.lora_token_vector_length has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (11 pts), boolean chains 5, 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":"invokeai/backend/model_manager/util/model_util.py"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"02a30b71dd4d6347151e29187b28bb0caad544092184a1e7b27b5e350cfd0365"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelPatcher.apply_ti (cognitive 17): ModelPatcher.apply_ti has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (10 pts), loops 4 (6 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":"invokeai/backend/model_patcher.py"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"be3f106896bd7536247e35bb35709d0cea5298401efb7d68b016d7b511901900"}},{"ruleId":"D2","level":"warning","message":{"text":"LayerPatcher.apply_smart_model_patch (cognitive 17): LayerPatcher.apply_smart_model_patch has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (12 pts), boolean chains 2, error handling 1 (2 pts), 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":"invokeai/backend/patches/layer_patcher.py"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"4918af808c8e99067ad1e1c188e9f64bfa8686453c65cc393c14523995acce03"}},{"ruleId":"D2","level":"warning","message":{"text":"minimax_h3_lora_conversion_utils.lora_model_from_minimax_h3_state_dict (cognitive 17): minimax_h3_lora_conversion_utils.lora_model_from_minimax_h3_state_dict has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (12 pts), loops 2 (4 pts), error handling 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":"invokeai/backend/patches/lora_conversions/minimax_h3_lora_conversion_utils.py"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"a20c3ec444d7d2eeba10a818fe8a8686957d0dc20d14000cf65caf24c2aab96d"}},{"ruleId":"D2","level":"warning","message":{"text":"PidDistillModel.load_state_dict (cognitive 17): PidDistillModel.load_state_dict has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 3, loops 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":"invokeai/backend/pid/_src/models/pid_distill_model.py"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"43dcf74787ba8422333d93600287058f0f1a01a83099f2c73871025ca9eb1b91"}},{"ruleId":"D2","level":"warning","message":{"text":"check_platform_locks.walk_closure (cognitive 17): check_platform_locks.walk_closure has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (11 pts), loops 3 (6 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":"scripts/check_platform_locks.py"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"39eac5cb6d1dcc4cfcbf627ec31347934b78d54b439d2af04fcd8dcb556d2030"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasEntityAdapterInpaintMask.sync (cognitive 17): CanvasEntityAdapterInpaintMask.sync has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9, boolean chains 8. 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterInpaintMask.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f819c132dc6cd24b4f186207fbf6fcc4bdbbe22e9db258cf55e7daf1f16ddff"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasEntityAdapterRasterLayer.sync (cognitive 17): CanvasEntityAdapterRasterLayer.sync has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9, boolean chains 8. 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRasterLayer.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b3fd6b2fcce746296f85ebdfda5b7fb7fe3f4fc59434d6950043bf8c56dfc75"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasEntityAdapterRegionalGuidance.sync (cognitive 17): CanvasEntityAdapterRegionalGuidance.sync has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9, boolean chains 8. 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRegionalGuidance.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"92201751adf417c975bcb50a7c04b2a76ac93751551dbfab3cbed553429843a2"}},{"ruleId":"D2","level":"warning","message":{"text":"needsPixelBbox.objectStateNeedsPixelBbox (cognitive 17): needsPixelBbox.objectStateNeedsPixelBbox has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (11 pts), boolean chains 6 (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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/needsPixelBbox.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9c0b187b3728bceab2acafa5389dd41532ea1ada6452508417b267181ab52eb"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasEraserToolModule.onStagePointerDown (cognitive 17): CanvasEraserToolModule.onStagePointerDown has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (13 pts), boolean chains 4 (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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ff4830a550f2e6aefeb47e406ca8e367b473a0393a5bfd1da84742ee381c800"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasToolModule.getCanDraw (cognitive 17): CanvasToolModule.getCanDraw has cognitive complexity 17 (threshold 15). Drivers by points: if/else 13 (17 pts) (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts"},"region":{"startLine":458}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a616e6a55d8a5fb2e9b6c4076d57a393840ec3042aaa843a08253d769aa6be3"}},{"ruleId":"D2","level":"warning","message":{"text":"pressure.buildPressureStrokeRenderOps (cognitive 17): pressure.buildPressureStrokeRenderOps has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 3, loops 2 (3 pts) (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/pressure.ts"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2d33da1a54005d5328d195db090f38c4800f57af0d31110817af5244e83191b"}},{"ruleId":"D2","level":"warning","message":{"text":"paramsSlice.applyParamsVersionMigrations (cognitive 17): paramsSlice.applyParamsVersionMigrations has cognitive complexity 17 (threshold 15). Drivers by points: if/else 15 (16 pts), boolean chains 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":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":1080}}}],"partialFingerprints":{"codehealthFindingId/v1":"b75f377f142e57286fe49b0972b02289cf86d35b5d5699f6e639ea746a4d8ecc"}},{"ruleId":"D2","level":"warning","message":{"text":"validators.getControlLayerWarnings (cognitive 17): validators.getControlLayerWarnings has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 5 (nesting depth added 3). Of this number, 16 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb3b8aed26ad0d43aea0169e55628db4fc74f88f90293c3ea3a4214d4ce1a62d"}},{"ruleId":"D2","level":"warning","message":{"text":"Editor.createKonvaCropInteractionHandle (cognitive 17): Editor.createKonvaCropInteractionHandle has cognitive complexity 17 (threshold 15). Drivers by points: if/else 11 (12 pts), boolean chains 4, ternaries 1 (nesting depth added 1). None of this is in the body itself: all 17 points belong to 4 function literals inside it that branch (lines 446, 434, 466, \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":"invokeai/frontend/webv1/src/features/cropper/lib/editor.ts"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"0235e3531d2014db9463334d147d03b4a37fc000dd0cbbc48cb427c0ede2b4ff"}},{"ruleId":"D2","level":"warning","message":{"text":"selectedItemReveal.createSelectedItemRevealMachine.sync (cognitive 17): selectedItemReveal.createSelectedItemRevealMachine.sync has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 5 (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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/selectedItemReveal.ts"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ad4e5f12dace4e7e5e502f254bfa6093f677f6a86d007dc06a67f672a82ee52"}},{"ruleId":"D2","level":"warning","message":{"text":"AddNodeCmdk.useAddNode (cognitive 17): AddNodeCmdk.useAddNode has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (8 pts), ternaries 4 (8 pts), boolean chains 1 (nesting depth added 5). None of this is in the body itself: all 17 points belong to 3 function literals inside it that branch (lines 68, 90, 95). 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"54c9d2b4eae510ba458c0ce000a567cdda6dda7674d47a057965c8fdc6845584"}},{"ruleId":"D2","level":"warning","message":{"text":"AddNodeCmdk.filter (cognitive 17): AddNodeCmdk.filter has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (9 pts), boolean chains 7, 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"da6ac104ddad98c1717c49e50561abd55ea2b7b19f4c7a5f1bfbf429de00bd1d"}},{"ruleId":"D2","level":"warning","message":{"text":"getCollectItemType.getCollectItemType (cognitive 17): getCollectItemType.getCollectItemType has cognitive complexity 17 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 3 (nesting depth added 3). Most of this is not in the body itself: 1 of the 17 points is its own statement and the rest belongs to 3 function items inside it that branch (getCollectItemTypeInternal, a function literal at line 37, a function literal at line 55). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/util/getCollectItemType.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"9132402ec91d56586598164d7432a4423345175a05558f78f60feb3fb4214e5b"}},{"ruleId":"D2","level":"warning","message":{"text":"workflow.validateFormStructure (cognitive 17): workflow.validateFormStructure has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (14 pts), boolean chains 3 (nesting depth added 5). Most of this is not in the body itself: 2 of the 17 points are its own statements and the rest belongs to one function item inside it that branches (findChildren). 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":"invokeai/frontend/webv1/src/features/nodes/types/workflow.ts"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1ab31897eb976dbd4b8b4769bd811ba48576cd20a439b42fb415fcd6956cd18"}},{"ruleId":"D2","level":"warning","message":{"text":"ParamPositivePrompt.ParamPositivePrompt (cognitive 17): ParamPositivePrompt.ParamPositivePrompt has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (9 pts), boolean chains 7, loops 1 (nesting depth added 1). Most of this is not in the body itself: 4 of the 17 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 199, 291, 163, \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":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c5309be2cc33884b3c71bdc48be016fe460b4e0ae3959cc557c7654f4410cf8"}},{"ruleId":"D2","level":"warning","message":{"text":"readiness.pushWanReasons (cognitive 17): readiness.pushWanReasons has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 6 (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":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"f92c6d2beb9736179d471285f89b954ecc5672866b698ced1f1ce85b239936e8"}},{"ruleId":"D2","level":"warning","message":{"text":"controlValidation.getControlValidationReason (cognitive 17): controlValidation.getControlValidationReason has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10, boolean chains 5, ternaries 1 (2 pts) (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":"invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.ts"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7f4c1fc10c6f429ff2eeaa1d307d5b9a15b6eb0a0790eec335cc92d262cbc8a"}},{"ruleId":"D2","level":"warning","message":{"text":"ConceptRow.ConceptRowContent (cognitive 17): ConceptRow.ConceptRowContent has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 11 (14 pts), boolean chains 2, if/else 1 (nesting depth added 3). Of this number, 14 points are the body\u0027s own statements and 3 belong to 3 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/shared/ConceptRow.tsx"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa19ad69cd45a7cfdd978f45700d0660760cc7487fd8b2229c2023bbe9a7e9fd"}},{"ruleId":"D2","level":"warning","message":{"text":"settings.normalizeReferenceImageConfig (cognitive 17): settings.normalizeReferenceImageConfig has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 5 (10 pts), boolean chains 4, if/else 2, match/switch 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":"invokeai/frontend/webv2/src/features/generation/core/settings.ts"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"b46a98c1a4eed9e29eb37b3d40f0721d155f9b12db5519be2fd4fe9e940b14f6"}},{"ruleId":"D2","level":"warning","message":{"text":"settings.cloneGenerateWidgetValues (cognitive 17): settings.cloneGenerateWidgetValues has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 17. 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":"invokeai/frontend/webv2/src/features/generation/core/settings.ts"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"6eaa1ccf5f06874ceb1f51e156bea37d141bc6c8a360dca9d966c0620c9cc2c2"}},{"ruleId":"D2","level":"warning","message":{"text":"baseGenerationPolicies.getModelFamilyValidationReasons (cognitive 17): baseGenerationPolicies.getModelFamilyValidationReasons has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (9 pts), boolean chains 4, loops 2 (4 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":"invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts"},"region":{"startLine":1761}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5aaad91ab1d5cf46da5323ecc1ba9c66c12fbb743afa8e5ef05c12596df9225"}},{"ruleId":"D2","level":"warning","message":{"text":"ast.serializeInto (cognitive 17): ast.serializeInto has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (10 pts), loops 2 (5 pts), match/switch 1 (2 pts) (nesting depth added 10). 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":"invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"d871d95d151cce482d004d90a5e928bc9fdb61aa528420f7805dd108e0bf8890"}},{"ruleId":"D2","level":"warning","message":{"text":"ConditioningRebalanceBars.ConditioningRebalanceBars (cognitive 17): ConditioningRebalanceBars.ConditioningRebalanceBars has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 7, boolean chains 5, if/else 5. None of this is in the body itself: all 17 points belong to 4 function literals inside it that branch (lines 219, 162, 115, \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":"invokeai/frontend/webv2/src/features/generation/ui/shared/ConditioningRebalanceBars.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"18eeb0b81c7cf8a37265e7eceefe27e8058986c8c90a4aec13a199eeee40afe0"}},{"ruleId":"D2","level":"warning","message":{"text":"GenerateModelCard.GenerateModelCard (cognitive 17): GenerateModelCard.GenerateModelCard has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 5 (11 pts), boolean chains 3, if/else 3 (nesting depth added 6). Of this number, 11 points are the body\u0027s own statements and 6 belong to 5 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":"invokeai/frontend/webv2/src/features/generation/ui/GenerateModelCard.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"acb579c8d7cf9fc9dd9516a36e17969cd8c99a09065486d0b9ed1509cbe86f7d"}},{"ruleId":"D2","level":"warning","message":{"text":"runtime.createQueueRuntime.deliverResultVideos (cognitive 17): runtime.createQueueRuntime.deliverResultVideos has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7, error handling 4, boolean chains 3, ternaries 2 (3 pts) (nesting depth added 1). Of this number, 16 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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":984}}}],"partialFingerprints":{"codehealthFindingId/v1":"49fd435f62fa532f2383f8e03021300fa67519cec559b0213d149fd61b9ff273"}},{"ruleId":"D2","level":"warning","message":{"text":"runtime.createQueueRuntime.loadProjectJournal (cognitive 17): runtime.createQueueRuntime.loadProjectJournal has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (12 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 4). 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 2313, 2332). 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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":2305}}}],"partialFingerprints":{"codehealthFindingId/v1":"936d89a92dac7b2dc4e8015e7cc73e148f455e32a87deaa7832c76840b5b946b"}},{"ruleId":"D2","level":"warning","message":{"text":"durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::adoptNewestDraft (cognitive 17): durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::adoptNewestDraft has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (9 pts), loops 3 (4 pts), boolean chains 3, ternaries 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. This shape REPEATS in the file: 5 other methods here (durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::stageProject, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject::pushHalves, \u2026) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 6 times rather than 6 independent problems. Splitting this body alone leaves the other 5 exactly as they are. Where these are variations on one operation, the change that clears all 6 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":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":855}}}],"partialFingerprints":{"codehealthFindingId/v1":"36aec7ca66f273c11ec02604d5716aa6c1ddd18c6f81a1989a144c4105517477"}},{"ruleId":"D2","level":"warning","message":{"text":"LayerEditorPanes.LayerPaneBlock (cognitive 17): LayerEditorPanes.LayerPaneBlock has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 12 (16 pts), if/else 1 (nesting depth added 4). Of this number, 16 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body: 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/LayerEditorPanes.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"f892e926f0212f6602295ab9024009bf3655e4620c38b70a991c8c9205f615f2"}},{"ruleId":"D2","level":"warning","message":{"text":"PreviewHeaderActions.PreviewHeaderActions (cognitive 17): PreviewHeaderActions.PreviewHeaderActions has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 9 (11 pts), boolean chains 6 (nesting depth added 2). 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, 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewHeaderActions.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfc9151d174f029f823786741d03827e4112a680cb7207562950199b544006c3"}},{"ruleId":"D2","level":"warning","message":{"text":"rect.mergeDirtyRects (cognitive 17): rect.mergeDirtyRects has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (8 pts), boolean chains 5, loops 3 (4 pts) (nesting depth added 5). Most of this is not in the body itself: 4 of the 17 points are its own statements and the rest belongs to 2 function items inside it that branch (findMergeablePair, a function literal at line 135). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/math/rect.ts"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"c352a6cacb8d3223859bbd008cddefe2ea10900860b69f26d10d98af91853b72"}},{"ruleId":"D2","level":"warning","message":{"text":"MaskLayerController.clear (cognitive 17): MaskLayerController.clear has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7, boolean chains 5, ternaries 5. Of this number, 14 points are the body\u0027s own statements and 3 belong to 2 function literals 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskLayerController.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c4be7bed95b2983a804b6aac33ecdbdff2b825c4653b908f9a5fff01c2bfb7c"}},{"ruleId":"D2","level":"warning","message":{"text":"compositeFrame.createCompositeFrame.draw (cognitive 17): compositeFrame.createCompositeFrame.draw has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 9 (10 pts), boolean chains 5, if/else 1, 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositeFrame.ts"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e1a5af39b9392f28b01ae14cfbf6682d8b203abc92729558cc0bd640e8b0968"}},{"ruleId":"D2","level":"warning","message":{"text":"psdExport.planPsdExport::buildTree (cognitive 17): psdExport.planPsdExport::buildTree has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (11 pts), ternaries 1 (4 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/export/psdExport.ts"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f8d5526298edc6fc5652b82fe1cf8ed43c50831b625652057b622a58877acbb"}},{"ruleId":"D2","level":"warning","message":{"text":"executeImageRecall.executeImageRecall (cognitive 17): executeImageRecall.executeImageRecall has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (11 pts), ternaries 4, boolean chains 1, error handling 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/executeImageRecall.ts"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6cfe1d629e6372fb5fa39ac8104b798567e54a9450ae2e529b4011d8851fb26"}},{"ruleId":"D2","level":"warning","message":{"text":"entries.buildSettingsEntries (cognitive 17): entries.buildSettingsEntries has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 10 (12 pts), boolean chains 3, if/else 2 (nesting depth added 2). Most of this is not in the body itself: 4 of the 17 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 330, 422, 421). 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":"invokeai/frontend/webv2/src/workbench/palette/entries.ts"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"19007ff1bf0b229f669e3cdc9cfa828b66a4c7c53bd050dd8fa3c51d25879858"}},{"ruleId":"D2","level":"warning","message":{"text":"OpenProjectDialog.OpenProjectDialog (cognitive 17): OpenProjectDialog.OpenProjectDialog has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (9 pts), ternaries 4 (6 pts), boolean chains 1, error handling 1 (nesting depth added 3). Most of this is not in the body itself: 4 of the 17 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 63, 120, 137, \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":"invokeai/frontend/webv2/src/workbench/projects/components/OpenProjectDialog.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"49146d02e96eacd18eed376d9b742cab092c7de099572bf33216b363ee3011d4"}},{"ruleId":"D2","level":"warning","message":{"text":"fonts.readEmbeddedFonts (cognitive 17): fonts.readEmbeddedFonts has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (10 pts), boolean chains 4, loops 2, ternaries 1 (nesting depth added 4). Of this number, 16 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/fonts.ts"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a79d31a7db5b6d59578e069a59407a065712da063beaf8d0b83005b13c658d2"}},{"ruleId":"D2","level":"warning","message":{"text":"HotkeysSettingsSection.canScopesOverlap (cognitive 17): HotkeysSettingsSection.canScopesOverlap has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 8, if/else 6 (7 pts), ternaries 1 (2 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/HotkeysSettingsSection.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9e0b5792080c2ce1db1fc73ac7204b793fbcc44a2a61bc502d2eb4c89c33523"}},{"ruleId":"D2","level":"warning","message":{"text":"HotkeysSettingsSection.HotkeyListRow (cognitive 17): HotkeysSettingsSection.HotkeyListRow has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 10 (11 pts), boolean chains 5, if/else 1 (nesting depth added 1). Of this number, 14 points are the body\u0027s own statements and 3 belong to 3 function literals 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":"invokeai/frontend/webv2/src/workbench/settings/HotkeysSettingsSection.tsx"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"59b8aa528df513540a444a41e501372f4635f40dc792befe361bb8828471ab23"}},{"ruleId":"D2","level":"warning","message":{"text":"CenterArea.CenterArea (cognitive 17): CenterArea.CenterArea has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 8 (10 pts), boolean chains 6, if/else 1 (nesting depth added 2). Of this number, 13 points are the body\u0027s own statements and 4 belong to 3 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/shell/CenterArea.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"e35becc1f9e9a1a7c0f3faf87cfb45e500ccebd563d576604c4eb03aa3311b42"}},{"ruleId":"D2","level":"warning","message":{"text":"GenerateCanvasRenderSize.GenerateCanvasRenderSize (cognitive 17): GenerateCanvasRenderSize.GenerateCanvasRenderSize has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 9, boolean chains 4, if/else 4. Most of this is not in the body itself: 6 of the 17 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 153, 127, 101, \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/GenerateCanvasRenderSize.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"89aacd4aa144ace85eab289f55b8497a80c51ff62e3e2a93b6e956e6e8bd6fad"}},{"ruleId":"D2","level":"warning","message":{"text":"custom_nodes._install_pack (cognitive 16): custom_nodes._install_pack has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (11 pts), error handling 2, ternaries 2, loops 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":"invokeai/app/api/routers/custom_nodes.py"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"88d1226619fcd7999fc712666096aecebfc27531aa15b186f2043961c801bef1"}},{"ruleId":"D2","level":"warning","message":{"text":"images.delete_images_from_list (cognitive 16): images.delete_images_from_list has cognitive complexity 16 (threshold 15). Drivers by points: error handling 6 (9 pts), if/else 1 (3 pts), loops 2 (3 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":"invokeai/app/api/routers/images.py"},"region":{"startLine":571}}}],"partialFingerprints":{"codehealthFindingId/v1":"1590f40be94cc62732ae3822c787c1fa4091cd31b99a5c5343e8eb3025021d67"}},{"ruleId":"D2","level":"warning","message":{"text":"model_manager._reidentify_model (cognitive 16): model_manager._reidentify_model has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (10 pts), boolean chains 4, loops 1 (2 pts) (nesting depth added 3). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/model_manager.py"},"region":{"startLine":483}}}],"partialFingerprints":{"codehealthFindingId/v1":"1736f4fd5dca7c4c2af2fc6265840093254018adcf6277dc457fd3b2f077ecb1"}},{"ruleId":"D2","level":"warning","message":{"text":"SocketIO._revalidate_socket_users (cognitive 16): SocketIO._revalidate_socket_users has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (8 pts), loops 4, boolean chains 2, error handling 1 (2 pts) (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/sockets.py"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"383e37715e2c954f40800d5f3966dba4c072f2c6665a9429d895ae5e4212ec59"}},{"ruleId":"D2","level":"warning","message":{"text":"FluxDenoiseInvocation._prep_controlnet_extensions (cognitive 16): FluxDenoiseInvocation._prep_controlnet_extensions has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (13 pts), loops 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":"invokeai/app/invocations/flux/flux_denoise.py"},"region":{"startLine":737}}}],"partialFingerprints":{"codehealthFindingId/v1":"9329f3ca98c46d786338c0b049ea4fe2a4fc9822b1dd53d6a98d241c9247fe4e"}},{"ruleId":"D2","level":"warning","message":{"text":"MetadataToLorasCollectionInvocation.invoke (cognitive 16): MetadataToLorasCollectionInvocation.invoke has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (12 pts), loops 2, ternaries 2 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/metadata_linked.py"},"region":{"startLine":939}}}],"partialFingerprints":{"codehealthFindingId/v1":"87fcf60e573b66d7119b5946451471747fce34d218d653e1887e645cc0a7c4be"}},{"ruleId":"D2","level":"warning","message":{"text":"metadata_linked.extract_model_key (cognitive 16): metadata_linked.extract_model_key has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (16 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":"invokeai/app/invocations/metadata_linked.py"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"d79ca5ac8e7e2e973540251f284de41fc05e08090ce6fa07c522a8097e091209"}},{"ruleId":"D2","level":"warning","message":{"text":"MiniMaxH3DenoiseInvocation._split_pruned_adaln_patches (cognitive 16): MiniMaxH3DenoiseInvocation._split_pruned_adaln_patches has cognitive complexity 16 (threshold 15). Drivers by points: if/else 3 (8 pts), ternaries 2 (5 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":"invokeai/app/invocations/minimax_h3/minimax_h3_denoise.py"},"region":{"startLine":663}}}],"partialFingerprints":{"codehealthFindingId/v1":"c69b0efe12950df9b40f5f7458974a464f683bc6b26a050ce4bf76283c734c7f"}},{"ruleId":"D2","level":"warning","message":{"text":"LoRACollectionLoader.invoke (cognitive 16): LoRACollectionLoader.invoke has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (12 pts), boolean chains 2, loops 1, ternaries 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":"invokeai/app/invocations/model.py"},"region":{"startLine":530}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2669e112d18e08c4c579e5f61af2341845ca729e77a6787a39dcfa7206ce9f4"}},{"ruleId":"D2","level":"warning","message":{"text":"DenoiseLatentsInvocation._concat_regional_text_embeddings (cognitive 16): DenoiseLatentsInvocation._concat_regional_text_embeddings has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 2, 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":"invokeai/app/invocations/sd/denoise_latents.py"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1535be81b4fe2246e08349f52040f819cda9df22be06bb9b5310e5915b62499"}},{"ruleId":"D2","level":"warning","message":{"text":"IPAdapterInvocation.invoke (cognitive 16): IPAdapterInvocation.invoke has cognitive complexity 16 (threshold 15). Drivers by points: if/else 12 (16 pts) (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/ip_adapter.py"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"16211cd6423594fc52bcbdaf493f17c1912366bfc9fceeead35f80fe67bc6c75"}},{"ruleId":"D2","level":"warning","message":{"text":"WanRefImageEncoderInvocation.invoke (cognitive 16): WanRefImageEncoderInvocation.invoke has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (7 pts), ternaries 4 (5 pts), boolean chains 4 (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":"invokeai/app/invocations/wan/wan_ref_image_encoder.py"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1d31fedf2914757e221fd3309adf1b44e66cd65df216ccc62c8ee9064fc3e50"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryMaintenanceService._archive_file (cognitive 16): GalleryMaintenanceService._archive_file has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (8 pts), error handling 4 (7 pts), boolean chains 1 (nesting depth added 4). 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":"invokeai/app/services/gallery_maintenance/gallery_maintenance_default.py"},"region":{"startLine":837}}}],"partialFingerprints":{"codehealthFindingId/v1":"9efc9dcbf245db362f04559399b0de26de33e8be8620f1ba9b627f59218395a4"}},{"ruleId":"D2","level":"warning","message":{"text":"IntermediatesService._worker_loop (cognitive 16): IntermediatesService._worker_loop has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (10 pts), error handling 2 (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":"invokeai/app/services/intermediates/intermediates_default.py"},"region":{"startLine":528}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c7127061dcd462d51f0eab638f425a2a18d1365be36e648602152e7495b1c4b"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelInstallService._download_complete_callback (cognitive 16): ModelInstallService._download_complete_callback 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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":2443}}}],"partialFingerprints":{"codehealthFindingId/v1":"59c341acd8f92551165a78f5fff280679f2d276ae3c4ad67e6e0f172966c8cc0"}},{"ruleId":"D2","level":"warning","message":{"text":"workflow_call_batch._resolve_float_generator (cognitive 16): workflow_call_batch._resolve_float_generator has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (14 pts), boolean chains 2 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/session_processor/workflow_call_batch.py"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"7407aa6e01eb3703fd618d0d195b9565412796dcc56c754453461196240bafb8"}},{"ruleId":"D2","level":"warning","message":{"text":"copy.copy_rows (cognitive 16): copy.copy_rows has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (8 pts), ternaries 3 (4 pts), loops 2 (3 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":"invokeai/app/services/shared/database/copy.py"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"4452adb1fe60358b663f795cb2eb513c8552ab8e0c0914a00827a98566010fac"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphExecutionState._get_for_parent (cognitive 16): GraphExecutionState._get_for_parent has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (12 pts), loops 2 (3 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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":890}}}],"partialFingerprints":{"codehealthFindingId/v1":"4916b7828624b4a69c03ea7df56b9864d0c6d60249ea6bbdd2f8aa2f02579755"}},{"ruleId":"D2","level":"warning","message":{"text":"_IteratorAncestry.get_frame_iterators (cognitive 16): _IteratorAncestry.get_frame_iterators has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (11 pts), loops 2 (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":"invokeai/app/services/shared/graph_iterator_ancestry.py"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce2d841278affa44bf279efcbc58ecfb2640c5d3c56b86184c7694f4522153cf"}},{"ruleId":"D2","level":"warning","message":{"text":"_ExecutionNodeBuilder._get_iteration_axes (cognitive 16): _ExecutionNodeBuilder._get_iteration_axes has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 1 (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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"792362c771c0b6e790d72fdf1267c6c85bf828f4a32991e1366ae97db8666082"}},{"ruleId":"D2","level":"warning","message":{"text":"graph_nested_iterate_planner._prepare_nested_iterate_sequence (cognitive 16): graph_nested_iterate_planner._prepare_nested_iterate_sequence has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (10 pts), loops 2 (4 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":"invokeai/app/services/shared/graph_nested_iterate_planner.py"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"18230a49393f5f88037adcf76875c5ad04e0e420165a334fbe49d64a3642a210"}},{"ruleId":"D2","level":"warning","message":{"text":"Graph._validate_for_loop_linkages (cognitive 16): Graph._validate_for_loop_linkages has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (12 pts), loops 3, boolean chains 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":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":981}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5d7f9b76d713cd2c742170f62d012ee0ff5df4baaf608cc8624e4867acd5ebe"}},{"ruleId":"D2","level":"warning","message":{"text":"migration_2026_10_10_board_roles._board_roles (cognitive 16): migration_2026_10_10_board_roles._board_roles has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10 (12 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_10_10_board_roles.py"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b2b83d1be0f09249ec97a72b283383cf5c9223055611fc0913f695f28be667d"}},{"ruleId":"D2","level":"warning","message":{"text":"controlnet_utils.heuristic_resize (cognitive 16): controlnet_utils.heuristic_resize has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11 (13 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":"invokeai/app/util/controlnet_utils.py"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"70d4a5d88dff55b5d2d799613c2f361383c6077531cc6a8df18ced46445ead31"}},{"ruleId":"D2","level":"warning","message":{"text":"InstantXControlNetFlux.forward (cognitive 16): InstantXControlNetFlux.forward has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (9 pts), loops 4, boolean chains 3 (nesting depth added 2). This file\u0027s own header attributes it to another copyright holder, so it is code this repository carries rather than code it wrote: restructuring the body in place forks it from upstream and turns every future re-sync into a manual merge. The performable moves are to leave the body as close to its upstream form as possible and keep it behind a narrow interface of your own, and to re-sync it when upstream changes \u2014 or, if it has already diverged far enough that you maintain it here, adopt it deliberately and then split the body into named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/controlnet/instantx_controlnet_flux.py"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"57122ba57f6abebbf0d2a73370e7a6b76f5de84ac49b9baa3c6f295e84e84e20"}},{"ruleId":"D2","level":"warning","message":{"text":"PromptFormatter.normalize_prompt (cognitive 16): PromptFormatter.normalize_prompt has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 8, if/else 8. 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":"invokeai/backend/image_util/pngwriter.py"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"5066e7aa3d5d8ff2717d9b6bf7b7fc433913fbcd8fc13aa90dd7338f719b98f2"}},{"ruleId":"D2","level":"warning","message":{"text":"Krea2MemoryEfficientAttnProcessor.__call__ (cognitive 16): Krea2MemoryEfficientAttnProcessor.__call__ has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (11 pts), ternaries 2 (3 pts), boolean chains 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":"invokeai/backend/krea2/attention.py"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"df12ee26bce45346853e1bdc05bb41a622c0026d06c8656c6802babc048c9fbd"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimaCheckpointModel._load_from_singlefile (cognitive 16): AnimaCheckpointModel._load_from_singlefile has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 2 (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":"invokeai/backend/model_manager/load/model_loaders/anima.py"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"6104069e4742716e4cd3b51fcd6fa6c1b9c3134e2a14e0a8a5572b0c63d87246"}},{"ruleId":"D2","level":"warning","message":{"text":"MiniMaxH3CheckpointModel._load_transformer_from_singlefile (cognitive 16): MiniMaxH3CheckpointModel._load_transformer_from_singlefile has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (11 pts), loops 2 (3 pts), boolean chains 1, ternaries 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":"invokeai/backend/model_manager/load/model_loaders/minimax_h3.py"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cd809f4bf5a3007198994d1d91e3c2b3576af4329ae4b71c0a98d297652bcf0"}},{"ruleId":"D2","level":"warning","message":{"text":"qwen_image._build_qwen_image_transformer_config (cognitive 16): qwen_image._build_qwen_image_transformer_config has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (8 pts), error handling 1 (4 pts), boolean chains 2, loops 1, 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":"invokeai/backend/model_manager/load/model_loaders/qwen_image.py"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"c70bce4657ccf2fcc9969758f9166f08e401c8b899782d6847a4e5a7e6490cbf"}},{"ruleId":"D2","level":"warning","message":{"text":"PixelDiTModel.load_state_dict (cognitive 16): PixelDiTModel.load_state_dict has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (12 pts), boolean chains 2, loops 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":"invokeai/backend/pid/_src/models/pixeldit_model.py"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c841725bf1dfdd05b0b7cc7ab1f21df0683755e3dd2fca9588175c52457e31c"}},{"ruleId":"D2","level":"warning","message":{"text":"PixDiT_T2I.__init__ (cognitive 16): PixDiT_T2I.__init__ has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 8 (11 pts), if/else 3 (4 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":"invokeai/backend/pid/_src/networks/pixeldit_official.py"},"region":{"startLine":1169}}}],"partialFingerprints":{"codehealthFindingId/v1":"4aadceab3386aa9c03bcbaebab52b589ae7372d80576a8d1666339a293ec6c61"}},{"ruleId":"D2","level":"warning","message":{"text":"loaders.parse_q8_cr_markers (cognitive 16): loaders.parse_q8_cr_markers has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (8 pts), ternaries 1 (3 pts), boolean chains 2, error handling 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":"invokeai/backend/quantization/gguf/loaders.py"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"9448eb7b03b603a9b0b57edd92b70f3299a0d0652873e237dd640f79bd2393f5"}},{"ruleId":"D2","level":"warning","message":{"text":"StableDiffusionGeneratorPipeline._adjust_memory_efficient_attention (cognitive 16): StableDiffusionGeneratorPipeline._adjust_memory_efficient_attention has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (11 pts), boolean chains 4, error handling 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":"invokeai/backend/stable_diffusion/diffusers_pipeline.py"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dd00ca9b6296a4a18a14e27a6778718f7c9f8912f614610b2a2e6750e38c357"}},{"ruleId":"D2","level":"warning","message":{"text":"StableDiffusionGeneratorPipeline.latents_from_embeddings (cognitive 16): StableDiffusionGeneratorPipeline.latents_from_embeddings has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (10 pts), boolean chains 3, ternaries 1 (2 pts), loops 1 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusers_pipeline.py"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"af90a168247250e0582fcbd90d816aa5d82de0d26f57fde58f6eb757281c26a6"}},{"ruleId":"D2","level":"warning","message":{"text":"IPAdapterExt.run_adapters (cognitive 16): IPAdapterExt.run_adapters has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (14 pts), 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":"invokeai/backend/stable_diffusion/extensions/ip_adapter.py"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"793fa387ca22abc3dbf9c93e93dcc56e04aff11db613e28dc5dc28d75583a29d"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaImportProcessor.select_board_option (cognitive 16): MediaImportProcessor.select_board_option has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (12 pts), loops 2 (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":"invokeai/frontend/install/import_images.py"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1ce7227cb276e2816aa3d2a3a76ef8b082ebb1cad2d10104e2ff8ec00de0edc"}},{"ruleId":"D2","level":"warning","message":{"text":"promptAST.serializeCore (cognitive 16): promptAST.serializeCore has cognitive complexity 16 (threshold 15). Drivers by points: if/else 3 (10 pts), loops 2 (4 pts), match/switch 1 (2 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":"invokeai/frontend/webv1/src/common/util/promptAST.ts"},"region":{"startLine":801}}}],"partialFingerprints":{"codehealthFindingId/v1":"1795e591f13b6ed716e591730b81d3abeba7506ca7f77f47232e9c2dc6e74a9f"}},{"ruleId":"D2","level":"warning","message":{"text":"useMediaCookieRefresh.useMediaCookieRefresh (cognitive 16): useMediaCookieRefresh.useMediaCookieRefresh has cognitive complexity 16 (threshold 15). Drivers by points: if/else 12, boolean chains 3, loops 1. None of this is in the body itself: all 16 points belong to 7 function literals inside it that branch (lines 99, 136, 151, \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":"invokeai/frontend/webv1/src/features/auth/hooks/useMediaCookieRefresh.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"d74291e3a23bd55309a7f526a4ebf90d195c8b7b620d836224ec171b793dbd1b"}},{"ruleId":"D2","level":"warning","message":{"text":"RefImagePreview.RefImagePreview (cognitive 16): RefImagePreview.RefImagePreview has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 8, ternaries 4 (5 pts), if/else 3 (nesting depth added 1). Of this number, 12 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImagePreview.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"48b694bb817f4553c7942f4085244da4be97eedb017e5bac149152a670ce835a"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasToolbarSnapshotMenuButton.CanvasToolbarSnapshotMenuButton (cognitive 16): CanvasToolbarSnapshotMenuButton.CanvasToolbarSnapshotMenuButton has cognitive complexity 16 (threshold 15). Drivers by points: if/else 12 (13 pts), boolean chains 3 (nesting depth added 1). Most of this is not in the body itself: 1 of the 16 points is its own statement and the rest belongs to 6 function literals inside it that branch (lines 139, 93, 105, \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarSnapshotMenuButton.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ed17557d7cefcb86d41590864e36457d07a2e5a3a325cbeed89c3c55c4a38d0"}},{"ruleId":"D2","level":"warning","message":{"text":"useCanvasProjectLoad.useCanvasProjectLoad.loadCanvasProject (cognitive 16): useCanvasProjectLoad.useCanvasProjectLoad.loadCanvasProject has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (11 pts), error handling 2 (3 pts), boolean chains 1, loops 1 (nesting depth added 3). Of this number, 10 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectLoad.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"36f53ba4631685fefbda27d018303e83b6889bd43ace34f1f0fd3fd366c5c975"}},{"ruleId":"D2","level":"warning","message":{"text":"CanvasEntityTransformer.syncInteractionState (cognitive 16): CanvasEntityTransformer.syncInteractionState has cognitive complexity 16 (threshold 15). Drivers by points: if/else 12 (13 pts), boolean chains 3 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":664}}}],"partialFingerprints":{"codehealthFindingId/v1":"105932d8b20db73059a034cb96f7ec5403beb305c3ccfca7e46d10171c285cc7"}},{"ruleId":"D2","level":"warning","message":{"text":"filters.AdjustmentsSimpleFilter (cognitive 16): filters.AdjustmentsSimpleFilter has cognitive complexity 16 (threshold 15). Drivers by points: loops 4 (10 pts), ternaries 3, if/else 2, boolean chains 1 (nesting depth added 6). 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/filters.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"d44dbe06eeab5f49bd5f30d57ac8f8ae496bd780f8de87eb6085fe26481c84c3"}},{"ruleId":"D2","level":"warning","message":{"text":"state.handleDeletions (cognitive 16): state.handleDeletions has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 3 (7 pts), if/else 4 (5 pts), boolean chains 2, error handling 1, loops 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":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa8a80395256ef0632491de8a22ef7845fe2836fac0e0d4960803a556f52ada4"}},{"ruleId":"D2","level":"warning","message":{"text":"actions.newCanvasFromImage (cognitive 16): actions.newCanvasFromImage has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 2, match/switch 1 (nesting depth added 5). 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, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c43e8117d07fba3c3f71dd95eb6c8033d5ad9da0f552c38c3d9257f746d15a3"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelList.ModelList (cognitive 16): ModelList.ModelList has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8, boolean chains 3, error handling 2, ternaries 2, loops 1. Most of this is not in the body itself: 4 of the 16 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 99, 153, 63, \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4826fb034ab79f600455b13e3485ce0ed55227cf80e17f5a3bab0d6c296f136"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowListItem.WorkflowListItem (cognitive 16): WorkflowListItem.WorkflowListItem has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 13, if/else 2, ternaries 1. Of this number, 12 points are the body\u0027s own statements and 4 belong to 3 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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowListItem.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"94c18f227600d1e10ac4b0f441ad7fa9b4943ac799a61b79e8c5775ef50103f6"}},{"ruleId":"D2","level":"warning","message":{"text":"fieldValidators.validateStringFieldCollectionValue (cognitive 16): fieldValidators.validateStringFieldCollectionValue has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (10 pts), boolean chains 5, loops 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":"invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3501ef9b870692972962ebd38d65601f576dd73ae171bbb8d41ce07b7734be1"}},{"ruleId":"D2","level":"warning","message":{"text":"fieldValidators.syncNodeErrors (cognitive 16): fieldValidators.syncNodeErrors has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (13 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":"invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"4db43d61e498d4dd25c48836295cf086a8c7f7e3105188803e0dfaa824707f76"}},{"ruleId":"D2","level":"warning","message":{"text":"resolveBatchValue.resolveBatchValue (cognitive 16): resolveBatchValue.resolveBatchValue has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 4 (nesting depth added 4). Of this number, 12 points are the body\u0027s own statements and 4 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":"invokeai/frontend/webv1/src/features/nodes/util/node/resolveBatchValue.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"a60933cc652c814da63b4586676ee6d2c34fce3253049e27ca3d23a0eb29bb03"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsModal.SettingsModal (cognitive 16): SettingsModal.SettingsModal has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 5, if/else 5, ternaries 5, error handling 1. 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 133, 126, 273). 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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe2ffc2687635b402bc1c355a01c56f2f565a1022d9aec9bb4c847f4e0c886b9"}},{"ruleId":"D2","level":"warning","message":{"text":"onInvocationComplete.buildOnInvocationComplete::getResultVideoDTOs (cognitive 16): onInvocationComplete.buildOnInvocationComplete::getResultVideoDTOs has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (14 pts), boolean chains 1, 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. This shape REPEATS in the file: one other method here (onInvocationComplete.buildOnInvocationComplete::addImagesToGallery) 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":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"090755f4c5212b6ef6b475a8541e00a122650a6f606f3746057f8427eb394c8e"}},{"ruleId":"D2","level":"warning","message":{"text":"settings.getGallerySettings (cognitive 16): settings.getGallerySettings has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 14, boolean chains 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":"invokeai/frontend/webv2/src/features/gallery/core/settings.ts"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"53b0034a4c76ece3b8f27d56a84fa997aa19ce305dd2b8ef40b784727e160da0"}},{"ruleId":"D2","level":"warning","message":{"text":"galleryStateView.getGalleryStateView (cognitive 16): galleryStateView.getGalleryStateView has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 8, ternaries 7 (8 pts) (nesting depth added 1). 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, 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":"invokeai/frontend/webv2/src/features/gallery/ui/galleryStateView.ts"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc083f8c5d3af07ee13f4854244f0c18d3be6d1b1fedeafccef9a969cf981d27"}},{"ruleId":"D2","level":"warning","message":{"text":"queries.ensureLifecycle (cognitive 16): queries.ensureLifecycle has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 9, if/else 4 (5 pts), loops 2 (nesting depth added 1). 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 items inside it that branch (a function literal at line 316, seedExistingPages, pruneListing, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/data/queries.ts"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfa453ead7d66eea6b00849b941578ecb37afaf8122d139708a8ba1882433708"}},{"ruleId":"D2","level":"warning","message":{"text":"queries.fetchVerifiedGalleryItemPage (cognitive 16): queries.fetchVerifiedGalleryItemPage has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (12 pts), error handling 1 (2 pts), boolean chains 1, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/data/queries.ts"},"region":{"startLine":739}}}],"partialFingerprints":{"codehealthFindingId/v1":"dac63ddf632b45724e8a086704e581693d18af07e5925a3a2c460f324a6d7cea"}},{"ruleId":"D2","level":"warning","message":{"text":"GalleryWidgetContext.createSelectionStarStore.reconcilePatch (cognitive 16): GalleryWidgetContext.createSelectionStarStore.reconcilePatch has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (12 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryWidgetContext.tsx"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"33eaef563cda8e86ead9d955dd925dbc748d53c86e622a67dcb059f8d463217a"}},{"ruleId":"D2","level":"warning","message":{"text":"baseGenerationPolicies.getGenerationModelAvailabilityReasons (cognitive 16): baseGenerationPolicies.getGenerationModelAvailabilityReasons has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (10 pts), boolean chains 3, loops 3 (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":"invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts"},"region":{"startLine":1611}}}],"partialFingerprints":{"codehealthFindingId/v1":"2258d75e0d2deaccc298c64bcf9c28c05213c3c90297ab89cc7d22001993e54a"}},{"ruleId":"D2","level":"warning","message":{"text":"PromptParser.parseUnquotedPromptFunction (cognitive 16): PromptParser.parseUnquotedPromptFunction has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 2, 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":"invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts"},"region":{"startLine":502}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ac4b11dd7e59909b68d7c5d7b38db67bc81506b88e4459bf04775a411532c5b"}},{"ruleId":"D2","level":"warning","message":{"text":"GenerateDimensionFields.GenerateDimensionFields::renderSection (cognitive 16): GenerateDimensionFields.GenerateDimensionFields::renderSection has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 11, boolean chains 5. 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":"invokeai/frontend/webv2/src/features/generation/ui/GenerateDimensionFields.tsx"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"d403f8394e3590f9cfff31d947287f57f90b7ac8f7452574c09bfebda6ee0ac5"}},{"ruleId":"D2","level":"warning","message":{"text":"OperationPanel.OperationPanel (cognitive 16): OperationPanel.OperationPanel has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 10 (14 pts), if/else 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":"invokeai/frontend/webv2/src/features/intermediates/ui/OperationPanel.tsx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"57210c46f7006967f488310f958ef7e622994bc8a9655470d5d2c685e4d76f65"}},{"ruleId":"D2","level":"warning","message":{"text":"runtime.createQueueRuntime.flushJournalRecords (cognitive 16): runtime.createQueueRuntime.flushJournalRecords has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 2, loops 1 (nesting depth added 5). Most of this is not in the body itself: 2 of the 16 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 609, 647). 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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":601}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6e25eb09e19c045e2685a213b62a1052c6a327d5e54fd9982a1688c83387234"}},{"ruleId":"D2","level":"warning","message":{"text":"videoPolicies.getVideoDimensions (cognitive 16): videoPolicies.getVideoDimensions has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 8 (15 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":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":578}}}],"partialFingerprints":{"codehealthFindingId/v1":"117590821d8b5d66baf8d34849e452b300963fd72b53cbeeb8ae8bebd6df9896"}},{"ruleId":"D2","level":"warning","message":{"text":"batch.resolveWorkflowGeneratorValue (cognitive 16): batch.resolveWorkflowGeneratorValue has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 6 (12 pts), if/else 2, boolean chains 1, match/switch 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":"invokeai/frontend/webv2/src/features/workflow/core/batch.ts"},"region":{"startLine":555}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4a77134f6e505955a9532a14465f4fc29e5701464652784e4fa3fa72f61a25f"}},{"ruleId":"D2","level":"warning","message":{"text":"document.updateWorkflowNodes (cognitive 16): document.updateWorkflowNodes has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (12 pts), loops 2, boolean chains 1, ternaries 1 (nesting depth added 5). 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, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/document.ts"},"region":{"startLine":579}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2fcc6970524022d181e53e7faee6bf2b082fee2ff44c093126fe9e51deda126"}},{"ruleId":"D2","level":"warning","message":{"text":"api.toWorkflowLibraryWriteRefusal (cognitive 16): api.toWorkflowLibraryWriteRefusal has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7, ternaries 4 (7 pts), boolean chains 2 (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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/data/api.ts"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"372bf47c7b16220c131f3f6e850e4042abb8344b869bd30fb17534f2c17bd87d"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowLibraryCard.WorkflowLibraryCard (cognitive 16): WorkflowLibraryCard.WorkflowLibraryCard has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 13, boolean chains 3. Of this number, 14 points are the body\u0027s own statements and 2 belong 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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryCard.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e3961f636d5008e123ff57fe4e4481708f8880d68a7a89bcf51a14ce0f9d2b6"}},{"ruleId":"D2","level":"warning","message":{"text":"useWorkflowPublication.useWorkflowPublication.settle (cognitive 16): useWorkflowPublication.useWorkflowPublication.settle has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (10 pts), ternaries 2 (5 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":"invokeai/frontend/webv2/src/features/workflow/ui/library/useWorkflowPublication.ts"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"11544e664087a1452aac5441a44dbed6ef394b7aa00b7e60e386221aee725556"}},{"ruleId":"D2","level":"warning","message":{"text":"useEraser.getIntersectingEdgeIds (cognitive 16): useEraser.getIntersectingEdgeIds has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (10 pts), loops 2 (3 pts), error handling 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/useEraser.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"aeff07340400e0ed8a2fe71dff1af7626808e0e9deb6b1b994e16259ac0bbba2"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkflowFieldInput.ScalarCollectionInput (cognitive 16): WorkflowFieldInput.ScalarCollectionInput has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 10 (13 pts), boolean chains 2, if/else 1 (nesting depth added 3). 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 1547, 1561, 1531, \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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":1519}}}],"partialFingerprints":{"codehealthFindingId/v1":"12652b59509713088b4cb08a63fa4a0b003d2db156b9566e761a67ac84130330"}},{"ruleId":"D2","level":"warning","message":{"text":"DropZone.DropZone (cognitive 16): DropZone.DropZone has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 10 (12 pts), boolean chains 4 (nesting depth added 2). Of this number, 11 points are the body\u0027s own statements and 5 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":"invokeai/frontend/webv2/src/platform/ui/DropZone.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aa578dd2c03eea524502f08844bf786965e14b586acb9161c2031ff4652ef16"}},{"ruleId":"D2","level":"warning","message":{"text":"editorSession.createEditorSessionProvider (cognitive 16): editorSession.createEditorSessionProvider has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (9 pts), boolean chains 2, error handling 2, ternaries 2, loops 1 (nesting depth added 3). None of this is in the body itself: all 16 points belong to 3 function items inside it that branch (claim, a function literal at line 118, persist). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/editorSession.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7369e63d09e405759f2894140b25138905d68054c44b32dffe1f5bcaa09292b"}},{"ruleId":"D2","level":"warning","message":{"text":"indexedDbDraftStore.createIndexedDbProjectDraftStore.adopt (cognitive 16): indexedDbDraftStore.createIndexedDbProjectDraftStore.adopt has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 6, if/else 6, ternaries 2 (4 pts) (nesting depth added 2). Most of this is not in the body itself: 4 of the 16 points are its own statements and the rest belongs to one function literal inside it that branches (line 370). 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"fac944476cd5dbb9a4c68787dd5f8693998d7ed42091f7bba607be450632f9b5"}},{"ruleId":"D2","level":"warning","message":{"text":"durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject::reconcile (cognitive 16): durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject::reconcile has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 8, ternaries 5, if/else 3. 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 shape REPEATS in the file: 5 other methods here (durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::adoptNewestDraft, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::stageProject, durableSyncedPersistence.createDurableSyncedWorkbenchPersistence::pushStagedProject, \u2026) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 6 times rather than 6 independent problems. Splitting this body alone leaves the other 5 exactly as they are. Where these are variations on one operation, the change that clears all 6 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":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":1624}}}],"partialFingerprints":{"codehealthFindingId/v1":"af4d48118559cdee24ca6b2f17206e7f9f541f8602226210821943613b0ddf7e"}},{"ruleId":"D2","level":"warning","message":{"text":"projectWorkflows.normalizeProjectWorkflowCollection (cognitive 16): projectWorkflows.normalizeProjectWorkflowCollection has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (9 pts), ternaries 2 (4 pts), boolean chains 2, loops 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":"invokeai/frontend/webv2/src/workbench/projectWorkflows.ts"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e4f54f025002b397289ab4eae3fed3edccc708066984d08993bba77134b42f9"}},{"ruleId":"D2","level":"warning","message":{"text":"layerRowSummary.layerRowSummary (cognitive 16): layerRowSummary.layerRowSummary has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (10 pts), ternaries 2 (4 pts), boolean chains 1, match/switch 1 (nesting depth added 7). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerRowSummary.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"8517f7571d09aee67199d8874a0f962c6ee2de59c1b936c18cf6077dceda1ac4"}},{"ruleId":"D2","level":"warning","message":{"text":"mutationContext.createCanvasMutationContext.begin.publish (cognitive 16): mutationContext.createCanvasMutationContext.begin.publish has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 3, error handling 1 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mutationContext.ts"},"region":{"startLine":363}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f35cef566c78f399ec913b00ef598c4999463b2b8a54772c1148d0433e91f1b"}},{"ruleId":"D2","level":"warning","message":{"text":"documentModel.createDocumentModel::preparePatchConfigBatch (cognitive 16): documentModel.createDocumentModel::preparePatchConfigBatch has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 2, loops 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. This shape REPEATS in the file: 3 other methods here (documentModel.createDocumentModel::prepareInsert, documentModel.createDocumentModel::prepareReorder, documentModel.createDocumentModel::checkReparent) have the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written 4 times rather than 4 independent problems. Splitting this body alone leaves the other 3 exactly as they are. Where these are variations on one operation, the change that clears all 4 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts"},"region":{"startLine":1266}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9668040c68a809734ecc1bf8d5f18a31873493e76103240634d5d3c4c2801c9"}},{"ruleId":"D2","level":"warning","message":{"text":"FloatingSelectionController.lift (cognitive 16): FloatingSelectionController.lift has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (11 pts), boolean chains 4, error handling 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/floatingSelectionController.ts"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"469d3405010a5657d92847ccbe96c4081ac69dbf4c204e98a306a6da96314eb2"}},{"ruleId":"D2","level":"warning","message":{"text":"ThumbnailController.request (cognitive 16): ThumbnailController.request has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6, boolean chains 5, ternaries 3 (4 pts), error handling 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/thumbnailController.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a4fb2bcc56f65c99f48dca357513389e9ee40efb806f6cfc0cbc983fc460e76"}},{"ruleId":"D2","level":"warning","message":{"text":"LayerMutationController.duplicate (cognitive 16): LayerMutationController.duplicate has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 3, loops 1, ternaries 1 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"6234384579c236c84424ffb5acb32f8d1f142b407000d0c48ebf8576c6e00f4e"}},{"ruleId":"D2","level":"warning","message":{"text":"fontLoader.createFontLoader.setActiveSources (cognitive 16): fontLoader.createFontLoader.setActiveSources has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (10 pts), loops 5, boolean chains 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/fontLoader.ts"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee8bacc9b7c89997bcdcb469cafc7075278f41ac1f79c8c4aae1031acdccabda"}},{"ruleId":"D2","level":"warning","message":{"text":"groupSurfaceCache.createGroupSurfaceCache.damagedRegion (cognitive 16): groupSurfaceCache.createGroupSurfaceCache.damagedRegion 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/groupSurfaceCache.ts"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dad0e0f59f3623ad74e5fe5869a0a8d8f6a133498d30b54db78d5db4099a736"}},{"ruleId":"D2","level":"warning","message":{"text":"FilterOperationCoordinator.createFilterOperationCoordinator.start (cognitive 16): FilterOperationCoordinator.createFilterOperationCoordinator.start has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10, boolean chains 5, 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/FilterOperationCoordinator.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee8fc52a242f2c4872859e2013ab8ce9e604d37524c92bd0ea9a4691e8670292"}},{"ruleId":"D2","level":"warning","message":{"text":"selectObjectSession.createSelectObjectSession.update (cognitive 16): selectObjectSession.createSelectObjectSession.update has cognitive complexity 16 (threshold 15). Drivers by points: boolean chains 9, if/else 4, ternaries 3. 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/selectObjectSession.ts"},"region":{"startLine":541}}}],"partialFingerprints":{"codehealthFindingId/v1":"378ab64e6cfef77d2d86d4425a1d280fa2afe6d8eca7d9089a6a6c5bbe1586bb"}},{"ruleId":"D2","level":"warning","message":{"text":"usePaletteNavigation.usePaletteNavigation.onSearchKeyDown (cognitive 16): usePaletteNavigation.usePaletteNavigation.onSearchKeyDown has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (11 pts), boolean chains 5 (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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/palette/usePaletteNavigation.ts"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"d13ddf290518cc04e16d34dc6c3beffa15d2c5a84b87b86b3f5e23cc2fa295db"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsDialog.SettingsDialog (cognitive 16): SettingsDialog.SettingsDialog has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 9 (10 pts), if/else 4, boolean chains 2 (nesting depth added 1). Of this number, 9 points are the body\u0027s own statements and 7 belong to 5 function literals 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":"invokeai/frontend/webv2/src/workbench/settings/SettingsDialog.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"59bec992baa0099ab9dc9d70719ea3b8ded38289bc11c08e847db852ab01251b"}},{"ruleId":"D2","level":"warning","message":{"text":"InvokeButton.InvokeTooltipContent (cognitive 16): InvokeButton.InvokeTooltipContent has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 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":"invokeai/frontend/webv2/src/workbench/shell/topbar/InvokeButton.tsx"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ca0715b8224a1a766f9ada04a32cabc6cf137e15e917ba6dc5ad012b6980c98"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectSwitcher.ProjectSwitcher (cognitive 16): ProjectSwitcher.ProjectSwitcher has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 7 (9 pts), if/else 6, error handling 1 (nesting depth added 2). Most of this is not in the body itself: 6 of the 16 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 114, 134, 85, \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":"invokeai/frontend/webv2/src/workbench/shell/topbar/ProjectSwitcher.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"624abfbff0a731ff0e1e250333033e322b7651b6e7332a2dd883aec38134c07f"}},{"ruleId":"D2","level":"warning","message":{"text":"TextOptions.FontAxisSettings (cognitive 16): TextOptions.FontAxisSettings has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7, ternaries 5, boolean chains 4. Most of this is not in the body itself: 4 of the 16 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 422, 408, 394, \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/TextOptions.tsx"},"region":{"startLine":381}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f4694bbfdd87e32103ba6ba5feea5315ca928d7741a2818d9adb01f289fc579"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: engine.createCanvasEngine: FunctionTooLong \u2014 createCanvasEngine runs 1852 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1752 over it, 18.52\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":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"1be8e850bfe05b3c5aa922ad3727b3170b5cc3140fd0dee9db64224389d4e659"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GalleryImageGrid.GalleryImageGrid: FunctionTooLong \u2014 GalleryImageGrid runs 1266 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1166 over it, 12.66\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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.tsx"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"56ea34c9cd91a5dd67cfb7ef414cc2f9c8270db02ffb4a4ef2c6fcae91f0a057"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: indexedDbDraftStore.createIndexedDbProjectDraftStore: FunctionTooLong \u2014 createIndexedDbProjectDraftStore runs 1074 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 974 over it, 10.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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a9e7a562b445c77fa3b9e749d2c80b9aefdc9dc1d4d37f98cb0d044009133b7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: LayersTree.LayersTree: FunctionTooLong \u2014 LayersTree runs 912 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 812 over it, 9.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayersTree.tsx"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"4193c410cf67c839411b2c183b437efe2278a8fb6f7aebe7652a13c073ecb3b2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: documentModel.createDocumentModel: FunctionTooLong \u2014 createDocumentModel runs 812 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 712 over it, 8.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"f55a71df1326ff0d5b50a36e0c7ebd2b84f84606f958f6dcb22d62004e51a5b4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: workbench/workbenchState.ts: FileTooLong \u2014 4030 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 3530 over it, 8.06\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":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4dbd8cf32006da0fbb2b31ee3b30c5dbff15dc536cf36f691741fe7e818248b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowEditorView.WorkflowFlow: FunctionTooLong \u2014 WorkflowFlow runs 745 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 645 over it, 7.45\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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"226ac2a878de27c42c0aab0a3111b035b4a19e8b8f074b02a8ef545ab851958c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: shared/graph.py: FileTooLong \u2014 3724 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 3224 over it, 7.45\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"830a07a79a2da48cacf3dcec798853535a2b428bf82ced672b8bc6dbe4102488"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useImageActions.useImageActions: FunctionTooLong \u2014 useImageActions runs 700 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 600 over it, 7.00\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":"invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"30eb2883ef7b7896d48a70e3a68b8b9921a726cdd6aea9d13aa17680a0ce95f9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: coordinator.createQueueCoordinator: FunctionTooLong \u2014 createQueueCoordinator runs 653 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 553 over it, 6.53\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime/coordinator.ts"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"7577a229b4c60ae40b7f86c7e08573ea0d37ec8e88237ff84ac17747f76ddff2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buildFLUXGraph.buildFLUXGraph: FunctionTooLong \u2014 buildFLUXGraph runs 598 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 498 over it, 5.98\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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9c0bf01a7b34c800c34c2a23620ccb6297490287bafc150f743534ea85f52db"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: draftStore.contract.testProjectDraftStoreContract: FunctionTooLong \u2014 testProjectDraftStoreContract runs 596 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 496 over it, 5.96\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"324a13850bf93acc3070b48735a41fe63c320190f5e96f7ac143a6257efe6e3f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: projects/durableSyncedPersistence.ts: FileTooLong \u2014 2903 significant lines (blank, comment-only and punctuation-only lines excluded), about 86% of them inside a single declaration: createDurableSyncedWorkbenchPersistence (561-3804). The bar is 500 significant lines; this is 2403 over it, 5.81\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":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8eb705a5d7cce443b18fb4b3e71a0a0409b6587bc9058045fc7caad5fcac7150"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: VideoWidgetView.VideoWidgetView: FunctionTooLong \u2014 VideoWidgetView runs 576 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 476 over it, 5.76\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8394c61afc07fc9f9a83c65f253e755418898d0a5f40d93433300b767963b67"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: draftStore.createMemoryProjectDraftStore: FunctionTooLong \u2014 createMemoryProjectDraftStore runs 563 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 463 over it, 5.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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":907}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2620b3ecf2c80579374b46f77e3bca33362986bf5f73ec091decd0651ef4029"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: modelSelected.addModelSelectedListener: FunctionTooLong \u2014 addModelSelectedListener runs 539 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 439 over it, 5.39\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"1afd47212109f16cfd36afdfe462b0fa3bb8a297b5648e00ddb9a0a6f9014063"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CanvasTextOverlay.TextEditor: FunctionTooLong \u2014 TextEditor runs 522 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 422 over it, 5.22\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"5313ec81505ec232a94272639a4ad3a8b911735860d6dc9f4464eca2e3667864"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: unloadJournal.scenarios.testUnloadJournalScenarios: FunctionTooLong \u2014 testUnloadJournalScenarios runs 511 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 411 over it, 5.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d497fe4642647d8467bd3c07caa8d749769cbd880711f2128f5279c2a022f32"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useGalleryData.useGalleryData: FunctionTooLong \u2014 useGalleryData runs 482 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 382 over it, 4.82\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryData.ts"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"07d746dbd82bca70a7626539fde5a43a97603590edca6a389d791d9db4a07599"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: readiness.getReasonsWhyCannotEnqueueCanvasTab: FunctionTooLong \u2014 getReasonsWhyCannotEnqueueCanvasTab runs 465 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 365 over it, 4.65\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":773}}}],"partialFingerprints":{"codehealthFindingId/v1":"c94e1c8ba63ab59fdf079b74399019fe652fb47b18c8f95b02afab9c3ebc3e2c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GalleryPickerView.GalleryPickerView: FunctionTooLong \u2014 GalleryPickerView runs 456 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 356 over it, 4.56\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":"invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerView.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fa85c184d6c293408ba4ab3d8d95df4244a789b6089374a7761eb792528b873"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: persistenceRuntime.createWorkbenchPersistenceRuntime: FunctionTooLong \u2014 createWorkbenchPersistenceRuntime runs 438 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 338 over it, 4.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":"invokeai/frontend/webv2/src/workbench/persistenceRuntime.ts"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"527b37571a6d04e12982c2241f2713c0787ed5ce0f654369e388976486caa844"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: configs/main.py: FileTooLong \u2014 2172 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1672 over it, 4.34\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":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd3c6cbb1573e78cc09768a9042b6d9f5d890388428c7ade8039247b5c1dcf7b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: canvas-engine/engine.ts: FileTooLong \u2014 2122 significant lines (blank, comment-only and punctuation-only lines excluded), about 87% of them inside a single declaration: createCanvasEngine (333-2935). The bar is 500 significant lines; this is 1622 over it, 4.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":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"67ad75ba4363fe6e74ace810fcda54625b08375af6302aa254b6c5b91d8ba1a7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: model_install/model_install_default.py: FileTooLong \u2014 2116 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1616 over it, 4.23\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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3dfe7e363e1b771b06e7d6b25ec30aa99e8609001e37c5156d04ce5df5162f7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: shared/graph_materializer.py: FileTooLong \u2014 2090 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1590 over it, 4.18\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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d93d35883d8b3262400fc9d0a562052d4b94b03c83f1b8b4fb30b24159f894b7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: bitmapStore.createBitmapStore: FunctionTooLong \u2014 createBitmapStore runs 414 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 314 over it, 4.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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfd165fa45e582d3b668efaccc1b1082786480541b1d5fe4fce22dbfaa21f97f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PreviewWidgetView.PreviewWidgetView: FunctionTooLong \u2014 PreviewWidgetView runs 409 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 309 over it, 4.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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewWidgetView.tsx"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"e988c929b1ab583f8e6d42876ebfb7666c92ee534129126dbf2c00a8a836a11f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: metadata/parsing.tsx: FileTooLong \u2014 2034 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1534 over it, 4.07\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"072166369cb8c90c64ebb203de331ea7e2023feae995259ceb19233cec18f334"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: scripts/mock-backend.mjs: FileTooLong \u2014 1954 significant lines (blank, comment-only and punctuation-only lines excluded), about 68% of them inside a single declaration: startMockBackend (932-2879). The bar is 500 significant lines; this is 1454 over it, 3.91\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":"invokeai/frontend/webv2/scripts/mock-backend.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcd773d2ebe56462a173e83d37a32ebaeeb97298b21c22e2f575b775de51b5c0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: FontsPage.FontLibrary: FunctionTooLong \u2014 FontLibrary runs 387 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 287 over it, 3.87\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":"invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.tsx"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f44743beca7fde48ec2408152fb764f1f1fb9d5bec524f2bf55ee347fca0d03"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ReferenceImageCropDialog.ReferenceImageCropDialog: FunctionTooLong \u2014 ReferenceImageCropDialog 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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"40e5aa7085ffc51149e5cb3ada9837c8adc2843783fdb52d192c7a4ed3b6835b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ScrubberField.ScrubberField: FunctionTooLong \u2014 ScrubberField runs 381 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 281 over it, 3.81\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":"invokeai/frontend/webv2/src/platform/ui/ScrubberField.tsx"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"df67e557c6544d170e0bfd56464924d3c5223cd9cea4d4598f593f0a57a0f103"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AddNodeDialog.AddNodeDialogContent: FunctionTooLong \u2014 AddNodeDialogContent runs 362 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 262 over it, 3.62\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/AddNodeDialog.tsx"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebe6828d841dc88038c474a3f083ebf35724aa5d6a7af13fff8d86269b85add8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ModelInstallQueueItem.ModelInstallQueueItem: FunctionTooLong \u2014 ModelInstallQueueItem runs 360 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 260 over it, 3.60\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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueItem.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa1442a67273871dfe4046795e7db998359686b8f4d26f2c60df85a63d99d4c1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: queue/runtime.ts: FileTooLong \u2014 1776 significant lines (blank, comment-only and punctuation-only lines excluded), about 83% of them inside a single declaration: createQueueRuntime (430-2554). The bar is 500 significant lines; this is 1276 over it, 3.55\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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"057c3a6b84e7ef2c1d346df0d702925c25f788adaf4b7dcbc9db774320fe7971"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: FloatingWidgetWindow.FloatingWidgetWindow: FunctionTooLong \u2014 FloatingWidgetWindow runs 347 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 247 over it, 3.47\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widget-frame/FloatingWidgetWindow.tsx"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab1a4d5717a9a6b709a4592a18b53cc21db921ccc5555ad8e910048929b8104f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: LayerRow.LayerRowComponent: FunctionTooLong \u2014 LayerRowComponent runs 346 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 246 over it, 3.46\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRow.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ff6d7671ed43111b8e7c6c4d5b42f161ed1669b5d42953c18d9a37737cfb9ff"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: layerCache.createLayerCacheStore: FunctionTooLong \u2014 createLayerCacheStore runs 344 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 244 over it, 3.44\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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerCache.ts"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"4423775d30691ca05acff0a6d5da0a2606b17dc1b57f7b112f8f0b9f10881e4a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: forLoops.validateForLoopGraph: FunctionTooLong \u2014 validateForLoopGraph runs 342 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 242 over it, 3.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ce4e2b610bc097e62ec7d21d89a1f7a05dce936e81ec73818b65a55601ba594"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowPublicationHost.WorkflowPublicationHost: FunctionTooLong \u2014 WorkflowPublicationHost runs 336 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 236 over it, 3.36\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowPublicationHost.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"206f5b15862a235896feddc59402b6ee678f33dcad14da958f9ce561c1e710b6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: fields/WorkflowFieldInput.tsx: FileTooLong \u2014 1643 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1143 over it, 3.29\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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b78911664547b6f126dd947af6a42988819db2772a6cf1946f7fd890a583303c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AddModelsView.AddModelsView: FunctionTooLong \u2014 AddModelsView runs 324 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 224 over it, 3.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":"invokeai/frontend/webv2/src/features/models/ui/add-models/AddModelsView.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"75ed3628298414345cdfb153b83aea15aecb423453097dc963052adea502de82"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: recallParameters.buildRecallParametersSettings: FunctionTooLong \u2014 buildRecallParametersSettings runs 323 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 223 over it, 3.23\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":"invokeai/frontend/webv2/src/workbench/image-actions/recallParameters.ts"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a849c1f0cf04cdbbc72b363c61a383b19433d7426e2adcd4448004e8823c86c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/GalleryImageGrid.tsx: FileTooLong \u2014 1605 significant lines (blank, comment-only and punctuation-only lines excluded), about 79% of them inside a single declaration: GalleryImageGrid (404-2118). The bar is 500 significant lines; this is 1105 over it, 3.21\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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"47529653d04853626cc94c36454986faed768b72a050cd3b425e17ebfdb43f0c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SelectObjectCoordinator.createSelectObjectOperationCoordinator: FunctionTooLong \u2014 createSelectObjectOperationCoordinator runs 321 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 221 over it, 3.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/SelectObjectCoordinator.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"49ac9041ba3425a53e2e29657c7de8e1198e23bc70fee4ee6a86d6934674a679"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ModelInstallService: TooManyMethods \u2014 96 methods. The bar is 30 methods; this is 66 over it, 3.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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfb46aa15f6784f4e1ee03e85e7202b60e8db4b67fee38b72e2a4428e602077f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: selectObjectSession.createSelectObjectSession: FunctionTooLong \u2014 createSelectObjectSession runs 319 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 219 over it, 3.19\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":"invokeai/frontend/webv2/src/workbench/canvas-operations/selectObjectSession.ts"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"a11bf190f42b7c2ff8a399bf1ab4407487b81e89df6834164e0eac8b8a1f7a9a"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: GalleryImageGrid: ClassTooLong \u2014 1266 significant lines (blank, comment-only and punctuation-only lines excluded), 10 methods. The bar is 400 significant lines; this is 866 over it, 3.17\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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f06cd6ba6bdf76bf721450fd3f4fbfcb0cbf877ed0455ee77558a22d7c02a844"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: IntermediatesManager.IntermediatesManager: FunctionTooLong \u2014 IntermediatesManager runs 315 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 215 over it, 3.15\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/intermediates/ui/IntermediatesManager.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"d59470dd4cbe510b162cf2c89f33c04f7fe79744efa49dacd726ff187b26b495"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: runtime.createFontRuntime: FunctionTooLong \u2014 createFontRuntime runs 314 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 214 over it, 3.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":"invokeai/frontend/webv2/src/features/fonts/runtime.ts"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"53a088bb1c508dfee625d094e83fee2ea6a3b3741e704d42697dc688b4202657"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: usePreviewLoupe.usePreviewLoupe: FunctionTooLong \u2014 usePreviewLoupe 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewLoupe.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"755c8bb035ca4fa93f51c6e4cfa151d544f225ad6a3e18dd4668f8564f042989"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buildSDXLGraph.buildSDXLGraph: FunctionTooLong \u2014 buildSDXLGraph runs 312 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 212 over it, 3.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"97e3577b20b49cdb80368ba962109de71fc7263b0ff6161bea8a210c3ac931eb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: store/canvasSlice.ts: FileTooLong \u2014 1548 significant lines (blank, comment-only and punctuation-only lines excluded), about 82% of them inside a single declaration: slice (113-1899). The bar is 500 significant lines; this is 1048 over it, 3.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":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4826318b3c5bc8f7c18b99019e89aac70b4ce29e5fd53e1f3ce698c225b0b5b4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: core/videoPolicies.ts: FileTooLong \u2014 1536 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1036 over it, 3.07\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af3359c927996b991a463c2fd064e51f30859641de8f30713f34f13d82c06404"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: addRegions.addRegions: FunctionTooLong \u2014 addRegions runs 306 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 206 over it, 3.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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"6578fedc04f4327e3af77e690bd0b4026203055c7a7b02076439ecf84903ce94"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SettingsModal.SettingsModal: FunctionTooLong \u2014 SettingsModal runs 302 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 202 over it, 3.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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c3997271a08521293814fcac803135a5ce7bafa0f02449dc03ba58f5344ee1e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ControlLayerSettings.ControlLayerSettings: FunctionTooLong \u2014 ControlLayerSettings runs 302 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 202 over it, 3.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":"invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0ce67833b82b15443f2504ac4adfc46feeb4fa6e386acd34041a298fe6b08fb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GenerateAdvancedFields.GenerateAdvancedFields: FunctionTooLong \u2014 GenerateAdvancedFields runs 299 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 199 over it, 2.99\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/GenerateAdvancedFields.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5734f1c1a6aa91a4db3378c6ce13d29051eb266134188cd00634d558c109949"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: model_loaders/flux.py: FileTooLong \u2014 1494 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 994 over it, 2.99\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":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6ae1cca5208c3d93032847eeb805ea4cf475af456ee572a90a99e20a505a171"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: promptAST.parseTokens: FunctionTooLong \u2014 parseTokens runs 297 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 197 over it, 2.97\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":"invokeai/frontend/webv1/src/common/util/promptAST.ts"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"6967285a02b75a1e22a0e5be5c9e1c86a9b6cfa3941aecc8a6a38f1c57791dc2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: VideoReferenceListField.VideoReferenceListField: FunctionTooLong \u2014 VideoReferenceListField runs 288 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 188 over it, 2.88\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":"invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx"},"region":{"startLine":363}}}],"partialFingerprints":{"codehealthFindingId/v1":"5506e7c6bd5e2daadb5e7794ffeb60c60c6874cb8c5a402b0d4efe65f859afee"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: LayerGroupContextMenu.LayerGroupContextMenu: FunctionTooLong \u2014 LayerGroupContextMenu runs 288 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 188 over it, 2.88\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerGroupContextMenu.tsx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef0e53cd027f623aebf7ad2b112ee3dd3facbcb2d2d0bdda4a7bbd68504f5c50"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: queueRunJournal.createIndexedDbQueueRunJournal: FunctionTooLong \u2014 createIndexedDbQueueRunJournal runs 287 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 187 over it, 2.87\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":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRunJournal.ts"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"c44b8945811ed53394a1ed8cf4957d732852ae3b5f5ea20c12afed16cb68e7b5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: shared/graph_validation.py: FileTooLong \u2014 1426 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 926 over it, 2.85\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":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba5c948e4ed6640511637e8d15b1385592a2dcc7843966f3708baa4171f17233"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: firstPartyCommands.useRegisterFirstPartyCommands: FunctionTooLong \u2014 useRegisterFirstPartyCommands runs 283 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 183 over it, 2.83\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":"invokeai/frontend/webv2/src/workbench/hotkeys/firstPartyCommands.ts"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"060698f3000659b02dc1fc8d1c02fd995bb770d0100c05b1e29a2689b7af8b78"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: model_cache/model_cache.py: FileTooLong \u2014 1408 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 908 over it, 2.82\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":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6bf9dbc66eb996b19d04d0fcaaa6f6e70a96e6e45f903449cfbb9eb08cdd6fb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: RunLayerWorkflowDialog.RunLayerWorkflowDialog: FunctionTooLong \u2014 RunLayerWorkflowDialog runs 280 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 180 over it, 2.80\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/RunLayerWorkflowDialog.tsx"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"cda546b5fc30e2c19fc5cf5a1297cb3175c5c3ceb420a54dc8eda5dd3844b2de"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GalleryMediaSlot.GalleryMediaSlot: FunctionTooLong \u2014 GalleryMediaSlot runs 279 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 179 over it, 2.79\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":"invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryMediaSlot.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f31163d41d87bcf1c1889ea80a81ebd2ff5ad02ed58e88d7d93529b8b6858f5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UserProfile.UserProfile: FunctionTooLong \u2014 UserProfile runs 276 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 176 over it, 2.76\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/UserProfile.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"aac4c358c95c5a9bb1b5b3a0d58bd0041dd42a0069d3ba8c99a2e1dfca4f6119"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: groupSurfaceCache.createGroupSurfaceCache: FunctionTooLong \u2014 createGroupSurfaceCache runs 275 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 175 over it, 2.75\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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/groupSurfaceCache.ts"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5b766fb92bf269ccb2633c3a7c680fc6c1f23db0c6628012fc059ce83ad15b1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowLibraryDialog.WorkflowLibraryDialog: FunctionTooLong \u2014 WorkflowLibraryDialog runs 272 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 172 over it, 2.72\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDialog.tsx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"772252c32ba65de5c86ba38f2913cea63f61c3ff99c68b88bee67d31bb5cc555"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: canvasProjectMutations.applyCanvasProjectMutation: FunctionTooLong \u2014 applyCanvasProjectMutation runs 268 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 168 over it, 2.68\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":"invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts"},"region":{"startLine":669}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dda0eeea77c4a195915849b5357ae879fba659783764600fff1f40b40126f43"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: graph.buildLtx2VideoGraph: FunctionTooLong \u2014 buildLtx2VideoGraph runs 267 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 167 over it, 2.67\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/graph.ts"},"region":{"startLine":654}}}],"partialFingerprints":{"codehealthFindingId/v1":"900e4980d2edf50903da806e24bb862bc98c1fd72941c309c56c1539d1cd23bb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: core/graph.ts: FileTooLong \u2014 1331 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 831 over it, 2.66\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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7410b11827ae7b83d8e5c84db8481c1f211ed18da72e0054c1ad858b6000b779"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ModelSelect.ModelSelect: FunctionTooLong \u2014 ModelSelect runs 266 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 166 over it, 2.66\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":"invokeai/frontend/webv2/src/features/models/ui/components/ModelSelect.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"00630f6ffe6e55876313f6559d345f87b8f95a8c4a7794c2abe914bbff11fc08"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ModelEdit.ModelEdit: FunctionTooLong \u2014 ModelEdit runs 263 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 163 over it, 2.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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f214f00db0015f622c7edc47ba86e37d1f430cec740626f3adeeaf67eb5fd3a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: core/baseGenerationPolicies.ts: FileTooLong \u2014 1292 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 792 over it, 2.58\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":"invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4437d28df1335205149b569671fabe8031b76283f1acdd0e33ff2926141b9b7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectWorkflowsView.ProjectWorkflowDetailPanel: FunctionTooLong \u2014 ProjectWorkflowDetailPanel runs 256 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 156 over it, 2.56\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":"invokeai/frontend/webv2/src/features/workflow/ui/library/ProjectWorkflowsView.tsx"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcd919da4e066ce3e431275d01154537022d163cac5c1c38bb833c481b71c3e6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GenerateConditioningRebalanceField.GenerateConditioningRebalanceField: FunctionTooLong \u2014 GenerateConditioningRebalanceField runs 255 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 155 over it, 2.55\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/GenerateConditioningRebalanceField.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cdddac08592cede01cf9076481f4f808df5d1d5393c2f64ea0658667506136f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: createCanvasEngine.createCanvasEngine: FunctionTooLong \u2014 createCanvasEngine runs 253 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 153 over it, 2.53\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/createCanvasEngine.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"a96c812fe4b8cc668dc3df184b1cc6f71d8941651381768364db1bec79f09c7d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buildSD1Graph.buildSD1Graph: FunctionTooLong \u2014 buildSD1Graph runs 252 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 152 over it, 2.52\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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"acf91659aec35bf8340b1ee44fcc557ee9d2cc251fc5d6cef65b31737caa5dc7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: projects/draftStore.ts: FileTooLong \u2014 1252 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 752 over it, 2.50\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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9af74c713f926de3b7dca93486aa475ed50e59fdb45671208ec04187148baa9b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: _ExecutionNodeBuilder: TooManyMethods \u2014 75 methods. The bar is 30 methods; this is 45 over it, 2.50\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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"f68b628d308d7ed61b1873c4f47450fd93e582d84eb1b5e2acce271a507f1055"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buildZImageGraph.buildZImageGraph: FunctionTooLong \u2014 buildZImageGraph runs 249 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 149 over it, 2.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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e31bc594dc3d7f5c25430e699dfb417e859f6701e2cfaadf9e459744b9079f4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowFieldRenderer.WorkflowFieldRenderer: FunctionTooLong \u2014 WorkflowFieldRenderer runs 244 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 144 over it, 2.44\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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfa8f14070526aca5c1b0ddfcc162928609e19fca368c10b22af1f2b71252b32"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GalleryThumbnail.GalleryThumbnail: FunctionTooLong \u2014 GalleryThumbnail runs 242 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 142 over it, 2.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryThumbnail.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"e141a775d9846a2ab5818129bc835595c0b8a3158671231d1ff7358fadad4249"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: selectionState.createSelectionState: FunctionTooLong \u2014 createSelectionState runs 242 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 142 over it, 2.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionState.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"730d890a87afc26c1c9e77483d0b28e2ad3a5ece89c1c5c5e6b8245a269d086b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: List.List: FunctionTooLong \u2014 List runs 241 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 141 over it, 2.41\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":"invokeai/frontend/webv2/src/platform/ui/list/List.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"51a361b7d27fa3f97601decdb482dc840807c1a0ea62d601e35d246d729b75e0"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SessionQueue: TooManyMethods \u2014 72 methods. The bar is 30 methods; this is 42 over it, 2.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":"invokeai/app/services/session_queue/session_queue_default.py"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"054297410ab58cbbaae85cdee381b8bc65155e7919b42769e3e3bf0e93734c4f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: DiagnosticsPanel.DiagnosticsPanel: FunctionTooLong \u2014 DiagnosticsPanel runs 240 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 140 over it, 2.40\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":"invokeai/frontend/webv2/src/workbench/diagnostics/DiagnosticsPanel.tsx"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"90a6fb9bf6641caad9d9801ff199252fe65b2f779f08e6b3c61ced7e05ddca58"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: networks/pixeldit_official.py: FileTooLong \u2014 1196 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 696 over it, 2.39\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":"invokeai/backend/pid/_src/networks/pixeldit_official.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac5211dfd984adb3514b0503948197be327a55c9cace21d9c46244c1a708a5e5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: addOutpaint.addOutpaint: FunctionTooLong \u2014 addOutpaint runs 238 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 138 over it, 2.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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"e89023912db6b39cc1d5594dce226c4bff4d764b8da758e8760817c1dc394cbf"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: projects/indexedDbDraftStore.ts: FileTooLong \u2014 1189 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 689 over it, 2.38\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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"657ab6e40a37df6559721e950d69bd7fac1f341a4066341eff757c0af48ccb15"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PromptTemplateEditor.PromptTemplateEditor: FunctionTooLong \u2014 PromptTemplateEditor runs 237 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 137 over it, 2.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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplateEditor.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddc1a8fdf8b72b9d8acd4bfe01de11c04ec0f7e3959e2a3a8969859f1c6d07c1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: types/field.ts: FileTooLong \u2014 1180 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 680 over it, 2.36\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":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3ffebafe7412241c5d34c682091bed9af08604be818b4f6980a4737d087744c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useGalleryActions.useGalleryActions: FunctionTooLong \u2014 useGalleryActions runs 235 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 135 over it, 2.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":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryActions.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffaf978247b72361620a66609d7720b465529fe663a14b13c3f6a6bed54febaf"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: invocations/composition-nodes.py: FileTooLong \u2014 1165 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 665 over it, 2.33\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":"invokeai/app/invocations/composition-nodes.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb766f782403a77a5fc7e057767645c22dd2b5e273e4a389019f4ad49067b24e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: HsvWheelPicker.HsvWheelPicker: FunctionTooLong \u2014 HsvWheelPicker 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":"invokeai/frontend/webv2/src/platform/ui/HsvWheelPicker.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb343f4ea8092eff1aa83a50e6d29d3cd9e0a5c5b2922cc0d038ff17f8a93c79"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useCompareLoupe.useCompareLoupe: FunctionTooLong \u2014 useCompareLoupe 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/useCompareLoupe.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ab7aaff2979a29bfd8052de6398ecc10ffa6418d2f83287b11b2cfcb871bcd8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: usePreviewSwipe.usePreviewSwipe: FunctionTooLong \u2014 usePreviewSwipe 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewSwipe.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"c491967a6d263eae4f88fa52ed2f980a5bd6e0af5747b75eaa50a45ba6c70c5d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: document-model/documentModel.ts: FileTooLong \u2014 1153 significant lines (blank, comment-only and punctuation-only lines excluded), about 70% of them inside a single declaration: createDocumentModel (463-1578). The bar is 500 significant lines; this is 653 over it, 2.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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"33c02f855d51117a510cb204496256e23ad1ba8ae04db52256486156aedf52c5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: filterOperationSession.createFilterOperationSession: FunctionTooLong \u2014 createFilterOperationSession runs 230 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 130 over it, 2.30\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/filterOperationSession.ts"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"4262a9b1813f134a6bcb2439bd0f5786fca036d45086f8070ed68773a1712c3e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: routers/model_manager.py: FileTooLong \u2014 1142 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 642 over it, 2.28\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":"invokeai/app/api/routers/model_manager.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"83c41f824cf08f4efad09a5e5f67a22fc2f76238d7ad617245f596a22374e79b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: store/paramsSlice.ts: FileTooLong \u2014 1142 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 642 over it, 2.28\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":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebe3198f2ad354641885bc7f45552edfb0a7cbad8feb6f5c1c707ae84d73ecd4"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: LayersTree: ClassTooLong \u2014 912 significant lines (blank, comment-only and punctuation-only lines excluded), 7 methods. The bar is 400 significant lines; this is 512 over it, 2.28\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayersTree.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8caeabe9446dc3434876b2c1a583ccf4d3f2d5902b14f46c353abfd1075222be"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SystemPromptsField.SystemPromptsField: FunctionTooLong \u2014 SystemPromptsField runs 228 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 128 over it, 2.28\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/SystemPromptsField.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3b31ee4d0a6ddd02417ae196054528df1bbf0c62963ea2ce40045d816d39fe9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: VideoReferenceListField.ReferenceCard: FunctionTooLong \u2014 ReferenceCard runs 228 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 128 over it, 2.28\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a5aed1a024e5ca287aba9f022d872fb538072a7012d63e87a276b60976f43c6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: fontLoader.createFontLoader: FunctionTooLong \u2014 createFontLoader runs 226 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 126 over it, 2.26\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/fontLoader.ts"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"29da97ace8bd0e91e0fe59220a6d644ae0e6613423955c6be9f2df6104ed94ca"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkbenchShell.WorkbenchShell: FunctionTooLong \u2014 WorkbenchShell runs 225 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 125 over it, 2.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/shell/WorkbenchShell.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"6778ff6fb21a78d48c3f945fdc9cefbea0d6f04badc65c41154f29f48f6dcdc8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: model_loaders/z_image.py: FileTooLong \u2014 1124 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 624 over it, 2.25\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":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6af5e896bb1e3677b8b69b278b43884e4945ae46502a762e6c12d132a3f687f1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UserManagement.UserFormModal: FunctionTooLong \u2014 UserFormModal runs 222 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 122 over it, 2.22\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/UserManagement.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff728984223c642540a1b89ae0ac6b6f0f3b247e35a63c586c9ad9fa5c14945a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: utilityGraph.runUtilityGraph: FunctionTooLong \u2014 runUtilityGraph runs 222 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 122 over it, 2.22\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime/utilityGraph.ts"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"136f6e63d7481105c8f5f7b9cac71e8d93728b4e07891d2121ac47facaf0f819"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: data/backend.ts: FileTooLong \u2014 1102 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 602 over it, 2.20\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/data/backend.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3167b343e04cb73489cc2272bc3ba81eda4a13aaccd81b93a3a3a261a0941f15"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: videoRecall.buildVideoRecallSettings: FunctionTooLong \u2014 buildVideoRecallSettings runs 220 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 120 over it, 2.20\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"91fc94f8a8d33f5993b4a4ff5e11b3ef5bade692ce3fd250f5973adc22dc0ef2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AdjustmentSettings.CurvesEditor: FunctionTooLong \u2014 CurvesEditor runs 220 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 120 over it, 2.20\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/AdjustmentSettings.tsx"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"40669f33e67717b748d602b3cbe34eaa9a148305cad8245f731340efb8f8bbb9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: layers/LayerContextMenu.tsx: FileTooLong \u2014 1097 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 597 over it, 2.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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7ca383c6a7afae7cdc7a10eaa0ffcf145526a3fd9d696f97a52fa399fd7fbfd"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: addInpaint.addInpaint: FunctionTooLong \u2014 addInpaint runs 218 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 118 over it, 2.18\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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee4c0ab177a89850713a4163f3990ebdc0573fe57a32a359af70164929a049d5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CanvasHeaderActions.CanvasHeaderActionsInner: FunctionTooLong \u2014 CanvasHeaderActionsInner runs 218 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 118 over it, 2.18\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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasHeaderActions.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"065a21859ade8050c78c630fcf0e9928a10896c7a95546159e361021b0457894"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: document.applyProjectGraphAction: FunctionTooLong \u2014 applyProjectGraphAction runs 217 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 117 over it, 2.17\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/document.ts"},"region":{"startLine":907}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0173d28377b89b4a8fd69d77f892365d2921f0acb5591d0e5d53665f81926e2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ModelEditForm.ModelEditForm: FunctionTooLong \u2014 ModelEditForm runs 216 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 116 over it, 2.16\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":"invokeai/frontend/webv2/src/features/models/ui/detail/ModelEditForm.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c972ad1e3c8d9bed23347a3de20a4df4a47e8cdf29181b1b269a821a3b2e2d8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: OverviewPane.ConnectedOverview: FunctionTooLong \u2014 ConnectedOverview runs 216 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 116 over it, 2.16\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/OverviewPane.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"cab2c7beeb50be1a1d5b698af4276bbf6d7cf0da92db13b5af3e29ba13e7c366"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: invocations/image.py: FileTooLong \u2014 1064 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 564 over it, 2.13\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":"invokeai/app/invocations/image.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"17a5c1e72c0a39c6cb8a043c60b8ca0ffe8f628ac6c4f1476043a9b9c0681386"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowWidgetChrome.WorkflowDialogHost: FunctionTooLong \u2014 WorkflowDialogHost runs 212 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 112 over it, 2.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/WorkflowWidgetChrome.tsx"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ea157168572e597558a247a3f0f867de5cba10ea3d807dc5a83cadfc497e01c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GalleryMaintenance.GalleryMaintenance: FunctionTooLong \u2014 GalleryMaintenance runs 212 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 112 over it, 2.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/GalleryMaintenance.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"828b2d54f440eee5694759df7bf8b6515478f3327f491941ad253adb830a97af"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: TextOptions.TextFontSettings: FunctionTooLong \u2014 TextFontSettings runs 210 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 110 over it, 2.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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/TextOptions.tsx"},"region":{"startLine":566}}}],"partialFingerprints":{"codehealthFindingId/v1":"e54dc6ceaeaa489859837948e5b58e21ab94c7d62c0f80c778de8c5806426c35"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PreviewFrame.PreviewImageFrame: FunctionTooLong \u2014 PreviewImageFrame runs 210 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 110 over it, 2.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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f21f76cb2513dde5ed4a0f48e871831d2a21efa081f5c47f53b91b562fadb8c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectSwitcher.ProjectSwitcher: FunctionTooLong \u2014 ProjectSwitcher runs 208 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 108 over it, 2.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":"invokeai/frontend/webv2/src/workbench/shell/topbar/ProjectSwitcher.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a1848c20f91c5aba7a6536b328b775168d843a2748c68804d86c86bb8748cf4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: layers/LayersTree.tsx: FileTooLong \u2014 1038 significant lines (blank, comment-only and punctuation-only lines excluded), about 88% of them inside a single declaration: LayersTree (169-1322). The bar is 500 significant lines; this is 538 over it, 2.08\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayersTree.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fade02c0d9a7ac241e4e8fb8403ca8a67913baa41b91b7340e9dc8e04c4b8a85"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useGalleryGridSelection.useGalleryGridSelection: FunctionTooLong \u2014 useGalleryGridSelection runs 207 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 107 over it, 2.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryGridSelection.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"17b7dd5323ca00637359b76cdf19acf2c7f97277c903ee6757ed417f15f1fad1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: workbenchState.enqueueCompiledSnapshot: FunctionTooLong \u2014 enqueueCompiledSnapshot runs 207 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 107 over it, 2.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":3538}}}],"partialFingerprints":{"codehealthFindingId/v1":"47c5bb679daa3887b78ca0554c7a7f99a4134dc368e7802523348ea4b7f5b251"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: mutationContext.createCanvasMutationContext: FunctionTooLong \u2014 createCanvasMutationContext 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mutationContext.ts"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"3481204145888e239b8ae19b4cf0c3967798f7993c2955814644366977b0329f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: shapeTool.createShapeTool: FunctionTooLong \u2014 createShapeTool 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/shapeTool.ts"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"1523b8182e49f6feab9884b31d555a0b0d4afb8aba13b4644675d22a1154be69"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buildKrea2Graph.buildKrea2Graph: FunctionTooLong \u2014 buildKrea2Graph runs 204 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 104 over it, 2.04\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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"f336b44161cdd796d864e6a02848a7ae7cd354418e6f70680f9b316b0d9b809a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: invocations/metadata_linked.py: FileTooLong \u2014 1018 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 518 over it, 2.04\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":"invokeai/app/invocations/metadata_linked.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c36bba70baa1680e6d730b3a32673db73c07c96efaa6b487089a8cc9ad9c06e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ModelCache: TooManyMethods \u2014 61 methods. The bar is 30 methods; this is 31 over it, 2.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":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"08b5856a5638f5a3c71807af5a7f21f95b18be212ab69a7bc843763b05487430"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PositivePromptField.PositivePromptField: FunctionTooLong \u2014 PositivePromptField 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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptField.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"eddaeda8f92ff8178281daa69a335250c4ac028a9ddb86ab42aa8511b62d3a29"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GalleryItemSearch.GalleryItemSearch: FunctionTooLong \u2014 GalleryItemSearch runs 202 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 102 over it, 2.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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryItemSearch.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0c8e3b58e269730cbecc038d5516eb34b9d34d58c0c88fa9451e5844ba8690a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: image_index/image_index_default.py: FileTooLong \u2014 1008 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 508 over it, 2.02\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d62d17a8e0d2e80974d448679d0f9af3fd124dc8d776dfb1f12930ea2b34d45"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GalleryBoardRow.GalleryBoardRow: FunctionTooLong \u2014 GalleryBoardRow 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardRow.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"84621330c3c5dfb7637e85f50b9f6c068822f489415a3f43dde26509a7cff7b4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GeneratePresetsPopover.GeneratePresetsPopover: FunctionTooLong \u2014 GeneratePresetsPopover runs 200 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 100 over it, 2.00\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":"invokeai/frontend/webv2/src/features/generation/ui/GeneratePresetsPopover.tsx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd8f30133e919123b9f204b658d560ef8e6bbec58c40cda19da04fa78f958dcb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PasteMediaDialog.PasteMediaDialog: FunctionTooLong \u2014 PasteMediaDialog runs 200 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 100 over it, 2.00\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":"invokeai/frontend/webv2/src/workbench/shell/PasteMediaDialog.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0fcb92fd8505009f7bf1e4ab8cb00786f594b5f4bfc79932ffe8cfa243af7ff"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: editor/WorkflowEditorView.tsx: FileTooLong \u2014 996 significant lines (blank, comment-only and punctuation-only lines excluded), about 75% of them inside a single declaration: WorkflowFlow (305-1360). The bar is 500 significant lines; this is 496 over it, 1.99\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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed1c14e046db6848b523859b1bf8caf73f638d3ff98b828e57f7616d43c778c6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: theme/recipes.ts: FileTooLong \u2014 989 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 489 over it, 1.98\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":"invokeai/frontend/webv2/src/platform/ui/theme/recipes.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0ae0e0fde7255c8a8eeab83b4d518ff8e0d2c8f3cc988925850e78836b80eee"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ModelInstallQueue.ModelInstallQueue: FunctionTooLong \u2014 ModelInstallQueue runs 197 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 97 over it, 1.97\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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueue.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"393f1ac5db28fb72fd980496dd701e6d2476fa1492b4668d41884e33b9beb88a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: store/types.ts: FileTooLong \u2014 982 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 482 over it, 1.96\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":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"19b10620912163f1a05554ead4c76a8dd6780cafa1f7bc0e01bde2025f29daf7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: store/readiness.ts: FileTooLong \u2014 974 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 474 over it, 1.95\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":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a2eb5cc838855f08cd03f5bbb06b7ac79dda5450829246bfa23f43762d93ccc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buildAnimaGraph.buildAnimaGraph: FunctionTooLong \u2014 buildAnimaGraph runs 194 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 94 over it, 1.94\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"dacd2563ce275b1d9d870010efccca7c8306baaad91563a9c96b2e13975c2c5a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ReferenceImageCard.ReferenceImageCardBase: FunctionTooLong \u2014 ReferenceImageCardBase runs 193 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 93 over it, 1.93\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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e08cbfe397afe62b5261cfa95697823f6ccac74c7f585d9df3e89464fb387fb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: image-actions/ImageContextMenu.tsx: FileTooLong \u2014 960 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 460 over it, 1.92\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":"invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8b7e45be1dce7d2dc26c248ccee20810e407db916b45a3d653d3d77fbb7ac47"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CallSavedWorkflowSyncRuntime.CallSavedWorkflowSyncRuntime: FunctionTooLong \u2014 CallSavedWorkflowSyncRuntime runs 191 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 91 over it, 1.91\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/CallSavedWorkflowSyncRuntime.tsx"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"961b536e8c53c6554f5fda8d42f4f1e4262746d0dee50f5c47cb2b88f5eed087"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: scripts/run-accessibility-journeys.mjs: FileTooLong \u2014 950 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 450 over it, 1.90\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":"invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee53f4acbeef6aec41a73f086d92ec390ec75c04b6db6dca2214524e3047aeb9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: InstallQueueBar.InstallQueueBar: FunctionTooLong \u2014 InstallQueueBar runs 190 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 90 over it, 1.90\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":"invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallQueueBar.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"26f01323f217b57de1225b65ea2d7d950f24c0d67123f3951d5c8d57074e7650"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: InvocationFlowNode.InputFieldRow: FunctionTooLong \u2014 InputFieldRow runs 190 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 90 over it, 1.90\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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.tsx"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"d38b99673f386b6abab6414bf3b47ab98d73c5498bdff4737d697511716e259b"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Editor: ClassTooLong \u2014 758 significant lines (blank, comment-only and punctuation-only lines excluded), 46 methods. The bar is 400 significant lines; this is 358 over it, 1.90\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":"invokeai/frontend/webv1/src/features/cropper/lib/editor.ts"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b8af20bf9ea1a5c6b2932cf388d609483af0ded45da6dbdcb53e729e2268a36"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SyncModelsDialog.SyncModelsDialog: FunctionTooLong \u2014 SyncModelsDialog runs 189 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 89 over it, 1.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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/SyncModelsDialog.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f5be9a2aa57b9be5546bdb7bf510bd83d7c20822d1c8fbe76e84b0b120f6a50"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GalleryBoardMenu.GalleryBoardMenu: FunctionTooLong \u2014 GalleryBoardMenu runs 189 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 89 over it, 1.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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"d89d0e7aa828fbfcb82f2b8f894151d96638fcee8f0a1deac7933b0f07726e51"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: transformTool.createTransformTool: FunctionTooLong \u2014 createTransformTool runs 189 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 89 over it, 1.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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/transformTool.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e2a6a39ce695832388a9373127d6e4277463f2d7a2dcc9bc388c23b545d40ae"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: operationController.createCanvasOperationController: FunctionTooLong \u2014 createCanvasOperationController runs 189 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 89 over it, 1.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":"invokeai/frontend/webv2/src/workbench/canvas-operations/operationController.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f636dee256158cc88e8caadb5191e96b9ca09a4793eaec208faf7b62f425200"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buildMultidiffusionUpscaleGraph.buildMultidiffusionUpscaleGraph: FunctionTooLong \u2014 buildMultidiffusionUpscaleGraph runs 187 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 87 over it, 1.87\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":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9f36bb4093f619aaa3a00c891563e271d76bac3748060ee30d20a4b16d7a965"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: Picker.Picker: FunctionTooLong \u2014 Picker runs 187 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 87 over it, 1.87\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":"invokeai/frontend/webv2/src/platform/ui/Picker.tsx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"831beffa37d3d39bd35fa946cc358d3dacc6e169454b8e0cc5229b6f7976f1d8"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ImageIndexService: TooManyMethods \u2014 56 methods. The bar is 30 methods; this is 26 over it, 1.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":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fe92848c9cd34e05f7444bd94171797ed1ca10b83eaad1763e2102a70361364"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: session_queue/session_queue_default.py: FileTooLong \u2014 931 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 431 over it, 1.86\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":"invokeai/app/services/session_queue/session_queue_default.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"481bc697817ba1e34a73ccdd9004566e859e44be512343e76d7543dc921f69c9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: EditorToolbar.EditorToolbar: FunctionTooLong \u2014 EditorToolbar runs 186 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 86 over it, 1.86\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/EditorToolbar.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"0038ad0a129cc795b229efc2b70f36400afe44723a87f2a5e117a4ab4865b62e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: editor/InvocationFlowNode.tsx: FileTooLong \u2014 925 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 425 over it, 1.85\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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a9bbd440d1544d84299a9ac7910fc806c2c150d4ca88aac6ea6ba435bbb6841"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: modelsLoaded.handleMiniMaxH3Overrides: FunctionTooLong \u2014 handleMiniMaxH3Overrides runs 185 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 85 over it, 1.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":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"67c83611e79ba32000dce09746de0fcd8b178fd0fbebad7c9c8d130bf8e3a397"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: settings.normalizeGenerateSettings: FunctionTooLong \u2014 normalizeGenerateSettings runs 185 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 85 over it, 1.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":"invokeai/frontend/webv2/src/features/generation/core/settings.ts"},"region":{"startLine":743}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5ed2448efe50fed064fceff7ff0aebe3927c96c464344b26c6f455211a92da4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PositivePromptActions.ExpandPromptButton: FunctionTooLong \u2014 ExpandPromptButton runs 185 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 85 over it, 1.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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"db7d9beffaba2ec0be14a945c599cac0ba47473653f241ddfe57385465689a22"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CommandPaletteDialog.CommandPaletteContent: FunctionTooLong \u2014 CommandPaletteContent runs 185 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 85 over it, 1.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":"invokeai/frontend/webv2/src/workbench/palette/CommandPaletteDialog.tsx"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"271dd1e2a2b65bf9aa2c983df9c45938c76a23e66572c1eb76dc5d85857d49e1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkbenchCommandPaletteDialog.WorkbenchCommandPaletteDialog: FunctionTooLong \u2014 WorkbenchCommandPaletteDialog runs 185 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 85 over it, 1.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":"invokeai/frontend/webv2/src/workbench/palette/WorkbenchCommandPaletteDialog.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"aedc89bb1220f97a3cf813972f5a252653e0f816f2b7840be2ffda0a7003aa8b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: LayerChildRow.LayerChildRowComponent: FunctionTooLong \u2014 LayerChildRowComponent runs 185 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 85 over it, 1.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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerChildRow.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"3563e95dbee7ce04294a8c579626d7684ad9ae7215a368dd073985d9e92a91b1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ToolWidthPicker.ToolWidthPicker: FunctionTooLong \u2014 ToolWidthPicker runs 183 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 83 over it, 1.83\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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolWidthPicker.tsx"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"040ae45e321f69bd1f6d0f26a3e39dd5a2fb6af8f15d5517c5eb8a93add0ed79"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buildSD3Graph.buildSD3Graph: FunctionTooLong \u2014 buildSD3Graph runs 183 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 83 over it, 1.83\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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"7742ae5365253ae3a2457fbf3611cf5ddd2b6635efc814fa1ddb86f71ebd0f09"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GalleryPickerGrid.GalleryPickerGrid: FunctionTooLong \u2014 GalleryPickerGrid runs 182 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 82 over it, 1.82\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerGrid.tsx"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"97ea4d11f040613379ebba2dc0ae3346d47024af24acda142bc2c6a5a882075d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: configs/lora.py: FileTooLong \u2014 903 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 403 over it, 1.81\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":"invokeai/backend/model_manager/configs/lora.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaef4214c4822dbebdae2f2a956a39be03612d9c60a33f0a87296411db2ab540"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: image-actions/imageRecall.ts: FileTooLong \u2014 898 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 398 over it, 1.80\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":"invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"21ba533f20553fc4a7de21c3d76d763f4b591734f51cf94c78b359cbd3513b94"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GenerateSettingsForm.GenerateSettingsForm: FunctionTooLong \u2014 GenerateSettingsForm runs 179 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 79 over it, 1.79\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":"invokeai/frontend/webv2/src/features/generation/ui/GenerateSettingsForm.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"eed7d8e8492b9eb588aa862610679a3feb6d21cb089dd2b9674e69ce46cdf8ba"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: HsvBoxPicker.HsvBoxPicker: FunctionTooLong \u2014 HsvBoxPicker runs 179 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 79 over it, 1.79\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":"invokeai/frontend/webv2/src/platform/ui/HsvBoxPicker.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb5239ff9150f75e10b05cb5eedd9bf6895016a04afc74846bb8a4a359542c7c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: LayoutPresetStrip.LayoutPresetStrip: FunctionTooLong \u2014 LayoutPresetStrip runs 179 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 79 over it, 1.79\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":"invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetStrip.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"a539bda9901ccd8638c755a1f203cf321c0a077bcfaeb44dcbb91db01457c878"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ToolStripFlyout.ToolFamilyButton: FunctionTooLong \u2014 ToolFamilyButton 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/ToolStripFlyout.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9600df4cccec4480dedc7769f7f3adc94752737c5250ab47e0f06082ef91c71"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: sd/denoise_latents.py: FileTooLong \u2014 889 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 389 over it, 1.78\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/denoise_latents.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d5c60eb0fea80481d8b1d8ed25695a69b84e9fa699c46dec4122a5702e081a4"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: useImageActions: ClassTooLong \u2014 700 significant lines (blank, comment-only and punctuation-only lines excluded), 4 methods. The bar is 400 significant lines; this is 300 over it, 1.75\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":"invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f973532346471e206417327c164b7f1cce1069de5ea574bb78f3e3adf170dad0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: run-accessibility-journeys.runTopbarMenuJourney: FunctionTooLong \u2014 runTopbarMenuJourney runs 174 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 74 over it, 1.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":"invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs"},"region":{"startLine":521}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5597567b9062e104baa3f8626e1127756c30970d0031d12c08b1724ccd13a02"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GenerationUiAdapter.GenerationUiAdapterProvider: FunctionTooLong \u2014 GenerationUiAdapterProvider runs 174 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 74 over it, 1.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":"invokeai/frontend/webv2/src/app/GenerationUiAdapter.tsx"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd4ddc170caa36d883d6489ae58d59f124e3962c62be2a96e0dc9153ce43a38e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ReferenceImageSettings.ReferenceImageEditor: FunctionTooLong \u2014 ReferenceImageEditor runs 174 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 74 over it, 1.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":"invokeai/frontend/webv2/src/workbench/widgets/layers/ReferenceImageSettings.tsx"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"18a0893796327a3692f21c011b9553243b51c4ea1e8dfa7437298dd7ecfb144b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: validateWorkflow.validateWorkflow: FunctionTooLong \u2014 validateWorkflow runs 173 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 73 over it, 1.73\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":"invokeai/frontend/webv1/src/features/nodes/util/workflow/validateWorkflow.ts"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cb5d1c04078d9282f3d39dd2dc81cfda9d265da787755e1cfea3616b56e4736"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WildcardsPanel.WildcardsPanel: FunctionTooLong \u2014 WildcardsPanel runs 173 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 73 over it, 1.73\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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardsPanel.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7a17919490a2f01e19f9b8cef0dbd3bfef696cf57b9d1ec37732a56ff58cfa1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: runtime.createQueueRuntime.reconcile: FunctionTooLong \u2014 createQueueRuntime.reconcile runs 173 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 73 over it, 1.73\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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":2076}}}],"partialFingerprints":{"codehealthFindingId/v1":"4449668c01198379afc6bd675693d7fdc085140eb9470b9b4542900cf3550bde"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: promptFields/PositivePromptActions.tsx: FileTooLong \u2014 863 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 363 over it, 1.73\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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bf8697aaaa4144d7558eaa08f140e57160c17482746aef59f07d336e7d02313"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useCommandPaletteController.useCommandPaletteController: FunctionTooLong \u2014 useCommandPaletteController runs 172 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 72 over it, 1.72\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/palette/useCommandPaletteController.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"e24f62014c276ff8ad6c2fea869859e6b40d2dcf075edd4a354ddc9b1d8445f3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AdministratorSetup.AdministratorSetup: FunctionTooLong \u2014 AdministratorSetup runs 171 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 71 over it, 1.71\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":"invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"c14b75049b4f13d6e90526dbee6f7393dbae197616ca55c23b9b5c16890caf66"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ColorPicker.ColorPicker: FunctionTooLong \u2014 ColorPicker runs 171 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 71 over it, 1.71\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":"invokeai/frontend/webv2/src/platform/ui/ColorPicker.tsx"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"6952623b63922e65efa9fc3a34c0f08a7825ab972d4dc90a8e6d0bf0457d0396"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: LayoutPresetDialog.LayoutPresetDialog: FunctionTooLong \u2014 LayoutPresetDialog runs 170 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 70 over it, 1.70\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":"invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetDialog.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0a06d5fa09284b23edaecb69e4c988e9fdc0a6077534ee69ed79a298841b141"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: image-actions/useImageActions.ts: FileTooLong \u2014 849 significant lines (blank, comment-only and punctuation-only lines excluded), about 82% of them inside a single declaration: useImageActions (194-1244). The bar is 500 significant lines; this is 349 over it, 1.70\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":"invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cb5d8cca72ab5bcb49831850033baa9b066902cbf15e3763185345d62354b22"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ImageComparisonSlider.ImageComparisonSlider: FunctionTooLong \u2014 ImageComparisonSlider runs 169 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 69 over it, 1.69\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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSlider.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"80635fd4cf6b2dc33bd5845027167b22befbf6bb0399bdb227b7057181aa4ed9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WildcardTransferActions.WildcardTransferActions: FunctionTooLong \u2014 WildcardTransferActions runs 169 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 69 over it, 1.69\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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardTransferActions.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e585a9f4981e7076e52c0fd79159aa3d53a0c80346bd1de464f6f0efad16519"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ConceptRow.ConceptRowContent: FunctionTooLong \u2014 ConceptRowContent runs 169 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 69 over it, 1.69\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":"invokeai/frontend/webv2/src/features/generation/ui/shared/ConceptRow.tsx"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"d033a2ab12f8d121eb96fdb868be2d7d298a0ecb39b5e20f92e463494b50bdfa"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: canvasHotkeyCommands.executeCanvasHotkeyCommand: FunctionTooLong \u2014 executeCanvasHotkeyCommand runs 169 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 69 over it, 1.69\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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHotkeyCommands.ts"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9eee2ff9e1214c4da03ab0904efc4b4c8aaf14b04c733cc26174630ba8d2f61"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: gallery_maintenance/gallery_maintenance_default.py: FileTooLong \u2014 841 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 341 over it, 1.68\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":"invokeai/app/services/gallery_maintenance/gallery_maintenance_default.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c97b3a8c64d22d49ea943c211a8f9b5baca11192e5f5a44ebf8a9de5f4cf5d6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: konva/CanvasSegmentAnythingModule.ts: FileTooLong \u2014 840 significant lines (blank, comment-only and punctuation-only lines excluded), about 88% of them inside a single declaration: CanvasSegmentAnythingModule (160-1592). The bar is 500 significant lines; this is 340 over it, 1.68\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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddec70632664641a24a9c9005ef4bd3ce80fd8076395a6325854e1469632d62e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: TextToolOptions.FontSelect: FunctionTooLong \u2014 FontSelect runs 168 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 68 over it, 1.68\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":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"4128866b0c896fb3cda4f052b6994b1330814821253a7b54b92f6eac97295efc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: workflowExecutionCoordinator.createWorkflowExecutionCoordinator: FunctionTooLong \u2014 createWorkflowExecutionCoordinator runs 167 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 67 over it, 1.67\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/workflowExecutionCoordinator.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6cc7edaee9836b34619504bb5e24d376161a649977ea839eaaa8720f22be5c6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: baseGenerationPolicies.getBaseComponentSectionPolicy: FunctionTooLong \u2014 getBaseComponentSectionPolicy runs 167 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 67 over it, 1.67\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts"},"region":{"startLine":915}}}],"partialFingerprints":{"codehealthFindingId/v1":"265cb974554e2f4b90791dd9be47db5fa8e2ac3d9a666077bdb38ee891339533"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/editor.ts: FileTooLong \u2014 830 significant lines (blank, comment-only and punctuation-only lines excluded), about 91% of them inside a single declaration: Editor (173-1556). The bar is 500 significant lines; this is 330 over it, 1.66\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":"invokeai/frontend/webv1/src/features/cropper/lib/editor.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3348a8623b1fbb2e67d7060ae4527f93f8ed467021f910e51645c954986f1a23"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GenerateReferenceImagesSection.GenerateReferenceImagesContent: FunctionTooLong \u2014 GenerateReferenceImagesContent runs 166 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 66 over it, 1.66\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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/GenerateReferenceImagesSection.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a7499e4e41e2d7a0cae3e563156d66877e25fd4c95222c014f5e425d8398b24"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: routers/videos.py: FileTooLong \u2014 827 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 327 over it, 1.65\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":"invokeai/app/api/routers/videos.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d608935e8a69a6fee5ca2a22e691254bedfc31547c61b59c3edf6d0697e251f6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: RegionalGuidanceSettings.RegionalGuidanceSettings: FunctionTooLong \u2014 RegionalGuidanceSettings runs 165 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 65 over it, 1.65\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/RegionalGuidanceSettings.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ae82f205b593082d9aa00d6ef40396bb8873ec01120273ab075a25ffcbacf97"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: queries/session_queue.py: FileTooLong \u2014 817 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 317 over it, 1.63\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":"invokeai/app/services/shared/database/queries/session_queue.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"63d2bb17377f076b5772fdd77b7edb0b0e49507356baac37cf0819b7c1dd945f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: layers/layerContextActions.ts: FileTooLong \u2014 817 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 317 over it, 1.63\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerContextActions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"56a4f1729a0339fc9fed44581b31e59dae194d22b4d25bfed51ed48c4dd31fae"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ClearDialog.ClearDialog: FunctionTooLong \u2014 ClearDialog 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":"invokeai/frontend/webv2/src/features/intermediates/ui/ClearDialog.tsx"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5ab53805a6f2516639a9db89aea010e915f9ef64583bd4fad3dc78b03ac20cc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: core/document.ts: FileTooLong \u2014 814 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 314 over it, 1.63\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":"invokeai/frontend/webv2/src/features/workflow/core/document.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a7cf305da748d525d4c548496f25326ba99ef78dbb211c0ad284251f278310a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: runtime/coordinator.ts: FileTooLong \u2014 808 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 308 over it, 1.62\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":"invokeai/frontend/webv2/src/features/queue/runtime/coordinator.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5918db0fd67cd860953b5527efb8e50faede62bdb29b18d70dce1edfc4d922db"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useCanvasWorkflowIntegrationExecute.useCanvasWorkflowIntegrationExecute: FunctionTooLong \u2014 useCanvasWorkflowIntegrationExecute runs 161 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 61 over it, 1.61\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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"07a67d61b75ca910575bb5322b3cb5db8e4fe20cbd89c8fe2b8188af01339da0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Picker/Picker.tsx: FileTooLong \u2014 801 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 301 over it, 1.60\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":"invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"18895553c811e94d37ca9d775c5e317976c2fb88f0102eb3dd68dd0855c789ba"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ImageMoveService: TooManyMethods \u2014 48 methods. The bar is 30 methods; this is 18 over it, 1.60\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":"invokeai/app/services/image_moves/image_moves_default.py"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"8781115b496e623de14372cdf07c7536a8f7d48c81f3aec0e3870b091bbc92f8"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SessionQueueBase: TooManyMethods \u2014 48 methods. The bar is 30 methods; this is 18 over it, 1.60\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":"invokeai/app/services/session_queue/session_queue_base.py"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"55170ea131d43da62584ea743b26e76adfdff9fec3cf7c1a59d048b2d1f886be"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CanvasShapeToolModule: TooManyMethods \u2014 48 methods. The bar is 30 methods; this is 18 over it, 1.60\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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fb1be1118206297c313677407bcd77ffb38f7f8c78d674a84f27aecbe2a19c9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UserFormDialog.UserForm: FunctionTooLong \u2014 UserForm runs 160 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 60 over it, 1.60\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":"invokeai/frontend/webv2/src/features/identity/ui/UserFormDialog.tsx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b67d15462542cfb473a1d61a6d3bf04adf47473713b56d0f19d1a570f56cf43"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ParamPositivePrompt.ParamPositivePrompt: FunctionTooLong \u2014 ParamPositivePrompt runs 159 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 59 over it, 1.59\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"0274de4a5553d9515648131870e3621922ebb61ce3d9b7b5ad92364fc70225a5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GenerateRenderSection.GenerateRenderSection: FunctionTooLong \u2014 GenerateRenderSection runs 159 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 59 over it, 1.59\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/GenerateRenderSection.tsx"},"region":{"startLine":519}}}],"partialFingerprints":{"codehealthFindingId/v1":"2309807e7220f8c705e4fa12639ff91045e1e6c002dcd436531ab12448f73731"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: InstallJobRow.InstallJobRow: FunctionTooLong \u2014 InstallJobRow runs 159 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 59 over it, 1.59\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallJobRow.tsx"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"392f0e40585ff1a1e098bfbe56603236923dae5dda60ddd7e6922c9b6875a7a5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ListItem.ListItem: FunctionTooLong \u2014 ListItem runs 159 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 59 over it, 1.59\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/list/ListItem.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6767d14eba5c8ba32c452a83643893fcbe912ce6c9b28419da2465d23333d47"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: scripts/run-project-file-journey.mjs: FileTooLong \u2014 791 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 291 over it, 1.58\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":"invokeai/frontend/webv2/scripts/run-project-file-journey.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbf6437374716af4cc08c66f09c6b3037bb10d0c3d14eeecc6b57ffa6cf5d069"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ModelList.ModelList: FunctionTooLong \u2014 ModelList runs 158 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 58 over it, 1.58\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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"acb5e9bdf9b64dd1cdb0058fa4806b8b2992c8c6b8fe23183705632e2a41b244"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: download/download_default.py: FileTooLong \u2014 788 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 288 over it, 1.58\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":"invokeai/app/services/download/download_default.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6937823b370eaad6170ffc2d8d97c86bdc9bf0db2c32ecbbb09376cc7ce25d78"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: model_loaders/mistral_encoder.py: FileTooLong \u2014 788 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 288 over it, 1.58\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":"invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"81391cc1577593d10701fdbde6744e57d56ebcf8a56c099cad61ce9f909be9cf"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PreviewCompare.PreviewCompare: FunctionTooLong \u2014 PreviewCompare runs 157 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 57 over it, 1.57\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewCompare.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"10c963defe6fbd97340d7c0cac5fb07d73b32b297b3f67edea4ec473bacfb717"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: usePreviewNavigation.usePreviewNavigation.navigate: FunctionTooLong \u2014 usePreviewNavigation.navigate runs 157 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 57 over it, 1.57\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewNavigation.ts"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"40b9599e4b7a7b0c9d93071b45e08b1a7aed8cec5b2eb80d443cbe5827ad1169"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SessionQueueQueries: 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":"invokeai/app/services/shared/database/queries/session_queue.py"},"region":{"startLine":750}}}],"partialFingerprints":{"codehealthFindingId/v1":"36ebaa82413e65b679b814b1b0d634e49aa90f64fb68510f405144e759b3af94"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: NodeFieldControl.NodeFieldControl: FunctionTooLong \u2014 NodeFieldControl runs 156 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 56 over it, 1.56\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":"invokeai/frontend/webv2/src/features/workflow/ui/linear/NodeFieldControl.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3fc2c98d5adfa851589a757ed1156cbc1492605453562b0dfa4815e411c7a6e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: history.createHistory: FunctionTooLong \u2014 createHistory runs 156 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 56 over it, 1.56\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":"invokeai/frontend/webv2/src/workbench/canvas-engine/history/history.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb8a0225245234305426db31b681c084390e516fbdb3db10505ff0a2f82cf877"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: core/graph.ts: FileTooLong \u2014 778 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 278 over it, 1.56\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":"invokeai/frontend/webv2/src/features/upscale/core/graph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"562de5dbd5795df12e57ff5e5bdd14226d9586617a8bf56a5638eb5d5f9ce347"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: store/nodesSlice.ts: FileTooLong \u2014 776 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 276 over it, 1.55\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6468c2fdbb1f690c7e31024f45f0ec900708a5321f25fa3a23d35d4489b2ce8c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ExternalProvidersForm.ProviderCard: FunctionTooLong \u2014 ProviderCard runs 155 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 55 over it, 1.55\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ExternalProviders/ExternalProvidersForm.tsx"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"299c4d16bb4561f726aaa97f06d5e0f36d1e3f786426dc2e43e3e4ab7cbff7ac"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ExpandPromptButton.ExpandPromptButton: FunctionTooLong \u2014 ExpandPromptButton runs 155 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 55 over it, 1.55\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7413cab8cffa65160bbdd7842fbf0bfa39919c631b2f8c90596c665f24fff01"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: readiness.getReasonsWhyCannotEnqueueGenerateTab: FunctionTooLong \u2014 getReasonsWhyCannotEnqueueGenerateTab runs 155 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 55 over it, 1.55\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"301b86fc3355dfac73062a3413ec121d9e34876020c45292de4f3481ab2210c5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PromptTextarea.PromptTextarea: FunctionTooLong \u2014 PromptTextarea runs 155 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 55 over it, 1.55\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTextarea.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8e98974908ad7120aa0d74e86e721a733a0ec18355b75de5fd69f455c1cf221"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: CanvasEntityTransformer: ClassTooLong \u2014 618 significant lines (blank, comment-only and punctuation-only lines excluded), 38 methods. The bar is 400 significant lines; this is 218 over it, 1.55\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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b9831986e68374e2d97fb35d9a5b491c2dcc881866a2c9a5c59619f1eef1d60"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: OrphanedModelsDialog.OrphanedModelsDialog: FunctionTooLong \u2014 OrphanedModelsDialog 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":"invokeai/frontend/webv2/src/features/models/ui/library/OrphanedModelsDialog.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"646effed29aa387793f0f90e1d2a93fad72e283e05de22541e0db4abf298f37c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: workbench/canvasProjectMutations.ts: FileTooLong \u2014 768 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 268 over it, 1.54\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":"invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f1f7aa2fdc727b442f426b1b02a08b24f3c489da1acd9e5d587c2ea96a4cb06"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Editor: 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":"invokeai/frontend/webv1/src/features/cropper/lib/editor.ts"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"f61c0992fdc143559413195ad6dd4d55948e5093420599a5557d203a6b76453a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: stagedPreviewBlobCache.createStagedPreviewBlobCache: FunctionTooLong \u2014 createStagedPreviewBlobCache runs 153 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 53 over it, 1.53\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/stagedPreviewBlobCache.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ad3691f076dab210d4ed315e68a3ae56702aa6a924215b7cb9b7ffacf209ca4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: restoreProjectMedia.restoreProjectMedia: FunctionTooLong \u2014 restoreProjectMedia runs 153 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 53 over it, 1.53\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/restoreProjectMedia.ts"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"015e5872c611dd86ccc66f586a713d877fca92325a07c759f6c55ca12b78ba2d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: session_processor/session_processor_default.py: FileTooLong \u2014 762 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 262 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":"invokeai/app/services/session_processor/session_processor_default.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"61c38d379ac0cab48df5423af889e2eef32bafe1c83632a0c40358cb87780f8e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CenterArea.CenterArea: FunctionTooLong \u2014 CenterArea runs 152 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 52 over it, 1.52\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":"invokeai/frontend/webv2/src/workbench/shell/CenterArea.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb67f71e5120a484262aeb5d42276ec3f4f2c853ec8ea38b2d32f660dfa6fb7a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/UpscaleWidgetView.tsx: FileTooLong \u2014 759 significant lines (blank, comment-only and punctuation-only lines excluded), about 60% of them inside a single declaration: UpscaleWidgetView (352-903). The bar is 500 significant lines; this is 259 over it, 1.52\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":"invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e48f48b75c7d94dd896a35e09ab92497f015b4ab337aeed9f6de0a2a2af7f41"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: events/events_common.py: FileTooLong \u2014 757 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 257 over it, 1.51\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":"invokeai/app/services/events/events_common.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af12f1f9ffdaeefb1b4a531e9c573728299fda05d4040760e9bd7ebd66a1d050"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: data/queries.ts: FileTooLong \u2014 753 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 253 over it, 1.51\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":"invokeai/frontend/webv2/src/features/gallery/data/queries.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5b90e91551a4f89e3b2372305678159ae9ea7784c97fcc5898a1f8db3e11d01"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: preview/PreviewFrame.tsx: FileTooLong \u2014 753 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 253 over it, 1.51\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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4ec4c8556e3ef57b62bd98b8f8a06989dd72a8aa653c40a0374d7a5f8643839"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: core/graph.ts: FileTooLong \u2014 751 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 251 over it, 1.50\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":"invokeai/frontend/webv2/src/features/video/core/graph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bc50e1c54fcce3f58f5d8c7d99984700e7133bf7f56d9f79fc6e1828f0b9d21"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: RefImagePreview.RefImagePreview: FunctionTooLong \u2014 RefImagePreview runs 150 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 50 over it, 1.50\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImagePreview.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"164984fcca168bdc96665851e7cf075548a36279d9ca8e072ba2934ad00ba065"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AdvancedSettingsAccordion.AdvancedSettingsAccordion: FunctionTooLong \u2014 AdvancedSettingsAccordion runs 150 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 50 over it, 1.50\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee8cadee4b2c7cb0a8a91aa7024a0950b55826e6e0ebb23e8dcfef384695ec4a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: MergeLayerController.mergeSelected: MethodTooLong \u2014 mergeSelected runs 150 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 50 over it, 1.50\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"dccfd990dae8bc5462684858b10ccb2c43036068b03b2d134c70d3e86de3244a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: moveTool.createMoveTool: FunctionTooLong \u2014 createMoveTool runs 150 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 50 over it, 1.50\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/moveTool.ts"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"c02150d2e4bd047de52c68e995329d90829b08aa04d78439e451c060e614de9c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: routers/image_map.py: FileTooLong \u2014 749 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 249 over it, 1.50\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":"invokeai/app/api/routers/image_map.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"60a3fa019f341f7a99b345a0efddf25dfc7e5cb9e868ac1b175fe367bf132150"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: buildFLUXGraph: ClassTooLong \u2014 598 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 198 over it, 1.50\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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bde753d666a1511718c9abb2f82885a5aa65e5dcefa0fb3db726985ba2a80255"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: preview/PreviewWidgetView.tsx: FileTooLong \u2014 747 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 247 over it, 1.49\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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewWidgetView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c401c6ab207c5872983dc88ff1bf508f3d57474670ddb552c53b846fa141c91"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PositivePromptActions.ImageToPromptButton: FunctionTooLong \u2014 ImageToPromptButton runs 149 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 49 over it, 1.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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx"},"region":{"startLine":703}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0a8c0bbc1b1178ee21472b995d5bf7edad9da742dc875b9dfe38871032cab27"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: videoPolicies.getVideoValidationReasons: FunctionTooLong \u2014 getVideoValidationReasons runs 149 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 49 over it, 1.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":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":2291}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec8851cd8422989bc5c5c295951ebb83694ff289739c68b14fe30c320ccb19be"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: CanvasToolModule: ClassTooLong \u2014 592 significant lines (blank, comment-only and punctuation-only lines excluded), 37 methods. The bar is 400 significant lines; this is 192 over it, 1.48\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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c0a166601cc736289a2b1004f0d6b05cbbabd91e898c20edbf13d0d2ec59f95"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: QueueItemComponent.QueueItemComponent: FunctionTooLong \u2014 QueueItemComponent runs 148 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 48 over it, 1.48\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueItemComponent.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"7424b0a2300d555cddf8b54b94f7b44d36e9a2cb9c95da36b70c0692eeff014a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ReferenceImageControls.IPAdapterControls: FunctionTooLong \u2014 IPAdapterControls runs 148 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 48 over it, 1.48\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageControls.tsx"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"d45dfb33211a11b177646f1a4efa7779e68fb833c443e25d49bf18cfb7be4dde"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: setEventListeners: ClassTooLong \u2014 591 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 191 over it, 1.48\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":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb56735440c604208d503acc401be4b9561317552075b7e3c14df5c444f036d6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: anima/anima_transformer.py: FileTooLong \u2014 738 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 238 over it, 1.48\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":"invokeai/backend/anima/anima_transformer.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2e6426db7e000b25b3be70af7de0d130fcbf1d30353ad5dd80450132041e4f1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: core/settings.ts: FileTooLong \u2014 737 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 237 over it, 1.47\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":"invokeai/frontend/webv2/src/features/generation/core/settings.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccebb2bd40a67fec0102be7752a1342edfd5e22ca51477e779246a158ec07f92"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: usePreviewNavigation: ClassTooLong \u2014 589 significant lines (blank, comment-only and punctuation-only lines excluded), 45 methods. The bar is 400 significant lines; this is 189 over it, 1.47\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":"invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewNavigation.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aec23b2e3aca63bd0ae591cdc6657a88a6b154b67e2b9b4c9fcbd127f1b7b09a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: RelatedModels.RelatedModels: FunctionTooLong \u2014 RelatedModels runs 147 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 47 over it, 1.47\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/RelatedModels.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"2883fcb0e585be0544611501008626a0545a714c675c8c8de5d404a2b23cc2c6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: LibraryColumn.LibraryColumn: FunctionTooLong \u2014 LibraryColumn runs 147 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 47 over it, 1.47\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/manager/LibraryColumn.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a26f6a6c4216a491f46839ae1d65f24dcdb66242c0a2612b873ba9b76b10487"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ImageMapVocabularySettings.ImageMapVocabularySettings: FunctionTooLong \u2014 ImageMapVocabularySettings runs 147 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 47 over it, 1.47\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/ImageMapVocabularySettings.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"263eb1f88d4c6d3325e1fe3623f0dab2eff3579e90a127166bc5d918c322c67d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: preview/usePreviewNavigation.ts: FileTooLong \u2014 733 significant lines (blank, comment-only and punctuation-only lines excluded), about 80% of them inside a single declaration: usePreviewNavigation (211-1055). The bar is 500 significant lines; this is 233 over it, 1.47\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":"invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewNavigation.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f30bdc1233dfc2034356f010c514e9b0a65d9ae054ed7e8f049432f0880e73a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: graph.buildMiniMaxH3VideoGraph: FunctionTooLong \u2014 buildMiniMaxH3VideoGraph runs 146 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 46 over it, 1.46\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":"invokeai/frontend/webv2/src/features/video/core/graph.ts"},"region":{"startLine":438}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ee8954b0500140004626b0ede3a0e2b10a085503aeac1e51ad1577f2b062cf3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: imageRecall.buildImageRecallSettings: FunctionTooLong \u2014 buildImageRecallSettings runs 146 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 46 over it, 1.46\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":"invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts"},"region":{"startLine":1115}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a5fd7449c0dff93874267a4f956a997293f0732c456de63aba9a71003293f04"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useCanvasWorkflowIntegrationExecute.useCanvasWorkflowIntegrationExecute.execute: FunctionTooLong \u2014 useCanvasWorkflowIntegrationExecute.execute runs 145 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 45 over it, 1.45\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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"16a8c090994d9df40683635a3a146ab8efbbea1c8796d651de772894407f91bc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: usePaletteNavigation.usePaletteNavigation: FunctionTooLong \u2014 usePaletteNavigation runs 145 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 45 over it, 1.45\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":"invokeai/frontend/webv2/src/workbench/palette/usePaletteNavigation.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a590b2a45f031dba2d52a0bbf5e99d70f40a1404eab9e3bf28075967a662686"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: image_util/color_conversion.py: FileTooLong \u2014 723 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 223 over it, 1.45\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/color_conversion.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"353e038df466146aabc29be5eb2d4c54ec05f6d88d516671ae6888f290035fa6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: workbench/workbenchStore.ts: FileTooLong \u2014 722 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 222 over it, 1.44\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":"invokeai/frontend/webv2/src/workbench/workbenchStore.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8ff1f48eeffc3700fa5f6da0f6e814a4f85517fb874e281097a733056a5fb6e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: flux/flux_denoise.py: FileTooLong \u2014 721 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 221 over it, 1.44\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":"invokeai/app/invocations/flux/flux_denoise.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8104f237b7b0277aa932fb3b39f41a6126cf0a65014292d0179a1286108686d0"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: VideoWidgetView: ClassTooLong \u2014 576 significant lines (blank, comment-only and punctuation-only lines excluded), 4 methods. The bar is 400 significant lines; this is 176 over it, 1.44\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"169cc202d39935874d52292713c1e667b3203ce67ee7b3c4d5161e7b18b177c8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: RasterLayerCurvesAdjustmentsGraph.RasterLayerCurvesAdjustmentsGraph: FunctionTooLong \u2014 RasterLayerCurvesAdjustmentsGraph runs 144 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 44 over it, 1.44\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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"94beacd80ecb38a00a88ef96e4a30cc58b0eb0d6ef61f00648df3aadf97e5cc6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useGalleryUploadAction.useGalleryUploadAction: FunctionTooLong \u2014 useGalleryUploadAction runs 144 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 44 over it, 1.44\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":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryUploadAction.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6d995451dee70eb4c8e731f7b2888965207c9c3a92de0583f23319abea96c5f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ExternalProviderKeyCards.ExternalProviderKeyCard: FunctionTooLong \u2014 ExternalProviderKeyCard runs 144 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 44 over it, 1.44\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":"invokeai/frontend/webv2/src/features/models/ui/credentials/ExternalProviderKeyCards.tsx"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"8247431ca24632c68b0250620fc04906afd21b9ed5afb77bdd267ef0344847e8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GenerateCanvasCompositingSection.GenerateCanvasCompositingSection: FunctionTooLong \u2014 GenerateCanvasCompositingSection runs 144 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 44 over it, 1.44\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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/GenerateCanvasCompositingSection.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"c378c377824c55c6c4488f6fdc38883df58b4a0b4f68023fe1c6e5aae5b3da72"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: EventServiceBase: TooManyMethods \u2014 43 methods. The bar is 30 methods; this is 13 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":"invokeai/app/services/events/events_base.py"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7c4bda4c7423c50f8cd9ab540f494622fa044d2a4b3109e11e01ecece044799"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GeneratePromptFields.GeneratePromptFields: FunctionTooLong \u2014 GeneratePromptFields runs 142 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 42 over it, 1.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/GeneratePromptFields.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b4591bb6fd376d0e07cbdb5b34b4c1e59efa8ac35072e9901ee443b43dbcd0d"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: FilterResultController.commit: MethodTooLong \u2014 commit runs 142 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 42 over it, 1.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/filterResultController.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9b8e4f6515f22073c13bfffa6597997347138219b0206be1c3cb343de7f0378"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowListItem.WorkflowListItem: FunctionTooLong \u2014 WorkflowListItem runs 141 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 41 over it, 1.41\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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowListItem.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"18747646c108ce44b1285b9db86289a1d77aa779700c8128ce46baaff81af44d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: filterGraphs.buildFilterGraph: FunctionTooLong \u2014 buildFilterGraph runs 141 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 41 over it, 1.41\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":"invokeai/frontend/webv2/src/workbench/canvas-operations/filterGraphs.ts"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d4fad715521a38c150ea6094aef16a7f30ad82d0ff900c823616a256db0b044"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: HotkeysSettingsSection.HotkeyListRow: FunctionTooLong \u2014 HotkeyListRow runs 141 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 41 over it, 1.41\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":"invokeai/frontend/webv2/src/workbench/settings/HotkeysSettingsSection.tsx"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"6145fee5769682af93b93caa6290fe61ae366b9b03f7a7d74fc02a0259f6f60a"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CanvasStageModule: 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStageModule.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"39a6389231ac708db8fbe401736dadffffbc5b371dc812257ccd3203293a1e8b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: run-accessibility-journeys.runFloatingWindowJourney: FunctionTooLong \u2014 runFloatingWindowJourney runs 140 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 40 over it, 1.40\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":"invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs"},"region":{"startLine":1018}}}],"partialFingerprints":{"codehealthFindingId/v1":"0df51087a92ecc93013440a99072969db8b4f3a830197a4c4b9465f2d07c3ebd"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: react.createDeferredFontRuntime: FunctionTooLong \u2014 createDeferredFontRuntime runs 140 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 40 over it, 1.40\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":"invokeai/frontend/webv2/src/features/fonts/react.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"01033293692f3c85042067f769430985b9ee3e8a0e3799c0218a146bd5c07b4b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: strokeSession.createStrokeSession.paint: FunctionTooLong \u2014 createStrokeSession.paint runs 140 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 40 over it, 1.40\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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/strokeSession.ts"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fdd8e453ff93583e1a1f352cb4e3bf1dac24267daba8ba471c29ceb46b15935"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: focusRegions.createWorkbenchFocusController: FunctionTooLong \u2014 createWorkbenchFocusController runs 140 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 40 over it, 1.40\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":"invokeai/frontend/webv2/src/workbench/focusRegions.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"87ee7cc59074854ea9c14702a1bdbc823e1eda8c2ecad715fab9cce3e79af258"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ColorPane.ColorPane: FunctionTooLong \u2014 ColorPane runs 140 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 40 over it, 1.40\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/ColorPane.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed9c32e4e35944a78feabe895ab53154567028ba221a26cdf76398894ce3e5d4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: routers/images.py: FileTooLong \u2014 699 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 199 over it, 1.40\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":"invokeai/app/api/routers/images.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"70239a40a1d5ffc04128db441ce1fac06727b9a39679523edf1b29745af9b708"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PreferencesPage.PreferencesPage: FunctionTooLong \u2014 PreferencesPage runs 139 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 39 over it, 1.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":"invokeai/frontend/webv2/src/workbench/settings/PreferencesPage.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"22fcef394c2dc9fd861ff03b3647fdf99774e2a743c9fd312fa374771d1c2c0c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: core/settings.ts: FileTooLong \u2014 694 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 194 over it, 1.39\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":"invokeai/frontend/webv2/src/features/upscale/core/settings.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3adb0d0c7b277d709731d2ec7c7ff44ab277d504925c436f2e61ce66b4ed30a4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: routers/session_queue.py: FileTooLong \u2014 692 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 192 over it, 1.38\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":"invokeai/app/api/routers/session_queue.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"495fce19282184033a7a7cf4f667c352a2c78870e88af9db3b3db1f93713c815"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: editor/AddNodeDialog.tsx: FileTooLong \u2014 691 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 191 over it, 1.38\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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/AddNodeDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9646ae85ee62b99590a88cd723e2ad7fee4ca07cd7c267fcedad531616441e0d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: NegativePromptField.NegativePromptField: FunctionTooLong \u2014 NegativePromptField 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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/NegativePromptField.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd578dba57a1699dc8c9b04ab615e553ce4c6373ad593c81d0600456b1f97f08"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: FormBuilderTab.BuilderElementBase: FunctionTooLong \u2014 BuilderElementBase 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":"invokeai/frontend/webv2/src/features/workflow/ui/linear/FormBuilderTab.tsx"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"c316822de36e9188e958d0896e8f5c36bc492bb3322ee116d56b2f4effb87bc5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useImageUploadButton.useImageUploadButton: FunctionTooLong \u2014 useImageUploadButton 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":"invokeai/frontend/webv1/src/common/hooks/useImageUploadButton.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0eb1df4cfb8eddbea44f5a2a071487d20a3f803b8e8c450a11c71a794c29d82"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: Picker.PickerListbox: FunctionTooLong \u2014 PickerListbox 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":"invokeai/frontend/webv2/src/platform/ui/Picker.tsx"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"07d004cbc2e17eed3cbc8b92f6b35d49189c680b194f3994c446e04f4ef2c57f"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: GeneratedResultController.commit: MethodTooLong \u2014 commit 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/generatedResultController.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"f14abe7fa712ebcc9076cf6bb458ed4c22ba50f765135969c66bb8b61594273b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: invocations/fields.py: FileTooLong \u2014 682 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 182 over it, 1.36\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":"invokeai/app/invocations/fields.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"824c46a7d8c60d9f461f6348d2ffd04b96e6c5d433eb6e77dfe7e5092fe3d982"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: DeleteBoardModal.DeleteBoardModal: FunctionTooLong \u2014 DeleteBoardModal runs 136 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 36 over it, 1.36\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"79f32a96aae7ae5db1936b4497f35b0f4a3c0ea6e4ff5eb06ac8a88578552f61"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: validateConnection.validateConnection: FunctionTooLong \u2014 validateConnection runs 136 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 36 over it, 1.36\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/util/validateConnection.ts"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bff1db6930bbb50795ef2e2ab95486ee0dc24152bb02827abf2be569c4fc42f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GenerateRefinerSection.GenerateRefinerSection: FunctionTooLong \u2014 GenerateRefinerSection runs 136 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 36 over it, 1.36\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/GenerateRefinerSection.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3e4aba622d5e6f880f63a67610f0d5f17662dda9e26aef422c9246f911726a5"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: LayerMutationController.commitDuplicate: MethodTooLong \u2014 commitDuplicate runs 136 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 36 over it, 1.36\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecdcf52b28110c1312f85bc225d97a71abe0fd3d1e710abf390b015c71419603"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: videoRecallRuntime.createVideoRecallRuntime: FunctionTooLong \u2014 createVideoRecallRuntime runs 136 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 36 over it, 1.36\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/videoRecallRuntime.ts"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"33f3bec861debac7f43950dd74d8e24b46ea55e3a73251f211dae579a029ef7b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: CanvasEntity/CanvasEntityTransformer.ts: FileTooLong \u2014 675 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: CanvasEntityTransformer (100-1203). The bar is 500 significant lines; this is 175 over it, 1.35\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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f842833ed5fe70ade72c645d9cb282d538e57fbcb9bc49c7814d410c96ec3a19"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: tool-options/TextOptions.tsx: FileTooLong \u2014 675 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 175 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/TextOptions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b72247c83b637862bdff2fd7cf3490dbfdb5cbf49530e9deed08ba06df51e3d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: RgbaColorPicker.RgbaColorPicker: FunctionTooLong \u2014 RgbaColorPicker 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":"invokeai/frontend/webv1/src/common/components/ColorPicker/RgbaColorPicker.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"da192c7409f622d09727b423062bf25a9fe0278b98cd63a1f15f460a3e2ce228"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GalleryImageGridPaged.GalleryImageGridPaged: FunctionTooLong \u2014 GalleryImageGridPaged 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":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGridPaged.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddf8d92471fec31be4ce43af86e70b5ab2107bed0213e7bf9165a6c23bf88944"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useProjectActions.useProjectActions: FunctionTooLong \u2014 useProjectActions 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":"invokeai/frontend/webv2/src/workbench/projects/useProjectActions.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"04d0716053c80adc8074efd8ff5a7335c068b9a7a9505834d71e4573578c0e1d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: configs/factory.py: FileTooLong \u2014 673 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 173 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":"invokeai/backend/model_manager/configs/factory.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"89c5faf714826ea7bdde2ffaf9decb2632cd85eb80cfd91bb0b32c54853b9cff"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: core/settings.ts: FileTooLong \u2014 671 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 171 over it, 1.34\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":"invokeai/frontend/webv2/src/features/video/core/settings.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea95aadcf8aea3ff27f3ef4aae969db43211a759faf0be43ecd24f0d609fe1f7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/VideoWidgetView.tsx: FileTooLong \u2014 671 significant lines (blank, comment-only and punctuation-only lines excluded), about 86% of them inside a single declaration: VideoWidgetView (122-848). The bar is 500 significant lines; this is 171 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":"invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"736f8704205bfde1662b3c0c981e60281aeebb0de51974c3840022a4bcf5eaf7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ImageToPromptButton.ImageToPromptButton: FunctionTooLong \u2014 ImageToPromptButton runs 134 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 34 over it, 1.34\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"203f0f36cfb18f0036b42b53fc9642b87475501d9c1d9dabb83a7bc3d428d786"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: runtime.createQueueRuntime.submitQueueItem: FunctionTooLong \u2014 createQueueRuntime.submitQueueItem runs 134 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 34 over it, 1.34\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":1745}}}],"partialFingerprints":{"codehealthFindingId/v1":"5960895168a5e8bcb38d3bbc2e18b31cc48bb8a5373184a17a7a598c51c08b80"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: batch.planWorkflowBatch: FunctionTooLong \u2014 planWorkflowBatch runs 134 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 34 over it, 1.34\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/batch.ts"},"region":{"startLine":681}}}],"partialFingerprints":{"codehealthFindingId/v1":"55620132829071c8e2371ad72c27e81db4532c776de15e8d6ba7113cc779c55f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: Combobox.Combobox: FunctionTooLong \u2014 Combobox runs 134 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 34 over it, 1.34\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/Combobox.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f70a6706459e9ef9bd096a35dd2f817c76405bfc1e2ce8cc6da6bc64c0d05e0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: api/sockets.py: FileTooLong \u2014 668 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 168 over it, 1.34\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":"invokeai/app/api/sockets.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"90898ec3fb0e1ec6918b757c5882a98dd57e64a01a50cb55bae99ac38e7b7571"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: GalleryMaintenanceService: 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":"invokeai/app/services/gallery_maintenance/gallery_maintenance_default.py"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"81d2cffc91c8d19994a2948e7e47b7097e868ea7935e809edc862160046cf97d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CanvasStateApiModule: 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStateApiModule.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"02f8027234ae1f6ba357e02d1808709a0a3be464bbed617422c1ab52a273b8e6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CropImageEditor.CropImageEditor: FunctionTooLong \u2014 CropImageEditor runs 133 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 33 over it, 1.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":"invokeai/frontend/webv1/src/features/cropper/components/CropImageEditor.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e2f837e351e4c7ca804aae857cc45931b2ef0c066b6cd90c03deb8233279c0e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AutoLayoutPopover.AutoLayoutPopover: FunctionTooLong \u2014 AutoLayoutPopover runs 133 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 33 over it, 1.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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/AutoLayoutPopover.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"94e3ff85ae44e425990370f4dee9d9beed03c44fd4e017d41c5ca6d2e797e7c7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: rasterSnapshotCapture.createRasterSnapshotCapture: FunctionTooLong \u2014 createRasterSnapshotCapture runs 133 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 33 over it, 1.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":"invokeai/frontend/webv2/src/workbench/canvas-engine/rasterSnapshotCapture.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"6775f66f8981bdd9fabd88c89f7323c073405b4b27157da618679c6488f6380f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/useGalleryData.ts: FileTooLong \u2014 662 significant lines (blank, comment-only and punctuation-only lines excluded), about 73% of them inside a single declaration: useGalleryData (257-907). The bar is 500 significant lines; this is 162 over it, 1.32\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":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryData.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dce1c636d215d2a620ed1f96880f6bfd799665d3d9d74fc4a877623e62f5169e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ImageMetadataViewer.ImageMetadataViewer: FunctionTooLong \u2014 ImageMetadataViewer runs 132 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 32 over it, 1.32\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataViewer.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"802ecc9655b5236ae3508a1e0716c64ece76a3cb018dcac82117321ac64a81a7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: InvocationFlowNode.ExpandedInvocationNode: FunctionTooLong \u2014 ExpandedInvocationNode runs 132 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 32 over it, 1.32\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.tsx"},"region":{"startLine":961}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e9846f9542fabefa7cd400fef02230fc3eec41c9eb811126ad790fb3812ca7c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AppMenu.AppMenu: FunctionTooLong \u2014 AppMenu runs 132 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 32 over it, 1.32\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/shell/topbar/AppMenu.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"153febff33d58afe6b212ddc10399d050cbbd765072c381c2425f4db1173c7f3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MissingFontsDialog.RecoveryRow: FunctionTooLong \u2014 RecoveryRow runs 132 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 32 over it, 1.32\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/MissingFontsDialog.tsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf3afd9d7870296a1615840ae5e91ca850ed84d59fcf98906dffcecc727b1abf"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: events/setEventListeners.tsx: FileTooLong \u2014 657 significant lines (blank, comment-only and punctuation-only lines excluded), about 90% of them inside a single declaration: setEventListeners (81-1055). 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":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0049eaddc34f27be3e1397a7f3d37e20a650cf8ed4af55b95d85c556624aece5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/FontsPage.tsx: FileTooLong \u2014 656 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 156 over it, 1.31\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":"invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0871a19752b60b04cfa4789648b322511c53e1fbbed54c00758f9ced21d7018"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CurrentImageButtons.CurrentImageButtons: FunctionTooLong \u2014 CurrentImageButtons runs 131 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 31 over it, 1.31\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb294f13a4f2ca0924ce1dffee0abffa52e99c8b2689253dfa2b62e4383f31c5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GalleryBoardFilters.GalleryBoardFilters: FunctionTooLong \u2014 GalleryBoardFilters runs 131 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 31 over it, 1.31\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardFilters.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd490b6ef60c35a01aa3007c5b3342cc4f04fbde952988115f9a7a0a5336566e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: queueRecallCache.createIndexedDbQueueRecallCache: FunctionTooLong \u2014 createIndexedDbQueueRecallCache runs 131 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 31 over it, 1.31\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRecallCache.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"0da10c0b33b18f175ac6a8d0aea331dd774404a43e3c50139b63d4bd1693c028"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: StatusBar.StatusBar: FunctionTooLong \u2014 StatusBar runs 131 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 31 over it, 1.31\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/shell/StatusBar.tsx"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"bba89f059e788503d16aa4fcfa4833d97f31ca76b8df2d0c5ad6fd54b87b0dc0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: execution_engine/child.py: FileTooLong \u2014 653 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 153 over it, 1.31\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":"invokeai/app/services/shared/execution_engine/child.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbf41da3f1f0ec5352f86589b010a11d02868d324c74a9e13da5704b5c97f508"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: CanvasTool/CanvasToolModule.ts: FileTooLong \u2014 653 significant lines (blank, comment-only and punctuation-only lines excluded), about 91% of them inside a single declaration: CanvasToolModule (73-1000). The bar is 500 significant lines; this is 153 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"30beea6fd3f2618093242f427e5a3af53667caf082c1a4d3b11e8c2bf40ef18e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: projects/draftStore.contract.ts: FileTooLong \u2014 651 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: testProjectDraftStoreContract (67-888). The bar is 500 significant lines; this is 151 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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d42344af23fd1933ebad9bfbd855d749348e2b7400c74a2a76181c940f3a0a2f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: projects/unloadJournal.scenarios.ts: FileTooLong \u2014 651 significant lines (blank, comment-only and punctuation-only lines excluded), about 78% of them inside a single declaration: testUnloadJournalScenarios (188-906). The bar is 500 significant lines; this is 151 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":"invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9247dc42f83bd5a6a1b270f63d67887483a6848f80a3730cd4eab8c582cc6c4c"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DownloadQueueService: TooManyMethods \u2014 39 methods. The bar is 30 methods; this is 9 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":"invokeai/app/services/download/download_default.py"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"519a9bcaaca3ff8b29039064c55fc2de8214c45d6a677b0fec63c6f7c072b707"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GalleryWidgetView.GalleryWidgetView: FunctionTooLong \u2014 GalleryWidgetView runs 130 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 30 over it, 1.30\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryWidgetView.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef4c44d79ea0f664d5b61ec8cb4a142cfc9ecd2280fb97d003709c4b7c47dc47"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: graph.buildSDGraph: FunctionTooLong \u2014 buildSDGraph runs 130 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 30 over it, 1.30\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"b19f11c85fd922626653a6e5f734e3b9ccd65e93c44055473a97956ed9e0d650"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SettingControl.SettingControl: FunctionTooLong \u2014 SettingControl runs 130 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 30 over it, 1.30\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/settings/SettingControl.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"de9b7817c5eebd1c00f68f9478925840383d2ca5b6c65a8f1ebb122f4b7c938b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkbenchUnavailableScreen.WorkbenchUnavailableScreen: FunctionTooLong \u2014 WorkbenchUnavailableScreen runs 130 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 30 over it, 1.30\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/components/WorkbenchUnavailableScreen.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0f9d3e78df7d4301623ccbd88f30fa0bec0152a59a356caf840f82bfbd0a931"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ShortcutGuide.ShortcutGuideContent: FunctionTooLong \u2014 ShortcutGuideContent runs 130 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 30 over it, 1.30\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/shortcuts/ShortcutGuide.tsx"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"df8a97af981f18e0421455d6563564e99425a1516c516e8f84224ee7089b41b7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: generation/buildFLUXGraph.ts: FileTooLong \u2014 649 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: buildFLUXGraph (55-898). The bar is 500 significant lines; this is 149 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1bd422ac4d400e0a1eee71efb61c3446c6d45c3e2cdf397d9be0457d12881c8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: scripts/measure-architecture-performance.mjs: FileTooLong \u2014 645 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 145 over it, 1.29\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":"invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"713e1b38ffc54430c484c87579aaa4c250ba508c961a8955e45b0e11b182e010"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: holdLease.startIntermediatesHoldLease: FunctionTooLong \u2014 startIntermediatesHoldLease runs 129 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 29 over it, 1.29\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/intermediates/holdLease.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0e956483377b32b9ca4c8f93c96e472c1f30b423d53ad8562931a1b56fa1d1c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: queueRunRestoration.normalizeRestoredQueueItem: FunctionTooLong \u2014 normalizeRestoredQueueItem runs 129 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 29 over it, 1.29\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRunRestoration.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"69ecb7afc241cdc58e11aa75f0c7a3241e5243748646dd7d0e571e09f4b77a94"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buildMiniMaxH3Graph.buildMiniMaxH3Graph: FunctionTooLong \u2014 buildMiniMaxH3Graph 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"40cdb5a41c040151649e90354a6180c4bd329310feafda441e714604fca83959"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ConditioningRebalanceBars.ConditioningRebalanceBars: FunctionTooLong \u2014 ConditioningRebalanceBars 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":"invokeai/frontend/webv2/src/features/generation/ui/shared/ConditioningRebalanceBars.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"37c1800ab505c28fd2b1d4f91340492e7d9f8475c7cf270b04e70c17b23f83e2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowLibraryCard.WorkflowLibraryCard: FunctionTooLong \u2014 WorkflowLibraryCard 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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryCard.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc5d590f6a3fe2c0fed9cb48c388f5d1c526606ca9145e043b84972eb3f1edda"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ManagerLayout.ManagerLayout: FunctionTooLong \u2014 ManagerLayout 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":"invokeai/frontend/webv2/src/platform/ui/ManagerLayout.tsx"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ea0aaa3dbee16c8e3e7da88445000ca021229b9e14b0ed46733d6772e540117"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: LayersWidgetView.LayersWidgetView: FunctionTooLong \u2014 LayersWidgetView 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayersWidgetView.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e7c183d587524e148c4dade781d25153fdc77681b5d1efee0ca7a3b9fe507ac"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: starter_models/external.py: FileTooLong \u2014 635 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 135 over it, 1.27\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":"invokeai/backend/model_manager/starter_models/external.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0c59cc6e754da25fcf1217d6ab880601162bc1a595c91b34d6c03a36763362a"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CanvasEntityTransformer: 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"f40bcafb161a760311762c70e509922e214c9d5cc247c707cdb47a4f92240fdd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: listeners/modelSelected.ts: FileTooLong \u2014 632 significant lines (blank, comment-only and punctuation-only lines excluded), about 85% of them inside a single declaration: addModelSelectedListener (97-965). The bar is 500 significant lines; this is 132 over it, 1.26\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e541189f1489299df705b6b638e7de08bbaf5824b7631e691648aced22888b6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CanvasToolbarSnapshotMenuButton.CanvasToolbarSnapshotMenuButton: FunctionTooLong \u2014 CanvasToolbarSnapshotMenuButton runs 126 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 26 over it, 1.26\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarSnapshotMenuButton.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ca2c0782c2867466c499ef7330c54fbc1deb91048558517754e38dd3c592644"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: InputFieldRenderer.InputFieldRenderer: FunctionTooLong \u2014 InputFieldRenderer runs 126 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 26 over it, 1.26\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"76990fe4baefaf42844bf8b255c3128c12550b8f1040d7c0ad8a70bbc0d4f8de"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: addFLUXFill.addFLUXFill: FunctionTooLong \u2014 addFLUXFill runs 126 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 26 over it, 1.26\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"47c11f2e6f91378774e64b4646c6d74643817ab6461db966ff5537a65c71f7be"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UserManagement.UsersDirectory: FunctionTooLong \u2014 UsersDirectory runs 126 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 26 over it, 1.26\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/identity/ui/UserManagement.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"97d1261889cfcd1b7c3a902cacf0e57466c56ba6989530a25b9a7c94b22372ae"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: FilterOperationCoordinator.createFilterOperationCoordinator: FunctionTooLong \u2014 createFilterOperationCoordinator runs 126 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 26 over it, 1.26\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/FilterOperationCoordinator.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f0c36213e0f46f3d010f27893da9f413dfb66fdc8a0eec7080d74b4842f1afe"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: projectFile.importProjectFile: FunctionTooLong \u2014 importProjectFile runs 126 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 26 over it, 1.26\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/projectFile.ts"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"3017f17b35187c7f016e70bd048e0d6a680fb5bd9f0389653338cf935e02a2dc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkbenchContext.WorkbenchProvider: FunctionTooLong \u2014 WorkbenchProvider runs 125 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 25 over it, 1.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/WorkbenchContext.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"c57931f70b5f821f3276fed9b694682a708c0c8232faa05bc766e6ef0d3a6255"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: LayerEditorPanes.LayerPaneBlock: FunctionTooLong \u2014 LayerPaneBlock runs 125 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 25 over it, 1.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/LayerEditorPanes.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"c85157066d26eb27cda38860db43ec8369af9181631f8feaad90dd136924b328"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: invocations/video_concat.py: FileTooLong \u2014 621 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 121 over it, 1.24\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":"invokeai/app/invocations/video_concat.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbd4da3688df943cf17acf49b024451aefabfe8630123e9252194aa6833e4897"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useHotkeyData.buildHotkeysData: FunctionTooLong \u2014 buildHotkeysData 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":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"e863bae8c9d455000507ce9830747594a59bbe735958238ed53685a4fe590210"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ResizeHandle.ResizeHandle: FunctionTooLong \u2014 ResizeHandle 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":"invokeai/frontend/webv2/src/platform/ui/ResizeHandle.tsx"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4231d555216385702d0f7d97f65037029e6c9e73e9e97e59cf47e374a73107f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: compositeFrame.createCompositeFrame: FunctionTooLong \u2014 createCompositeFrame 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositeFrame.ts"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"367e88cd9cc8dfa01c58c2d66b114f86a2958cbe6f907ef6462fc7e7700a7f19"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GenerateCanvasRenderSize.GenerateCanvasRenderSize: FunctionTooLong \u2014 GenerateCanvasRenderSize 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/GenerateCanvasRenderSize.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f3118b50dac3f9738782d9234efa4a10a17986821955395f9460345116905a6"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CanvasToolModule: 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b5bc31b5c0b69a37b3551b8c5792d381d7adffb15ed0a28b07eddca5570062c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: shared/graph_if_runtime.py: FileTooLong \u2014 616 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 116 over it, 1.23\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":"invokeai/app/services/shared/graph_if_runtime.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"05ada306e417eaaa4331e8d719292736929d19b8e215407f345f2273af421869"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: Picker.Picker: FunctionTooLong \u2014 Picker runs 123 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 23 over it, 1.23\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":"invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx"},"region":{"startLine":524}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf7ceedea1faf47bc3cbfa54793b49199aeb29c2919e8aa814ed2cd34dc2d01d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ChangeBoardModal.ChangeBoardModal: FunctionTooLong \u2014 ChangeBoardModal runs 123 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 23 over it, 1.23\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":"invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"bffd81f01d95415c73a92e60c0ae838cea6e6be782228ed44889f9712bf870a7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: BoardContextMenu.BoardContextMenu: FunctionTooLong \u2014 BoardContextMenu runs 123 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 23 over it, 1.23\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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardContextMenu.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1b3b859bf7bf61c10cddb59bf66d578a01437e1ff4ed13ef2197696c705ab6d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UpscalingLaunchpadPanel.UpscalingLaunchpadPanel: FunctionTooLong \u2014 UpscalingLaunchpadPanel runs 123 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 23 over it, 1.23\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":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"3acedbc29fa7b47751cc739a4250f819bcc98536e865bd4e7b5eed28d444f315"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AddNodesView.AddNodesView: FunctionTooLong \u2014 AddNodesView runs 123 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 23 over it, 1.23\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":"invokeai/frontend/webv2/src/features/nodes/ui/add-nodes/AddNodesView.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"303951565fc0f3b80cc856505da498d4ac4fb28c235b42e416dad957f6b75292"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useWorkflowPublication.useWorkflowPublication: FunctionTooLong \u2014 useWorkflowPublication runs 123 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 23 over it, 1.23\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":"invokeai/frontend/webv2/src/features/workflow/ui/library/useWorkflowPublication.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"957a31c1a4d717d5f1ce5f26cfeb73580068c10c1b9db298e7fe408f6b94ce4b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: anima/anima_denoise.py: FileTooLong \u2014 613 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 113 over it, 1.23\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":"invokeai/app/invocations/anima/anima_denoise.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6345a4b714e557abc45d6d0cab698a5580d7b3c986363425f0cac9129e9976f4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: install/import_images.py: FileTooLong \u2014 610 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 110 over it, 1.22\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":"invokeai/frontend/install/import_images.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f043c851a663eb6b6ce610304ab0e5eef9afec6c5a7d7c2b48808ebd7678d111"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useGalleryGridHotkeys.useGalleryGridHotkeys: FunctionTooLong \u2014 useGalleryGridHotkeys runs 122 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 22 over it, 1.22\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryGridHotkeys.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"21c261c8e168f800286d3a2d38ddd24c618da3757aa200de08e442ccd554299d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: scripts/performance-budgets.mjs: FileTooLong \u2014 606 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 106 over it, 1.21\u00D7 the bar. 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":"invokeai/frontend/webv2/scripts/performance-budgets.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"39145a9854797070bfcfc79aad4e992484af798e62736ad57267d7a6fc6d9c85"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buildCogView4Graph.buildCogView4Graph: FunctionTooLong \u2014 buildCogView4Graph runs 121 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 21 over it, 1.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"16a7c19775ac1f17bec55813dab289a4c148e93c7a076fd44efa9b0b421a2f42"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: graph.buildSdUpscalePath: FunctionTooLong \u2014 buildSdUpscalePath runs 121 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 21 over it, 1.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/core/graph.ts"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c29f9ca940ce6a503e128fde7926de3fca3381f7efb5db0d2f0a05d9bf497ac"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: LayerFilterControls.FilterParamField: FunctionTooLong \u2014 FilterParamField runs 121 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 21 over it, 1.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerFilterControls.tsx"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3257291d24c4460accea2526c2e5c19b7f052c80e48fca0c615287911712e1c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: canvas-engine/capabilities.ts: FileTooLong \u2014 603 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 103 over it, 1.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":"invokeai/frontend/webv2/src/workbench/canvas-engine/capabilities.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3799daf8bc94569d3653d1c72a3a328bf41d1afd3f8dfad9db76f75e789b9a0"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: useGalleryData: ClassTooLong \u2014 482 significant lines (blank, comment-only and punctuation-only lines excluded), 41 methods. The bar is 400 significant lines; this is 82 over it, 1.21\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":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryData.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8531f72610f476080c6766f1e8377cc8b0d38a9857434470570c6b8e684c1852"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: Text/CanvasTextOverlay.tsx: FileTooLong \u2014 602 significant lines (blank, comment-only and punctuation-only lines excluded), about 87% of them inside a single declaration: TextEditor (95-740). The bar is 500 significant lines; this is 102 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3c80b772592b11761a97be583af49ef765741e3fbcc8f2ed63cc2fdc93572d1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: CanvasTool/CanvasShapeToolModule.ts: FileTooLong \u2014 602 significant lines (blank, comment-only and punctuation-only lines excluded), about 90% of them inside a single declaration: CanvasShapeToolModule (68-898). The bar is 500 significant lines; this is 102 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b506ad9b93c37d7ecd0368a2706521cd9b9be37bd373f89b82c934269a708d85"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: QueueRuntimeAdapter.QueueRuntimeAdapter: FunctionTooLong \u2014 QueueRuntimeAdapter 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":"invokeai/frontend/webv2/src/app/QueueRuntimeAdapter.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ed4426f4e0e8c4b18d7b2f1641a07c2fdfce33b34a6b1152b00d08ed600ab65"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProfileDialog.ProfileForm: FunctionTooLong \u2014 ProfileForm 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":"invokeai/frontend/webv2/src/features/identity/ui/ProfileDialog.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"66b1b21205ee5a0aefe6d062097621ccd05d8f458c7b9d3812ad2a6bfbc7826a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: MergeLayerController.mergeVisible: MethodTooLong \u2014 mergeVisible 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"3da90c6b53afb76f8777670169af17d366e44011018351fc70053166e2883900"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: compositor.compositeDocument: FunctionTooLong \u2014 compositeDocument 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositor.ts"},"region":{"startLine":520}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8bf1672fb78c7e246aa0cc9bde85c20d4d0cec61506b827205e6a06ca1b9cd4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SettingsDialog.SettingsDialog: FunctionTooLong \u2014 SettingsDialog 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":"invokeai/frontend/webv2/src/workbench/settings/SettingsDialog.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"cba07a9f9ba1e2f8b6fc32f164d36338cc1be75e9580700fb37a89d22eb952cf"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: linear/FormBuilderTab.tsx: 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":"invokeai/frontend/webv2/src/features/workflow/ui/linear/FormBuilderTab.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"361b72a8c79039b5fb4808f1c002cce5b10cb8a07cc55f19bf13cd147f3f1bde"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: QueueItemDetail.QueueItemComponent: FunctionTooLong \u2014 QueueItemComponent runs 119 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 19 over it, 1.19\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":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueItemDetail.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c2a862652d4ece5bb0da4fe62327dadec6575c454ced32b7e32e62732056169"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: bitmapStore.createBitmapStore.flushLayer: FunctionTooLong \u2014 createBitmapStore.flushLayer runs 119 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 19 over it, 1.19\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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3864436bfd521c8a10e8ce7855aaf519b5bebe6ee0d7d3c9fa4fc54d9eec53c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: krea2/krea2_denoise.py: FileTooLong \u2014 592 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 92 over it, 1.18\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":"invokeai/app/invocations/krea2/krea2_denoise.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ee2bac92f2519e17888b93ee021319b09691ec47d96dd2c1172a86ddd1a3912"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: model_loaders/krea2.py: FileTooLong \u2014 591 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 91 over it, 1.18\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":"invokeai/backend/model_manager/load/model_loaders/krea2.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"488312e435104b45a71c2997fb4b7346b39295473a6e8cae2ff7b9d2939612d1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/GenerateRenderSection.tsx: FileTooLong \u2014 591 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 91 over it, 1.18\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":"invokeai/frontend/webv2/src/features/generation/ui/GenerateRenderSection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d7b135a94d1fb4b16fbb01042a02ff8b664e0e383a64ac42c5492b5c784cc93"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ModelSettingsImportButton.ModelSettingsImportButton: FunctionTooLong \u2014 ModelSettingsImportButton runs 118 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelSettingsImportButton.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"64a87fe7d499b72709ebac1fe86e1cda446b026ebc80f430d95b47ad219b9d5a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: parseSchema.parseSchema: FunctionTooLong \u2014 parseSchema runs 118 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\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":"invokeai/frontend/webv1/src/features/nodes/util/schema/parseSchema.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"705ff1332561f981de7e0eca1ad32e6ae9f50b52fbd63de510278c3c2b09ae54"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: StylePresetListItem.StylePresetListItem: FunctionTooLong \u2014 StylePresetListItem runs 118 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\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":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetListItem.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"839695e37c9aa291e7ce1435357a87da57ff4905d7407ed7959e9508798039c3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: videoPolicies.getVideoComponentSectionPolicy: FunctionTooLong \u2014 getVideoComponentSectionPolicy runs 118 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\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":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":1508}}}],"partialFingerprints":{"codehealthFindingId/v1":"01f6e101d1ebddc6f7abcc095f28478995cd6ee3d84cd44c2392a6f1570352ff"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectWorkflowsView.ProjectWorkflowsView: FunctionTooLong \u2014 ProjectWorkflowsView runs 118 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 18 over it, 1.18\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":"invokeai/frontend/webv2/src/features/workflow/ui/library/ProjectWorkflowsView.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"58776777662ac6935e6148ad6f6bf188467048fba9eef9e8162742a9c0516aa6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: hidiffusion/hidiffusion.py: FileTooLong \u2014 587 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 87 over it, 1.17\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":"invokeai/backend/hidiffusion/hidiffusion.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7600c5108d414fccc2a00d7d1d8207017ab99579c27f3d2f02bc04ff67d374f6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: graph.buildWanVideoGraph: FunctionTooLong \u2014 buildWanVideoGraph runs 117 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 17 over it, 1.17\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/graph.ts"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"8765edb08702873f8a56a1da36dec13697d410cf5e81063bcb5a3e56c862e155"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SettingsEntryView.SettingsEntryView: FunctionTooLong \u2014 SettingsEntryView runs 117 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 17 over it, 1.17\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/SettingsEntryView.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6479ce4e12cfb12209d1945db8bcaedaf49f215243f5badf443361b5d9eb58f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: LayerChildMenu.LayerChildMenu: FunctionTooLong \u2014 LayerChildMenu runs 117 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 17 over it, 1.17\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerChildMenu.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"a753e6c28b41a2964f68f2e6ffc5aa32de4378746c2783835e6c9f2d7dd97c4f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: z_image/z_image_denoise.py: FileTooLong \u2014 584 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 84 over it, 1.17\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":"invokeai/app/invocations/z_image/z_image_denoise.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e47c5b48aafb3a7ebcef5b3e20e11bf0e150b6e6aa8c637a33178008d2575aa4"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DiskImageFileStorage: TooManyMethods \u2014 35 methods. The bar is 30 methods; this is 5 over it, 1.17\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":"invokeai/app/services/image_files/image_files_disk.py"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cc59531b679924dc36da89c7a111e6e85393889939a6f9bc0bd3985e8a54f4a"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: NavigationApi: TooManyMethods \u2014 35 methods. The bar is 30 methods; this is 5 over it, 1.17\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":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"057843c6b4e24ec198c1f5b6b3b888856bdf726abb00ec33ee6f699e2fa3d240"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: shared/execution_effects.py: FileTooLong \u2014 582 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 82 over it, 1.16\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":"invokeai/app/services/shared/execution_effects.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1792aa0f6fe5ad193d61e30ea4142add010c31384596a5fef625c8dd3b7a732"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: prompt/ast.ts: FileTooLong \u2014 581 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 81 over it, 1.16\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":"invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5eb7b6c690cccdb9af516bc2ce178895598a6df58dc9321e49750bd077a3dc81"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/VideoReferenceListField.tsx: FileTooLong \u2014 581 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 81 over it, 1.16\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":"invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fad1c4a4af2f9cfb002cb1c28a7e53470329286c27f3549bb4f7cf1acef580c9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: dnd-hooks.useBuilderDndMonitor: FunctionTooLong \u2014 useBuilderDndMonitor runs 116 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 16 over it, 1.16\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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"8342c82c2ee3630e8d3e2fe43fa810700154df87cbe70d4a382d09177d59c0b4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: parseFieldType.parseFieldType: FunctionTooLong \u2014 parseFieldType runs 116 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 16 over it, 1.16\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":"invokeai/frontend/webv1/src/features/nodes/util/schema/parseFieldType.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"7df5441fbfb1151f06d357a99b515de9437c1a47a28d20d64435092aafb56104"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PromptTemplatesPanel.PromptTemplatesPanel: FunctionTooLong \u2014 PromptTemplatesPanel runs 116 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 16 over it, 1.16\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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplatesPanel.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"91c5f53bbde34a8acb89017b48edabc8dfefe98e15a4b8dc59317cd03edbe336"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: widgetValues.syncVideoWidgetValuesWithModels: FunctionTooLong \u2014 syncVideoWidgetValuesWithModels runs 116 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 16 over it, 1.16\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":"invokeai/frontend/webv2/src/features/video/core/widgetValues.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9e58d186d7b689bc3ea0c0c19775d27124a2ef0a6ae3a5c71b15d2b160695d8"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ExtractMaskedAreaController.extract: MethodTooLong \u2014 extract runs 116 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 16 over it, 1.16\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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/extractMaskedAreaController.ts"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c8b14152784f98b83b98354ed768a9d8953e1f863af0f039679b44520e516de"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: MergeLayerController.mergeDown: MethodTooLong \u2014 mergeDown runs 116 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 16 over it, 1.16\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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"43fc86872ea9808a92cdb625eeaee0aee9fa52479db081e69adce87ddb4b2cd7"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PreviewFilmstrip.FilmstripLiveThumb: FunctionTooLong \u2014 FilmstripLiveThumb runs 116 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 16 over it, 1.16\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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFilmstrip.tsx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7d22ee5b8dc7bc3cd94f03f3339937326fcc2906b447378e9cf90b059a1941d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: core/batch.ts: FileTooLong \u2014 576 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 76 over it, 1.15\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":"invokeai/frontend/webv2/src/features/workflow/core/batch.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"edc777c584b911573bd218cd42fe2541b33d3965f0a0f789ab66059d72ac6c26"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: context.InvocationNodeContextProvider: FunctionTooLong \u2014 InvocationNodeContextProvider runs 115 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 15 over it, 1.15\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/context.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"49499aca5a270f781be57bdfb820642df52444502ce622054f755c291989762a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SavedWorkflowFieldInputComponent.SavedWorkflowFieldInputComponent: FunctionTooLong \u2014 SavedWorkflowFieldInputComponent runs 115 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 15 over it, 1.15\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SavedWorkflowFieldInputComponent.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c710be205dc9ca23c4e3b5b6b7119365e559d9db943e407733eed76ad3aeb95"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GalleryStackedLayout.GalleryStackedLayout: FunctionTooLong \u2014 GalleryStackedLayout runs 115 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 15 over it, 1.15\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryStackedLayout.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"17907bf86f2e001f71a97d0c4d3fa95a513eb583111401e4f7c369d77602c2db"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useEraser.useEraser: FunctionTooLong \u2014 useEraser runs 115 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 15 over it, 1.15\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/useEraser.tsx"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"89a2027c09ed3d8651b85071c852855fc02c2a1be3c38023b1442b1b20c52a34"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: StagedResultController.commit: MethodTooLong \u2014 commit runs 115 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 15 over it, 1.15\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/stagedResultController.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd85ca711e4396e2a338a98812ec776037fdb798426bfe339a2c5f88e765c12b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: generationComposite.composeForGeneration: FunctionTooLong \u2014 composeForGeneration runs 115 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 15 over it, 1.15\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/generationComposite.ts"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"25570c3329ceab6faa7f608d8d1a2e55cd1745075bcfd7ab1392c41a83d09d79"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WhatsNewDialog.WhatsNewDialog: FunctionTooLong \u2014 WhatsNewDialog runs 115 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 15 over it, 1.15\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/shell/WhatsNewDialog.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"add26bf88e89d87943ba5e3c313b3b211a472f695ea6f3423c209a3f61329878"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: endpoints/images.ts: FileTooLong \u2014 574 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 74 over it, 1.15\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":"invokeai/frontend/webv1/src/services/api/endpoints/images.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5abae6e340b4b0f9d90ac40c38e1e504dda49a4a7dc1ce17b9fed8c62dd08e85"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: library/WorkflowPublicationHost.tsx: FileTooLong \u2014 574 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 74 over it, 1.15\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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowPublicationHost.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"01dd96f3541f3e768ebb943c355378daee76f3436e67f136399887d2d2a7ff29"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: UpscaleWidgetView: ClassTooLong \u2014 459 significant lines (blank, comment-only and punctuation-only lines excluded), 8 methods. The bar is 400 significant lines; this is 59 over it, 1.15\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a999295d339dbf20093d6b99ccb1827ceabf47d635634cd7d84cd9662feaa862"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: image_moves/image_moves_default.py: FileTooLong \u2014 573 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 73 over it, 1.15\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":"invokeai/app/services/image_moves/image_moves_default.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c7a69f31ab950d9737625dbe81290b846724ca9db846731ad71abf69935cc84"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: GalleryPickerView: ClassTooLong \u2014 456 significant lines (blank, comment-only and punctuation-only lines excluded), 2 methods. The bar is 400 significant lines; this is 56 over it, 1.14\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":"invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"90de3f2815e77b85eb6f5d330bfb4accc344e76a1c5011d0b9a0681c140048c4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: session_processor/workflow_call_batch.py: FileTooLong \u2014 570 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 70 over it, 1.14\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":"invokeai/app/services/session_processor/workflow_call_batch.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"84cd7ce2d7cb620c53bef0d183e05094661dab70f54e1faee2bebe4c576d0799"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ToolFillColorPicker.ToolFillColorPicker: FunctionTooLong \u2014 ToolFillColorPicker 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolFillColorPicker.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"75cc89b753664f7f18ba5e3bce601810e9f64dc049a48251e90c8948aa3346df"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowEditorSettings.WorkflowEditorSettings: FunctionTooLong \u2014 WorkflowEditorSettings 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopRightPanel/WorkflowEditorSettings.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"850a9799aae0f0af84bb08b178b9828aae2dfd1aabd0d5ed4aee79aa42d376cc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: run-graph._runGraph: FunctionTooLong \u2014 _runGraph 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":"invokeai/frontend/webv1/src/services/api/run-graph.ts"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee9fecb318cf9667b8bce4921c64e3a2fbe1481051efe7f8b3fdd6faeacf49ce"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: LayoutPresetStrip.PresetTab: FunctionTooLong \u2014 PresetTab 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":"invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetStrip.tsx"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fab2a6c3d606931a4bb1bd749552942fd7d6f02ace1744810cbd023671c7684"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: QueueCluster.QueueCluster: FunctionTooLong \u2014 QueueCluster 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":"invokeai/frontend/webv2/src/workbench/shell/topbar/QueueCluster.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1eae7acc1166b19fe747bb9f08be44e9a8ff469bcc59356b5e6199e2ffa2545"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: workbench/canvasMigration.ts: FileTooLong \u2014 569 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 69 over it, 1.14\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":"invokeai/frontend/webv2/src/workbench/canvasMigration.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1ee9a4cec9fcd2a298e8ca6279e1f9cf79e430233bc324f3c096014dc24a498"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: pidi/model.py: FileTooLong \u2014 568 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 68 over it, 1.14\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":"invokeai/backend/image_util/pidi/model.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c4119083384a2e79e47ca536cef05dfff47a6519b566958d3f6471af3be3a9d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: canvas/compileCanvasGraph.ts: FileTooLong \u2014 566 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 66 over it, 1.13\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":"invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b857561755d54d9795de3d8451a3946e0393066c0e55e5c6f3d474a34fde2740"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: CanvasSegmentAnythingModule.constructor: MethodTooLong \u2014 constructor runs 113 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 13 over it, 1.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e070a5923d8a0eceaa1b62f8e119b20482d55b4a7fe489ae14d7f8f212094b4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UserManagement.UserRow: FunctionTooLong \u2014 UserRow runs 113 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 13 over it, 1.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/identity/ui/UserManagement.tsx"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"921ee60b101a57fdf891d6fada0529b6c9cf00d8dcaa903e195ef4b0af06e8f8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: DefaultSettingsSection.DefaultSettingsSection: FunctionTooLong \u2014 DefaultSettingsSection runs 113 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 13 over it, 1.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/detail/DefaultSettingsSection.tsx"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"351c9974632966adc83efcaad32f25cb963970a5cda193e5512aaad40a3dfcb5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: store.normalizeWorkbenchPreferences: FunctionTooLong \u2014 normalizeWorkbenchPreferences runs 113 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 13 over it, 1.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/store.ts"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"b87f3f87afc497705b201692f8771c5566fa92b52136b948b8d2bdb604a67eba"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: LayerStackHeader.LayerStackHeaderComponent: FunctionTooLong \u2014 LayerStackHeaderComponent runs 113 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 13 over it, 1.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerStackHeader.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"78543f33367267a13882f8ee2aa279a8dbe334980835ecd369393e15ef88a4d4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: layers/AdjustmentSettings.tsx: FileTooLong \u2014 564 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 64 over it, 1.13\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/AdjustmentSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1ca61053358574f8177fbdcc9f3629bcc586233ed7ea719006ebfd8658f2801"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: queries/intermediates.py: FileTooLong \u2014 560 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 60 over it, 1.12\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":"invokeai/app/services/shared/database/queries/intermediates.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b11888b5b42c160f9fbe7245b6736cced8b4562a5737a6605bd7393900afb97"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: api/types.ts: FileTooLong \u2014 560 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 60 over it, 1.12\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":"invokeai/frontend/webv1/src/services/api/types.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1dadabcfbc80a982be97b83f6856b738ab6125b43e4981ad04f8beddd318876"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: RasterLayerAdjustmentsPanel.RasterLayerAdjustmentsPanel: FunctionTooLong \u2014 RasterLayerAdjustmentsPanel runs 112 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 12 over it, 1.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerAdjustmentsPanel.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"c67b8e53b20470083f91113fab24dc6df0646feea916bf3c82e634849a5d3980"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: OperationPanel.OperationPanel: FunctionTooLong \u2014 OperationPanel runs 112 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 12 over it, 1.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/intermediates/ui/OperationPanel.tsx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"417748b6a34b75a88f55eb18eda976393d957b653d14c58b052fbc62c32299ba"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: unloadJournal.scenarios.createUnloadJournalServer: FunctionTooLong \u2014 createUnloadJournalServer runs 112 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 12 over it, 1.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9c1c4fa296acf4c684fac04685d8dd6dc00e92ae46f675a421902e6fa622973"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: CanvasColorPickerToolModule.constructor: MethodTooLong \u2014 constructor runs 111 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 11 over it, 1.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasColorPickerToolModule.ts"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"cecf6c73cfa5d6bcdf4f30422b46e016e7f51db072305dac62bbf72561bc2a8e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: DataViewer.DataViewer: FunctionTooLong \u2014 DataViewer runs 111 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 11 over it, 1.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/DataViewer.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"0aefadb46e2f84ee47cc0fbff88dbf13db8d69d2afc62df0a95f9b524d5cba9e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: buildNodesGraph.buildNodesGraph: FunctionTooLong \u2014 buildNodesGraph runs 111 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 11 over it, 1.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildNodesGraph.ts"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee04724bcdcf8ab70ce6f4221c21e56d2ae6ca8d6817726b924bbe616a003a3a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SettingsGenerationDevices.SettingsGenerationDevices: FunctionTooLong \u2014 SettingsGenerationDevices runs 111 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 11 over it, 1.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsGenerationDevices.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a1fd01450d3873855ae01e9427def28c4e61afe8224f3aa30b8098697032825"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: RelatedModelsSection.RelatedModelsForModel: FunctionTooLong \u2014 RelatedModelsForModel runs 111 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 11 over it, 1.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/detail/RelatedModelsSection.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"c552e04a0978c803e4d51ddc407f83e9f61927c7e284b89c753390e2008d4d64"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: NodePackList.NodePackList: FunctionTooLong \u2014 NodePackList runs 111 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 11 over it, 1.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/nodes/ui/library/NodePackList.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"98e551ce2a693cff309b735ab53bdc091a2360654227d5855c0eca2780df7b68"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: InvocationCacheFooter.InvocationCacheFooter: FunctionTooLong \u2014 InvocationCacheFooter runs 111 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 11 over it, 1.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/ui/InvocationCacheFooter.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fa78f6f37a40df40e2f5240935740abefec9c9780e5724cb3bad7e004223317"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: widget-frame/FloatingWidgetWindow.tsx: FileTooLong \u2014 553 significant lines (blank, comment-only and punctuation-only lines excluded), about 63% of them inside a single declaration: FloatingWidgetWindow (328-827). The bar is 500 significant lines; this is 53 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":"invokeai/frontend/webv2/src/workbench/widget-frame/FloatingWidgetWindow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb4267b5d228796856bb68e1935bc18d55867177fe9d15cf3eed20487b921cf4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: image_files/image_files_disk.py: FileTooLong \u2014 552 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 52 over it, 1.10\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":"invokeai/app/services/image_files/image_files_disk.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"78859b4a0937ea011aff8de9b3f240f17ba86744e9d899946b61b92a68b4f675"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: shared/graph_scheduler.py: FileTooLong \u2014 550 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 50 over it, 1.10\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":"invokeai/app/services/shared/graph_scheduler.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a008c3940e6dfbc5b9c86155aff6eabf37b2768972b139258091f7a536a06ca6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GalleryImageGrid.useKeyboardNavigation: FunctionTooLong \u2014 useKeyboardNavigation 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":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"0096a4a76b9c8795781b4ecfc269b3ab17a4585818d88ac6c58860b3926748ff"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: indexedDbDraftStore.createIndexedDbProjectDraftStore.retargetAcknowledgedCopy: FunctionTooLong \u2014 createIndexedDbProjectDraftStore.retargetAcknowledgedCopy 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":991}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e5c8f01b66e0a4e0151d2b6c737cfa8229085f7277fc6a6c6ce0f93ba0a5389"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AdjustmentSettings.LevelsEditor: FunctionTooLong \u2014 LevelsEditor 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/AdjustmentSettings.tsx"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdd62e8014c493e08cf83adaaa9f5458f74233102790140d89d09ff25c8b6645"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: identity/session.ts: FileTooLong \u2014 546 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 46 over it, 1.09\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":"invokeai/frontend/webv2/src/features/identity/session.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f612616fc52ab2781f2f8813f6b441f1c1959f8433628e83480c3a9c80abb2b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: fields/GeneratorFieldInput.tsx: FileTooLong \u2014 546 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 46 over it, 1.09\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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd6db1e7a66a126e350007d75e2a4109ef890747174fe23b53fb86ff6033207c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: LoginPage.LoginPage: FunctionTooLong \u2014 LoginPage 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":"invokeai/frontend/webv1/src/features/auth/components/LoginPage.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"64f18ba4e69b4ff275820a74c974bf3f3db64757602aeb2522b04a3946110685"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: OpenProjectDialog.OpenProjectDialog: FunctionTooLong \u2014 OpenProjectDialog 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":"invokeai/frontend/webv2/src/workbench/projects/components/OpenProjectDialog.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bba3fa31844b18523d9d3af6919992ade468b76cf66f4a4a63641a879cfaeed"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: workbenchState.assembleWorkbenchProject: FunctionTooLong \u2014 assembleWorkbenchProject 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":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":1657}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe2af26a0bd220190bad15eaa7b7ff0e6d1a32e84173720c71e61b2b93aa47b5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: workbenchStore.recordDiagnosticForAction: FunctionTooLong \u2014 recordDiagnosticForAction 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":"invokeai/frontend/webv2/src/workbench/workbenchStore.ts"},"region":{"startLine":744}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cfa1b443bb7777b90d64715ee74bd494faacff64e3f3f04832bbe809a9959c8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: image-actions/executeVideoRecall.ts: FileTooLong \u2014 541 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 41 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":"invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1c90f95f7fe36ac686c1ff550c3f8d7b0a3715f0800d5f99f2a05bfc8e3e2f7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: intermediates/intermediates_default.py: FileTooLong \u2014 540 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 40 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":"invokeai/app/services/intermediates/intermediates_default.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b58e4289f925ff98d771e299835037f1a9c9808e8344726b34d13c15efd5801"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CanvasEntityGroupList.CanvasEntityGroupList: FunctionTooLong \u2014 CanvasEntityGroupList 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityGroupList.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"a64acea0486809515d5f0a0acf6025dd1a8da1b60d40c47a1e3f76350c6a3a64"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: RegionalGuidanceIPAdapterSettings.RegionalGuidanceIPAdapterSettingsContent: FunctionTooLong \u2014 RegionalGuidanceIPAdapterSettingsContent 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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettings.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d852e9bcfb3cd7596fe3a75eae53939467e05a1e5df279b0c055a7d910b9818"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: TextToolOptions.FontSizeControl: FunctionTooLong \u2014 FontSizeControl 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"9988ac17d7ecc7be3ec8dd4e6192dea366d2fd8cb678579c16a7a3945ce466b8"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Editor.getNextCropBoxByHandleWithAspectRatio: MethodTooLong \u2014 getNextCropBoxByHandleWithAspectRatio 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":"invokeai/frontend/webv1/src/features/cropper/lib/editor.ts"},"region":{"startLine":746}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc4f907716dd8d5ed51bd420c647387b7241f2264a49f7b948004d863629ec87"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UseDefaultSettingsButton.UseDefaultSettingsButton: FunctionTooLong \u2014 UseDefaultSettingsButton 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":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"855cea7d6df63cf07964b422e972bf181f8878ce3497770f06bc1dab238d8e1f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: usePromptTriggerAutocomplete.usePromptTriggerAutocomplete: FunctionTooLong \u2014 usePromptTriggerAutocomplete 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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/usePromptTriggerAutocomplete.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e8dce9e83ed0b0d9bd45efd812e56ca56d68236a33f850259974d108055270c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: socketHub.createSocketHub: FunctionTooLong \u2014 createSocketHub 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":"invokeai/frontend/webv2/src/platform/transport/socketHub.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"88eefef03b3a1373a1422f1cdf6efced1f8a9369a25c919b9223964854e4b100"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: previewPublisher.createPreviewPublisher: FunctionTooLong \u2014 createPreviewPublisher 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/previewPublisher.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed16f5a11ad404538a4b03b6eeb9d35fa30985d7d8b4c6500a92720270064f14"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: gradientTool.createGradientTool: FunctionTooLong \u2014 createGradientTool 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/gradientTool.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"388558e8e3d41b195a844c07a7ba30b817924115b0d0ded24c8917cb3262aece"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WidgetSettingsButton.TargetedWidgetSettingsButton: FunctionTooLong \u2014 TargetedWidgetSettingsButton 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":"invokeai/frontend/webv2/src/workbench/settings/WidgetSettingsButton.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"15108e801ba0a464e327f707cdc3536dafaafeac47505bdd0a7f29da66385738"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PreviewDetailsPopover.PreviewDetailsPopover: FunctionTooLong \u2014 PreviewDetailsPopover 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewDetailsPopover.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"75b05b21a55a090d283a3506d29b450c86c5d793e5e6a115244ecf76406b89af"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: routers/video_recall.py: FileTooLong \u2014 539 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 39 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":"invokeai/app/api/routers/video_recall.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4409d0ef59de16a8fc9fa5e8057431ee645f26bcc827fdd65ac2a218f7e2e12"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/ScrubberField.tsx: FileTooLong \u2014 538 significant lines (blank, comment-only and punctuation-only lines excluded), about 71% of them inside a single declaration: ScrubberField (228-768). The bar is 500 significant lines; this is 38 over it, 1.08\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":"invokeai/frontend/webv2/src/platform/ui/ScrubberField.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"be2cb7f020615732481b76c16e61104e175666d44a88c70d3512ef84fa8fe475"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: fonts/fonts_default.py: FileTooLong \u2014 537 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 37 over it, 1.07\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/fonts/fonts_default.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f20624da92115cf89307e95e1c781341c8d5185fa57af26039d77242fac5e5cc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: quantization/fp8_scaled.py: FileTooLong \u2014 535 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 35 over it, 1.07\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/fp8_scaled.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b28defb1d2f98e4a3783045d404865c529cbed1e87cecb59842685ffb2fb411d"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: PsdExportController.export: MethodTooLong \u2014 export runs 107 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 7 over it, 1.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/psdExportController.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6c2b2e655b37079059f74c6bbd84e9139bdd965818f62029ef444b67a609180"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: RoutingControl.RoutingControl: FunctionTooLong \u2014 RoutingControl runs 107 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 7 over it, 1.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/shell/topbar/RoutingControl.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"36d02823c3f38d8b07c3cbcd3bcba5409714ebf1a65568ba214ddb7a5cbfc2aa"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: reference-images/ReferenceImageCropDialog.tsx: FileTooLong \u2014 534 significant lines (blank, comment-only and punctuation-only lines excluded), about 72% of them inside a single declaration: ReferenceImageCropDialog (212-694). The bar is 500 significant lines; this is 34 over it, 1.07\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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d567f5d482afe99cf391ecb81370be5d140ea07af24f919a729c3dc79fcac74"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: core/forLoops.ts: FileTooLong \u2014 534 significant lines (blank, comment-only and punctuation-only lines excluded), about 64% of them inside a single declaration: validateForLoopGraph (268-801). The bar is 500 significant lines; this is 34 over it, 1.07\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":"invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c49d1b2420a12a0ec7ed1b6e6175349c77370edf344db57b0858ff50fb42080"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: DynamicPromptsButton.DynamicPromptsButton: FunctionTooLong \u2014 DynamicPromptsButton runs 106 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 6 over it, 1.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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/DynamicPromptsButton.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"fac192c8391e6703c9ec362f196f6976c1b9e1ed29be1ec38f8029061587d40e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ResizableTextarea.ResizableTextarea: FunctionTooLong \u2014 ResizableTextarea runs 106 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 6 over it, 1.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":"invokeai/frontend/webv2/src/platform/ui/ResizableTextarea.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"433336f58ad52a95546d4959b01093d824aec6991fa7df7cce95526029481d96"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: canvasDimsSync.createCanvasDimsSync: FunctionTooLong \u2014 createCanvasDimsSync runs 106 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 6 over it, 1.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":"invokeai/frontend/webv2/src/workbench/canvasDimsSync.ts"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"245592b2056a26378238e032d545a777843438cb9b00df2524343b247c4f058d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ProjectFileOptionsDialog.ProjectFileOptionsDialog: FunctionTooLong \u2014 ProjectFileOptionsDialog runs 106 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 6 over it, 1.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":"invokeai/frontend/webv2/src/workbench/projects/components/ProjectFileOptionsDialog.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"84b1c0b101cb05273dc82f4cb8ae1f243a9bff914dd0cfea503d07fbaccacfda"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: LayoutPresetStrip.PresetMenu: FunctionTooLong \u2014 PresetMenu runs 106 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 6 over it, 1.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":"invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetStrip.tsx"},"region":{"startLine":505}}}],"partialFingerprints":{"codehealthFindingId/v1":"baad4cc3c4df2af3c7b0e9eefe05b01376db2b127f4c5953ecf1afe51384bd16"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: util/promptAST.ts: FileTooLong \u2014 529 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 29 over it, 1.06\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":"invokeai/frontend/webv1/src/common/util/promptAST.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b8477f41685f5e8800565c182f6db714462aa1e560d6020f70c993a5d5e9b74"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: image-actions/videoRecall.ts: FileTooLong \u2014 526 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 26 over it, 1.05\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":"invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"05b59cd9e6b1da016fbb5b115733faea6cb39b573ba4ffab9c1e438d7ecd5045"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: canvas/StagingBar.tsx: FileTooLong \u2014 525 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 25 over it, 1.05\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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/StagingBar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e5971e729713550564b003afa456f5ff2caa10d49164b216f71138c65644561"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useGlobalHotkeys.useGlobalHotkeys: FunctionTooLong \u2014 useGlobalHotkeys 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":"invokeai/frontend/webv1/src/common/hooks/useGlobalHotkeys.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f371a5877f2c7964bd1eb9d1f76a8054dd70f0a1c577a2685f7db1fe2b41432"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ContextMenuItemNewCanvasFromImageSubMenu.ContextMenuItemNewCanvasFromImageSubMenu: FunctionTooLong \u2014 ContextMenuItemNewCanvasFromImageSubMenu 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":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4100b637590eb8e8a0a69d17643f5b6bbe787e57ac2b5a1c913b4fde7dda62f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: FormBuilderTab.FormBuilderTab: FunctionTooLong \u2014 FormBuilderTab 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":"invokeai/frontend/webv2/src/features/workflow/ui/linear/FormBuilderTab.tsx"},"region":{"startLine":620}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cbd1ae48b5214798dfb1dab936e8344a85a59b89e4c82561d55eb70642e42c1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: layerRasterizer.createLayerRasterizer: FunctionTooLong \u2014 createLayerRasterizer 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/layerRasterizer.ts"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fa9efd6ec280b25df65d4601ae0d9c3bb729d08185443f512bccf98424114d9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: rasterComposite.renderRasterComposite: FunctionTooLong \u2014 renderRasterComposite 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterComposite.ts"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc0cdb7df8869d8f88b5be56f2001918a6ea7c99e9b22da5a717f790485a65c0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MaxQueueHistorySettings.MaxQueueHistorySettings: FunctionTooLong \u2014 MaxQueueHistorySettings 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":"invokeai/frontend/webv2/src/workbench/settings/MaxQueueHistorySettings.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bdca58a9605c7168f6c6eb76a8144bb03d7927fcbb74fca3165e5c934d325d3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: konva/pressure.ts: FileTooLong \u2014 524 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 24 over it, 1.05\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":"invokeai/frontend/webv1/src/features/controlLayers/konva/pressure.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"50f223e141005efb15b0a02e9ea4b83fb9e693dc4487b16b36fc1d32cc1bad61"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/Picker.tsx: FileTooLong \u2014 524 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 24 over it, 1.05\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":"invokeai/frontend/webv2/src/platform/ui/Picker.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"77178b744d09f5af4f0b69538e6875b33cf7a98f5f3e0474f795069119b8976f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: StarterList.StarterList: FunctionTooLong \u2014 StarterList runs 104 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 4 over it, 1.04\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":"invokeai/frontend/webv2/src/features/models/ui/add-models/StarterList.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"72cc1d1a5ac04f80c7b49da5675df1692783bcecd0c8ba7da908b5d929faa3be"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useDeletionConfirmation.useDeletionConfirmation: FunctionTooLong \u2014 useDeletionConfirmation runs 104 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 4 over it, 1.04\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":"invokeai/frontend/webv2/src/workbench/image-actions/useDeletionConfirmation.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c0ee13f52f06a1af268ca17bc8ee4957dac8744515f789478a3fb6c7c59b362"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: TransformPane.ConnectedTransform: FunctionTooLong \u2014 ConnectedTransform runs 104 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 4 over it, 1.04\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/TransformPane.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cf1c0f483234b06fb85694971c07b8ed98f5a4f99d2df4d7ed9c5b7afae835b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ltx2/denoise.py: FileTooLong \u2014 517 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 17 over it, 1.03\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/ltx2/denoise.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"db41cbcd5024893703c909e3edef7260b25499009e49837e75097285a2467e96"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: dnd/dnd.ts: FileTooLong \u2014 517 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 17 over it, 1.03\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff52b43440bc37e209d2a188c23c5fb11cd4c7d123182da557d4b9a2b2fe3975"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Graph: 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"84917f453884d5f21083d4af013b892386c2fc43b812f10df1eb56207e3b936c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: RefImageSettings.RefImageSettingsContent: FunctionTooLong \u2014 RefImageSettingsContent 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":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ee442e4fd5d7d38a2396ab2a4280ada0af2698302d72cdc105af5cdf0a2d11a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GalleryImage.GalleryImage: FunctionTooLong \u2014 GalleryImage 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":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"662a1a4832ff601f39e4e2f98d76eb16b31b71c44a0f2340191a34a10b337272"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CompareToolbar.CompareToolbar: FunctionTooLong \u2014 CompareToolbar 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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CompareToolbar.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee8df8164a8b569f615fd0919e243fd770ece373bebd3348bbb6fc21c3764c99"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ImageComparisonHover.ImageComparisonHover: FunctionTooLong \u2014 ImageComparisonHover 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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonHover.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0cc77df706d48227c3808ff71659fa726e3ac492d756feb6ee7d9bbbf8bd920"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useConnection.useConnection: FunctionTooLong \u2014 useConnection 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":"invokeai/frontend/webv1/src/features/nodes/hooks/useConnection.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd3392b8748314b962bcffa394f3a8f5f806dde4d0f3d50b258e8a3fa728f3ed"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ModelFilterMenu.ModelFilterMenu: FunctionTooLong \u2014 ModelFilterMenu 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":"invokeai/frontend/webv2/src/features/models/ui/shared/ModelFilterMenu.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2a48e3b77ef22be3d2b35d0e7a4daf43da180773c7b43345bc1550631b9dc5e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: executeImageRecall.executeImageRecall: FunctionTooLong \u2014 executeImageRecall 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":"invokeai/frontend/webv2/src/workbench/image-actions/executeImageRecall.ts"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c0186e6a22442bcb6854973a8faa5eaf45ccb8b524b6028a62f8a8f8c393bc9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ShapeOptions.ShapeSettings: FunctionTooLong \u2014 ShapeSettings 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/ShapeOptions.tsx"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"73ac5afd67f550a6f79e420995536d0bbcbb8ab36a1e35bbac3ae544a23a3649"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AdjustmentSettings.AdjustmentEntryEditor: FunctionTooLong \u2014 AdjustmentEntryEditor 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/AdjustmentSettings.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"755ec510d7f7bedb7e1340625521bd7bbea134e8ecd3311377a92475c4cc2d6f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: layerChildRows.layerChildRowCommand: FunctionTooLong \u2014 layerChildRowCommand 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerChildRows.ts"},"region":{"startLine":507}}}],"partialFingerprints":{"codehealthFindingId/v1":"619c61e660b355fb7dfc8eff19fa4d962ba1d1c99cc6fec50d41c03279555ccd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: shared/invocation_context.py: FileTooLong \u2014 512 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 12 over it, 1.02\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/invocation_context.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f068ad141f539aaddf329640473d9fefb7e00f8515855b3f97985cb57661e58"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: PreviewWidgetView: ClassTooLong \u2014 409 significant lines (blank, comment-only and punctuation-only lines excluded), 13 methods. The bar is 400 significant lines; this is 9 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewWidgetView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d23816f4e89ec9b92b6b413afaa6e2b938a7d4cca0f3ca15e3c7e244e092d0f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: invocations/baseinvocation.py: FileTooLong \u2014 511 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 11 over it, 1.02\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/baseinvocation.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"624afb33b6efb56cfd981e5317802af9ce7da78b1a47a1dffca1cda30dcfa5ac"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/UserManagement.tsx: FileTooLong \u2014 510 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 10 over it, 1.02\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/UserManagement.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2593dbdb00b4cbfd2e683d0653dbb4b9250809b0a7cea7e6bd2dacd617fb8a9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: CanvasTextToolModule.commitSession: MethodTooLong \u2014 commitSession 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasTextToolModule.ts"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"28c1372e79bc2ee4bd74ed8f131d9bbc7ac1fd8a53711e548d30567bd78ba71a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: WorkflowUiAdapter.WorkflowUiAdapterProvider: FunctionTooLong \u2014 WorkflowUiAdapterProvider 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":"invokeai/frontend/webv2/src/app/WorkflowUiAdapter.tsx"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"485c2756c2b8ef97025fed5ec35733e893fbbc22313a8e330998245db813e8ee"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PromptTemplatesButton.PromptTemplatesButton: FunctionTooLong \u2014 PromptTemplatesButton 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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplatesButton.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"09ca2103d5d9fe25f0abe77f25fdf93e74290311500b3aeea3b53b540932fef1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useCleanupDialog.useCleanupDialog: FunctionTooLong \u2014 useCleanupDialog 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":"invokeai/frontend/webv2/src/features/intermediates/ui/useCleanupDialog.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff070a2440cb331cfba58955d9bcf48d32dc2a44adc75432a4d54d991b7399f4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GraphPreviewOpenAsMenu.GraphPreviewOpenAsMenu: FunctionTooLong \u2014 GraphPreviewOpenAsMenu 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":"invokeai/frontend/webv2/src/features/workflow/ui/graph-preview/GraphPreviewOpenAsMenu.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"cea98a3de260791a78ce758bc3edc49b8a5a06be526c70306d8ef7eb2abd4800"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: layerRasterizer.createLayerRasterizer.getOrStartLayerRasterization: FunctionTooLong \u2014 createLayerRasterizer.getOrStartLayerRasterization 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/layerRasterizer.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b033e286d0584c668083ef82ab1b63b43faf32e00b55b8671f7f6e1943f3cda"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: entries.buildSettingsEntries: FunctionTooLong \u2014 buildSettingsEntries 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":"invokeai/frontend/webv2/src/workbench/palette/entries.ts"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a7c5a5a16036c3dc43167f710e0e275180f1f1542b112e87b733ba9cb42a52b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GradientOptions.GradientStopsSettings: FunctionTooLong \u2014 GradientStopsSettings 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/GradientOptions.tsx"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fda1ed8302802cc056616b86814090a489ee5e8d1702d7d85f618b17f62a221"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: app/api_app.py: FileTooLong \u2014 508 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 8 over it, 1.02\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api_app.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"db0fa8ebe255b94a5633b4e522b7a24c2e8662f7b1899568cd4dfe80ee2d70f9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: facets/latent_space.py: FileTooLong \u2014 508 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 8 over it, 1.02\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/architectures/facets/latent_space.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8ce44e2b1bf1270d55a83369f8077f0efb243541ec595f18eab7bc1fec617d5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: picker/GalleryPickerView.tsx: FileTooLong \u2014 508 significant lines (blank, comment-only and punctuation-only lines excluded), about 90% of them inside a single declaration: GalleryPickerView (65-636). The bar is 500 significant lines; this is 8 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":"invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"00fb3aeebce45cb74f7bce2ae770d650ceaae59260aa4684c0653059d596efa1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: schema/buildFieldInputTemplate.ts: FileTooLong \u2014 507 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 7 over it, 1.01\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/schema/buildFieldInputTemplate.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a56b31c59cd4a5a19d47c7e6dbba3fcf0138627c2b7a3084229271bdd21adab8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: store/filters.ts: FileTooLong \u2014 505 significant lines (blank, comment-only and punctuation-only lines excluded), about 63% of them inside a single declaration: IMAGE_FILTERS (200-613). The bar is 500 significant lines; this is 5 over it, 1.01\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/filters.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c3c152890e568eeabd89321bcc8e742c8f59c8babcdc280c90f37e7022f960b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: workbench/persistenceRuntime.ts: FileTooLong \u2014 505 significant lines (blank, comment-only and punctuation-only lines excluded), about 87% of them inside a single declaration: createWorkbenchPersistenceRuntime (125-744). The bar is 500 significant lines; this is 5 over it, 1.01\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/persistenceRuntime.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"12c2d295c6cd932145183bb945993f908a24425a697cf76d3ea6069d1230229e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: tool-options/SamOptions.tsx: FileTooLong \u2014 505 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 5 over it, 1.01\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/SamOptions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"42428b237ce31ac71d4c6ee36f6475632726cdd03343783c176187e70371866b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GalleryProgressSection.GalleryProgressTile: FunctionTooLong \u2014 GalleryProgressTile runs 101 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1 over it, 1.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryProgressSection.tsx"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"ade818674164fa088a81559e7ef63bb8d250fefd1325d0dc726444e88339bdd5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: GallerySelectionBar.GallerySelectionBar: FunctionTooLong \u2014 GallerySelectionBar runs 101 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1 over it, 1.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GallerySelectionBar.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"753a973b608ae71ad5e1bb44c22215840719363c502ce4195333e4bcdf80f193"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: workflowJson.parseWorkflowJson: FunctionTooLong \u2014 parseWorkflowJson runs 101 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1 over it, 1.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/workflowJson.ts"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"61c9fe2083be7702eb20bab6c56caf375531e8e07d4212b5cb59255fc61f21b0"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BooleanMergeController.merge: MethodTooLong \u2014 merge runs 101 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 1 over it, 1.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/booleanMergeController.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"18ff7a338a58ce5bc5b70ef3e16a7c48d8ca750d8fd30db51ff285d471af2053"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: wan/wan_denoise.py: FileTooLong \u2014 502 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2 over it, 1.00\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/wan/wan_denoise.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"59e10de6e80daf770b04495899755c1e44e78b6420e6b2f859cf4d2aaec532df"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member family (7 members, 45 shared lines): invokeai/app/invocations/pid/flux2_pid_decode.py:126-249 | invokeai/app/invocations/pid/flux_pid_decode.py:83-172 | invokeai/app/invocations/pid/pid_upscale.py:106-212 | invokeai/app/invocations/pid/qwen_image_pid_decode.py:118-238 | invokeai/app/invocations/pid/sd3_pid_decode.py:80-161 | invokeai/app/invocations/pid/sdxl_pid_decode.py:107-211 | invokeai/app/invocations/pid/z_image_pid_decode.py:100-230 \u2014 These 7 members are variants of one another: a block of 45 lines reported below appears in every one of them, and the pairwise near-duplicate rows they would otherwise produce are collapsed into this row. Read them as one construct written 7 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 7 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/pid/flux2_pid_decode.py"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dc5f5a7468430e53251cd23f9894bc1e4fd78aae847a23b615f255403f16b6f"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member family (3 members, 9 shared lines): invokeai/backend/flux/custom_block_processor.py:24-59 | invokeai/backend/flux/ip_adapter/ip_double_stream_block_processor.py:41-93 | invokeai/backend/flux/modules/layers.py:156-188 \u2014 These 3 members are variants of one another: a block of 9 lines reported below appears in every one of them, and the pairwise near-duplicate rows they would otherwise produce are collapsed into this row. Read them as one construct written 3 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/custom_block_processor.py"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"18d1def23ed9daddd08818a383fa6632273839f3a6291a6c2f6b0623fb00adf8"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member family (3 members, 3 shared lines): invokeai/backend/z_image/z_image_control_adapter.py:163-236 | invokeai/backend/z_image/z_image_control_transformer.py:339-449 | invokeai/backend/z_image/z_image_control_transformer.py:461-643 \u2014 These 3 members are variants of one another: a block of 3 lines reported below appears in every one of them, and the pairwise near-duplicate rows they would otherwise produce are collapsed into this row. Read them as one construct written 3 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_adapter.py"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"e603486fe7f29b8be69c3de63ab4a69ec2024c1009f23dd708d4722568730d32"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (114 shared lines): invokeai/app/invocations/wan/wan_denoise.py:425-731 | invokeai/app/invocations/wan/wan_video_denoise.py:158-394 \u2014 These two members are variants of one another: 114 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/wan/wan_denoise.py"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa641ece139f1ccac733ef18c939e53247a0362ccf6d5b0c212ae7d0ad64089e"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (80 shared lines): invokeai/backend/pid/_src/networks/pid_net.py:290-495 | invokeai/backend/pid/_src/networks/pixeldit_official.py:1414-1533 \u2014 These two members are variants of one another: 80 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pid_net.py"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd0d249ef0da6e8fc359c515ba967f82f9abcf71cb58ee9de12e6fe2fb584fe0"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (59 shared lines): invokeai/backend/quantization/scripts/load_flux_model_bnb_llm_int8.py:14-76 | invokeai/backend/quantization/scripts/load_flux_model_bnb_nf4.py:27-93 \u2014 These two members are variants of one another: 59 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/scripts/load_flux_model_bnb_llm_int8.py"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4c377f0a57da227c08109015c08f2319f3fdce1f56e90d11de81894e40b9f0f"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (30 shared lines): invokeai/app/invocations/flux2/flux2_klein_lora_loader.py:82-128 | invokeai/app/invocations/z_image/z_image_lora_loader.py:58-101 \u2014 These two members are variants of one another: 30 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux2/flux2_klein_lora_loader.py"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"3277de3db02a0a36276d515c1a6536bcedce150d6b0db855fa472d98b09d2659"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (22 shared lines): invokeai/app/invocations/model.py:531-559 | invokeai/app/invocations/model.py:691-726 \u2014 These two members are variants of one another: 22 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/model.py"},"region":{"startLine":531}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bfcfe7e82e451ea8349fb11c2d343cc4929aae55b077fd2b47f77e6fb9fcf88"}},{"ruleId":"D4","level":"warning","message":{"text":"Edited copy of a member (18 corresponding lines): invokeai/backend/image_util/lineart_anime.py:165-206 | invokeai/backend/image_util/lineart_anime.py:242-274 \u2014 These two members are one piece of code written twice and then edited apart: 18 consecutive lines correspond almost exactly, broken only by small local edits. Most of that correspondence is NOT reported as duplicated blocks below \u2014 the edits cut it into fragments and only the largest of them clear the block floor, so the rows below understate it. The repair is at the members\u0027 grain \u2014 factor the shared implementation into one the two call with their differences as parameters or as an injected step, or, where the difference is systematic (an extra return value, one transport against another), generate one from the other. Left alone, the next edit has to be made twice and the two will drift further apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/lineart_anime.py"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2cc15ee8927924f8a51aaa8b3a024774dbe8e5cce8576703c5c2159a293d818"}},{"ruleId":"D4","level":"warning","message":{"text":"Edited copy of a member (23 corresponding lines): invokeai/backend/wan/extensions/wan_ref_image_extension.py:49-75 | invokeai/backend/wan/extensions/wan_ref_image_extension.py:86-118 \u2014 These two members are one piece of code written twice and then edited apart: 23 consecutive lines correspond almost exactly, broken only by small local edits. Most of that correspondence is NOT reported as duplicated blocks below \u2014 the edits cut it into fragments and only the largest of them clear the block floor, so the rows below understate it. The repair is at the members\u0027 grain \u2014 factor the shared implementation into one the two call with their differences as parameters or as an injected step, or, where the difference is systematic (an extra return value, one transport against another), generate one from the other. Left alone, the next edit has to be made twice and the two will drift further apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/wan/extensions/wan_ref_image_extension.py"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"e73a558dc45a8008033eb67a1b24e1cca4fa41428e54f1effdd45e8b5bb504ee"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (9 members, 50\u002B identical tokens): invokeai/app/invocations/anima/anima_denoise.py:248-269 | invokeai/app/invocations/cogview4/cogview4_denoise.py:81-113 | invokeai/app/invocations/flux/flux_denoise.py:697-735 | invokeai/app/invocations/flux2/flux2_denoise.py:679-695 | invokeai/app/invocations/krea2/krea2_denoise.py:215-227 | invokeai/app/invocations/qwen_image/qwen_image_denoise.py:134-148 | invokeai/app/invocations/sd3/sd3_denoise.py:81-113 | invokeai/app/invocations/wan/wan_denoise.py:786-802 | invokeai/app/invocations/z_image/z_image_denoise.py:165-182 \u2014 These 9 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 9 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 9 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/anima/anima_denoise.py"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"2818e03ffa5332fa57a636e54c0f89abc00bea788ed9be4a818468895dfda4d6"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (6 members, 50\u002B identical tokens): invokeai/app/invocations/anima/anima_denoise.py:995-1014 | invokeai/app/invocations/text_encoder/anima_text_encoder.py:286-294 | invokeai/app/invocations/text_encoder/flux2_dev_text_encoder.py:256-265 | invokeai/app/invocations/text_encoder/flux2_klein_text_encoder.py:213-221 | invokeai/app/invocations/text_encoder/z_image_text_encoder.py:213-221 | invokeai/app/invocations/z_image/z_image_denoise.py:917-925 \u2014 These 6 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 6 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 6 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/anima/anima_denoise.py"},"region":{"startLine":995}}}],"partialFingerprints":{"codehealthFindingId/v1":"a07dc5d80a8f5343fe351bca8a7c724e88e5d36c0818d035825095cf9eaf5c43"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (6 members, 50\u002B identical tokens): invokeai/app/invocations/vae/anima_image_to_latents.py:69-120 | invokeai/app/invocations/vae/anima_latents_to_image.py:82-197 | invokeai/app/invocations/vae/minimax_h3_latents_to_video.py:56-134 | invokeai/app/invocations/vae/wan_image_to_latents.py:54-89 | invokeai/app/invocations/vae/wan_latents_to_image.py:51-121 | invokeai/app/invocations/vae/wan_latents_to_video.py:99-260 \u2014 These 6 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 6 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 6 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/anima_image_to_latents.py"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"26645491e7b9ee168fe1ec56bb8dadf671311302637fa50ce09dcd501fdedd16"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (6 members, 50\u002B identical tokens): invokeai/app/util/user_management.py:82-140 | invokeai/app/util/user_management.py:144-180 | invokeai/app/util/user_management.py:218-268 | invokeai/app/util/user_management.py:272-316 | invokeai/app/util/user_management.py:450-542 | invokeai/app/util/user_management.py:551-599 \u2014 These 6 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 6 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 6 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/user_management.py"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2210955940fb1e1422d1f96493765b7911cc887a74f5089c4af32d81c08ebc4"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): invokeai/app/invocations/anima/anima_lora_loader.py:125-166 | invokeai/app/invocations/flux/flux_lora_loader.py:147-186 | invokeai/app/invocations/flux2/flux2_dev_lora_loader.py:146-184 | invokeai/app/invocations/flux2/flux2_klein_lora_loader.py:164-212 | invokeai/app/invocations/z_image/z_image_lora_loader.py:136-181 \u2014 These 5 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 5 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 5 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/anima/anima_lora_loader.py"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7cebd9b5969053ad2f0e360438bb652b08275342bbe68fa44971ddfe0030658"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): invokeai/backend/model_manager/configs/base.py:242-253 | invokeai/backend/model_manager/configs/main.py:3554-3565 | invokeai/backend/model_manager/configs/main.py:3708-3719 | invokeai/backend/model_manager/configs/main.py:3872-3884 | invokeai/backend/model_manager/model_on_disk.py:153-167 \u2014 These 5 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 5 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 5 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/base.py"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9fb3193ad4ec95a3c8aad054e96dc4fc7a026e3868f7e75e36fe9bf128029f1"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): invokeai/backend/model_manager/load/model_loaders/flux.py:872-1013 | invokeai/backend/model_manager/load/model_loaders/flux.py:1265-1549 | invokeai/backend/model_manager/load/model_loaders/ideogram4.py:362-516 | invokeai/backend/model_manager/load/model_loaders/krea2.py:403-638 | invokeai/backend/model_manager/load/model_loaders/z_image.py:478-726 \u2014 These 5 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 5 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 5 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":872}}}],"partialFingerprints":{"codehealthFindingId/v1":"378afe93fe8cb941738947a5feaa4056b56811258863d13c6bf1ed6362cd29bc"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): invokeai/app/api/dependencies.py:119-295 | invokeai/app/services/image_records/image_records_common.py:176-215 | invokeai/backend/pid/_src/networks/pid_net.py:102-175 | invokeai/backend/z_image/z_image_control_transformer.py:156-242 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/dependencies.py"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"10e2358b5ede7721bf50ea52c2f42d776a90aa8b278981e49f51eece51ee2075"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): invokeai/app/api/routers/images.py:135-214 | invokeai/app/api/routers/style_presets.py:109-166 | invokeai/app/api/routers/style_presets.py:201-252 | invokeai/app/api/routers/workflows.py:356-380 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/images.py"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ea96a9c15dc63b225f1741fcc8e3cb3db8c787ad9b8e9ab84ce65598bec54b9"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): invokeai/app/api/routers/workflows.py:394-407 | invokeai/app/api/routers/workflows.py:458-478 | invokeai/app/api/routers/workflows.py:549-560 | invokeai/app/api/routers/workflows.py:572-583 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/workflows.py"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"635f95c3313fbec9dd9a86a927f69b35816ac52065abc9d017a20a44365ba89a"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): invokeai/app/invocations/ltx2/ltx2_lora_loader.py:88-113 | invokeai/app/invocations/ltx2/ltx2_lora_loader.py:142-171 | invokeai/app/invocations/minimax_h3/minimax_h3_lora_loader.py:81-106 | invokeai/app/invocations/minimax_h3/minimax_h3_lora_loader.py:135-164 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/ltx2/ltx2_lora_loader.py"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ae8c3a9ef37f89d92feb7fa2f6a7aed7b8b9eb46a29c6b18bc9136c0b872271"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): invokeai/app/invocations/metadata_linked.py:631-689 | invokeai/app/invocations/metadata_linked.py:703-743 | invokeai/app/invocations/metadata_linked.py:757-795 | invokeai/app/invocations/metadata_linked.py:827-871 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/metadata_linked.py"},"region":{"startLine":631}}}],"partialFingerprints":{"codehealthFindingId/v1":"17d8e25e5513ac63f965aa4a6293d47d87f0fc3a8dc371bc243a58717faccb52"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): invokeai/app/services/events/events_common.py:143-156 | invokeai/app/services/events/events_common.py:199-230 | invokeai/app/services/events/events_common.py:245-259 | invokeai/app/services/events/events_common.py:281-297 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/events/events_common.py"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"c50e9be20af7bc8ca6f96e686da4061c9b10e939567b1a9c89b796b62ff35df6"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): invokeai/app/services/shared/database/queries/images.py:364-388 | invokeai/app/services/shared/database/queries/images.py:407-431 | invokeai/app/services/shared/database/queries/videos.py:312-332 | invokeai/app/services/shared/database/queries/videos.py:349-369 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/queries/images.py"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"39abb9b99227b0778064c12ac644af706ff1f0ec3e2d62d4cb9f116da83caea1"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): invokeai/app/services/shared/graph_materializer.py:461-527 | invokeai/app/services/shared/graph_materializer.py:544-663 | invokeai/app/services/shared/graph_materializer.py:902-1015 | invokeai/app/services/shared/graph_materializer.py:1025-1195 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":461}}}],"partialFingerprints":{"codehealthFindingId/v1":"e82198a1a3107e8ba7b595583312d39368fdce133abbdb9e5f0c7ef2830fc0e2"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_07_01_add_workflow_call_queue_metadata.py:12-45 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_27.py:125-141 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_27.py:158-173 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_27.py:190-205 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_07_01_add_workflow_call_queue_metadata.py"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fb04b2f5b837fb403852d9a8172fbb88fe853672184f7a8e4317ee412b9018e"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): invokeai/backend/hidiffusion/hidiffusion.py:1534-1664 | invokeai/backend/hidiffusion/hidiffusion.py:1669-1814 | invokeai/backend/hidiffusion/hidiffusion.py:1819-1894 | invokeai/backend/hidiffusion/hidiffusion.py:1899-1965 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/hidiffusion/hidiffusion.py"},"region":{"startLine":1534}}}],"partialFingerprints":{"codehealthFindingId/v1":"cab18700c645b2844d343862b4f0e68164c04aad937014f99a1a4a3d043a52be"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): invokeai/backend/model_manager/configs/main.py:1192-1234 | invokeai/backend/model_manager/configs/main.py:3569-3627 | invokeai/backend/model_manager/configs/main.py:3723-3777 | invokeai/backend/model_manager/configs/main.py:3888-3933 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":1192}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4c8a8cf3d42d28ab869bdcee88d09595a3ae9583ea12b53fd63aacb310e419f"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_conv2d.py:16-25 | invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_invoke_linear_8_bit_lt.py:19-28 | invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_invoke_linear_nf4.py:21-30 | invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_linear.py:88-97 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_conv2d.py"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"86d1bb23d9cad405888485ef3a85d9389dbdbe082dedc2d1fab71a8ba6622a2e"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): invokeai/backend/model_manager/load/model_loaders/cogview4.py:28-59 | invokeai/backend/model_manager/load/model_loaders/flux.py:1111-1141 | invokeai/backend/model_manager/load/model_loaders/flux.py:1153-1218 | invokeai/backend/model_manager/load/model_loaders/qwen_image.py:158-196 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/cogview4.py"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8c5b272c9f9fc133d21b26b6dff8ba1302a20158b960ffd8b55ef73db1db347"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): invokeai/backend/model_manager/load/model_loaders/z_image.py:290-407 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1193-1460 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1500-1671 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1705-1846 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ceeb36a14b4237b9c1cca463c1f6381623dfd0a038382fb785f909ab448f4fe"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): invokeai/backend/model_manager/load/model_loaders/z_image.py:410-451 | invokeai/backend/model_manager/load/model_loaders/z_image.py:478-726 | invokeai/backend/model_manager/load/model_loaders/z_image.py:753-797 | invokeai/backend/model_manager/load/model_loaders/z_image.py:880-919 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"9083370ea0db1195cf843eee30981291fe24efe3bacc5138a51bce3a0c7a1b50"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): invokeai/backend/patches/lora_conversions/anima_lora_conversion_utils.py:176-212 | invokeai/backend/patches/lora_conversions/qwen_image_lora_conversion_utils.py:164-197 | invokeai/backend/patches/lora_conversions/wan_lora_conversion_utils.py:219-250 | invokeai/backend/patches/lora_conversions/z_image_lora_conversion_utils.py:214-260 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/lora_conversions/anima_lora_conversion_utils.py"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"4668d1d8169674645e1636d722e42b186717d2a86e8365e0ebe0b9d99b2b0bc4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (60\u201361 lines \u00D7 2): invokeai/app/invocations/z_image/z_image_denoise.py:693-752 | invokeai/app/invocations/z_image/z_image_denoise.py:809-869 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/z_image/z_image_denoise.py"},"region":{"startLine":693}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8fc44d4db343d2f071fde15023efff45e5a3ec802c5d60158aba50634f64b07"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (53 lines \u00D7 2): invokeai/app/invocations/cogview4/cogview4_denoise.py:239-291 | invokeai/app/invocations/sd3/sd3_denoise.py:229-281 \u2014 \u0060invokeai/app/invocations/cogview4/cogview4_denoise.py\u0060 and \u0060invokeai/app/invocations/sd3/sd3_denoise.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 8 separate duplicated blocks between them, totalling at least 153 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/invocations/cogview4/cogview4_denoise.py:238\u0060 calls \u0060_convert_timesteps_to_sigmas\u0060, \u0060tensor\u0060 and \u0060invokeai/app/invocations/sd3/sd3_denoise.py:228\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/cogview4/cogview4_denoise.py"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1dec3b158eade55f24a77595defda8328a7646abd7be68a6a73a110f4ba0b1c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (41\u201353 lines \u00D7 2): invokeai/app/services/shared/invocation_context.py:274-326 | invokeai/app/services/shared/invocation_context.py:441-481 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/invocation_context.py"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"48d2089e1c3e54a4f2d8d7a7db1712727ab65becf0e3340330c683074aa7132c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25\u201350 lines \u00D7 2): invokeai/app/invocations/wan/wan_denoise.py:594-643 | invokeai/app/invocations/wan/wan_video_denoise.py:273-297 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/wan/wan_denoise.py\u0060 and \u0060invokeai/app/invocations/wan/wan_video_denoise.py\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 150 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/wan/wan_denoise.py:594\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/wan/wan_denoise.py"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"1aeaab302dc1ddb8fadbe4e131f543a3d1e78a89ff25620f986f8987f8c53195"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (46\u201347 lines \u00D7 2): invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py:153-199 | invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py:152-197 \u2014 before extracting anything, compare \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py\u0060 and \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py\u0060 as WHOLE FILES: this scan already matched 10 separate duplicated blocks between them, totalling at least 161 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"d07e7453544d547d09859a4b38763b1527a22baa2aaf1b101e4dbe4e522552e2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (38\u201342 lines \u00D7 7): invokeai/app/invocations/pid/flux2_pid_decode.py:171-210 | invokeai/app/invocations/pid/flux_pid_decode.py:98-136 | invokeai/app/invocations/pid/pid_upscale.py:143-180 | invokeai/app/invocations/pid/qwen_image_pid_decode.py:165-202 | invokeai/app/invocations/pid/sd3_pid_decode.py:92-129 | invokeai/app/invocations/pid/sdxl_pid_decode.py:141-178 | invokeai/app/invocations/pid/z_image_pid_decode.py:138-179 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/pid/flux2_pid_decode.py\u0060 and \u0060invokeai/app/invocations/pid/flux_pid_decode.py\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/pid/flux2_pid_decode.py:171\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/pid/flux2_pid_decode.py"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"610b4df03f4173f8737d97a86ee7e53ef81d2906634652af1dbe95f662f5415b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (42 lines \u00D7 2): invokeai/backend/image_util/segment_anything/segment_anything_2_pipeline.py:42-83 | invokeai/backend/image_util/segment_anything/segment_anything_pipeline.py:36-77 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/segment_anything/segment_anything_2_pipeline.py"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a731446048fbafff6f7c0494409f4bea4691edecc88712cb077538610ac83d9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (28\u201339 lines \u00D7 2): invokeai/backend/anima/regional_prompting.py:78-105 | invokeai/backend/z_image/extensions/regional_prompting_extension.py:67-105 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060regional_text_conditioning\u0060 to \u0060AnimaRegionalTextConditioning\u0060 in one and \u0060ZImageRegionalTextConditioning\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/anima/regional_prompting.py"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"b60676c28593a56dc3ac08de6484ab27eae5090af3e66141d26b88f20cec9e41"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (38 lines \u00D7 2): invokeai/backend/tiles/tiles.py:233-270 | invokeai/backend/tiles/tiles.py:344-381 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/tiles/tiles.py:233\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/backend/tiles/tiles.py:273\u0060 calls \u0060linspace\u0060, \u0060expand_dims\u0060 and \u0060invokeai/backend/tiles/tiles.py:383\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/tiles/tiles.py"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6bd41bf2b397ce0985861513eed040a7ae7618d516fae599181f0754b3ee2d1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25\u201337 lines \u00D7 3): invokeai/backend/patches/lora_conversions/qwen_image_lora_conversion_utils.py:164-188 | invokeai/backend/patches/lora_conversions/wan_lora_conversion_utils.py:219-243 | invokeai/backend/patches/lora_conversions/z_image_lora_conversion_utils.py:214-250 \u2014 before extracting anything, compare \u0060invokeai/backend/patches/lora_conversions/qwen_image_lora_conversion_utils.py\u0060 and \u0060invokeai/backend/patches/lora_conversions/wan_lora_conversion_utils.py\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 72 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/lora_conversions/qwen_image_lora_conversion_utils.py"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"efedf7366f197c63e38226716a593f51420289b9c5405e1d63e6d5ebd69ef3b3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (37 lines \u00D7 2): invokeai/backend/hidiffusion/hidiffusion.py:1600-1636 | invokeai/backend/hidiffusion/hidiffusion.py:1756-1792 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/hidiffusion/hidiffusion.py"},"region":{"startLine":1600}}}],"partialFingerprints":{"codehealthFindingId/v1":"73185bda53bbbcf152946b44a6b058f107174e89ce0f5f14970ad5cedf89afa3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (30\u201336 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/krea2.py:544-579 | invokeai/backend/model_manager/load/model_loaders/z_image.py:652-681 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/model_manager/load/model_loaders/z_image.py:632\u0060 calls \u0060extract_comfy_quant_hints\u0060, \u0060extract_fp8_scaled_layers\u0060, \u0060_keep_fp8_weights\u0060 and \u0060invokeai/backend/model_manager/load/model_loaders/krea2.py:535\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/krea2.py"},"region":{"startLine":544}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4fde5027df5cf22e7a078a0441f5e0419bdf734a1fc0d2fed5e9202709a47b7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (31\u201335 lines \u00D7 2): invokeai/backend/anima/regional_prompting.py:143-173 | invokeai/backend/z_image/extensions/regional_prompting_extension.py:171-205 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/z_image/extensions/regional_prompting_extension.py:171\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/anima/regional_prompting.py"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7f984dedc51c1c9eca05a6d410445510d72790f329482ef5203fbcff07acffa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (31\u201335 lines \u00D7 2): invokeai/backend/model_manager/configs/main.py:3593-3627 | invokeai/backend/model_manager/configs/main.py:3747-3777 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":3593}}}],"partialFingerprints":{"codehealthFindingId/v1":"f463a6ab3bf611330f3cf5997e06302e0c9d6208276562e68fef94fdabb9e2f5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (31\u201333 lines \u00D7 2): invokeai/backend/minimax_h3/sampling.py:232-262 | invokeai/backend/minimax_h3/sampling.py:392-424 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/minimax_h3/sampling.py:392\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/minimax_h3/sampling.py"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c850f6674033a37994f52890ec7433619f5182c01eda0033fafe0e9f6238d29"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (30\u201332 lines \u00D7 2): invokeai/app/invocations/anima/anima_denoise.py:656-685 | invokeai/app/invocations/z_image/z_image_denoise.py:419-450 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/invocations/anima/anima_denoise.py:652\u0060 calls \u0060unsqueeze\u0060 and \u0060invokeai/app/invocations/z_image/z_image_denoise.py:415\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/anima/anima_denoise.py"},"region":{"startLine":656}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f2a5e5eb644413fd6eb2c3ee6428c24e92dfe1d4d9440eb3df85096fd09eb85"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26\u201332 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/anima.py:280-311 | invokeai/backend/model_manager/load/model_loaders/ideogram4.py:438-463 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/model_manager/load/model_loaders/anima.py:280\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/model_manager/load/model_loaders/anima.py:277\u0060 calls \u0060info\u0060 and \u0060invokeai/backend/model_manager/load/model_loaders/ideogram4.py:437\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/anima.py"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"17be58b5ebc386eb154031ace1358d588a5843427c99c8dfa2780404b1319e48"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (30\u201332 lines \u00D7 2): invokeai/backend/patches/lora_conversions/flux_bfl_peft_lora_conversion_utils.py:173-202 | invokeai/backend/patches/lora_conversions/flux_bfl_peft_lora_conversion_utils.py:215-246 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/lora_conversions/flux_bfl_peft_lora_conversion_utils.py"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"018937073a52f67dfbc834307646e59a4ad70a9d0998a48b918774387c5a4310"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (30\u201331 lines \u00D7 4): invokeai/backend/hidiffusion/hidiffusion.py:1558-1587 | invokeai/backend/hidiffusion/hidiffusion.py:1692-1722 | invokeai/backend/hidiffusion/hidiffusion.py:1829-1858 | invokeai/backend/hidiffusion/hidiffusion.py:1910-1939 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/hidiffusion/hidiffusion.py"},"region":{"startLine":1558}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a80b16f84d6c20987b578dd63e3794259f38893deb49fde6f7f6071fdb65c96"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (31 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/flux2_state_dict_utils.py:285-315 | invokeai/backend/model_manager/load/model_loaders/flux2_state_dict_utils.py:332-362 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux2_state_dict_utils.py"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"e495a7a72ed703c3813c3cca73a6d8505219df683edc5636b449f4549a5a7c65"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (29\u201331 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/z_image.py:353-381 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1785-1815 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/model_manager/load/model_loaders/z_image.py:353\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/backend/model_manager/load/model_loaders/z_image.py:1816\u0060 calls \u0060info\u0060 and \u0060invokeai/backend/model_manager/load/model_loaders/z_image.py:382\u0060 does not \u2014 after which the two agree again for 4 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"dec16c3ac41972cae429628045e0c296f71d1397c0a2a0a8556e0f5527b5c56c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201330 lines \u00D7 3): invokeai/backend/model_manager/load/model_loaders/anima.py:282-311 | invokeai/backend/model_manager/load/model_loaders/ideogram4.py:440-463 | invokeai/backend/model_manager/load/model_loaders/qwen_image_2_1.py:179-195 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/model_manager/load/model_loaders/anima.py:282\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/anima.py"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa592dfaeee6633f01ce5639ae4cb9e3efacefa7a458e70e29d0673b517d13d7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2): invokeai/app/invocations/vae/cogview4_latents_to_image.py:49-78 | invokeai/app/invocations/vae/sd3_latents_to_image.py:51-80 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/vae/cogview4_latents_to_image.py:49\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/cogview4_latents_to_image.py"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0d6840ad979890b44d28fef99f739d6be05399ce2ad993a8b18337ae75c40c7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2): invokeai/backend/llava_onevision_pipeline.py:90-119 | invokeai/backend/text_llm_pipeline.py:252-281 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/llava_onevision_pipeline.py"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8dfa1d13d9e0b254cacfdfa1f25bfc8b3214d1deadc300b5ae9d9551cbab077"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24\u201330 lines \u00D7 2): invokeai/backend/minimax_h3/packing.py:188-211 | invokeai/backend/minimax_h3/presets.py:43-72 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/minimax_h3/packing.py"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa4c3d030dbba8300cd41882f785b9497dd2adf09361f4ef38b76b84bd6893bb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (28\u201330 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/flux.py:839-866 | invokeai/backend/model_manager/load/model_loaders/flux.py:1230-1259 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":839}}}],"partialFingerprints":{"codehealthFindingId/v1":"0514cc908935256e030dc931bee29bfd284e4d9b43500d79c4957acef0672d37"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26\u201329 lines \u00D7 2): invokeai/app/invocations/vae/flux_vae_decode.py:121-146 | invokeai/app/invocations/vae/z_image_latents_to_image.py:128-156 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/flux_vae_decode.py"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f4bcf623f933554762b11d1a2fa9a972cde72d57929bdd439aa14dde9aacef3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2): invokeai/app/services/session_processor/workflow_call_batch.py:106-134 | invokeai/app/services/shared/workflow_graph_builder.py:282-310 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060workflow_nodes\u0060 to \u0060Mapping[str, Mapping[str, Any]]\u0060 in one and \u0060dict[str, Mapping[str, Any]]\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/session_processor/workflow_call_batch.py"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"e90d1ca96cc1b48d6e5f29db778324d03157a2e5a07c7bfb241af244daf2526c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24\u201329 lines \u00D7 2): invokeai/backend/minimax_h3/transformer_minimax_h3.py:614-642 | invokeai/backend/minimax_h3/transformer_minimax_h3_pruned.py:216-239 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/minimax_h3/transformer_minimax_h3.py"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"298c297b1cb4be69151c1e8bbe2b010082fa75da416291cd9478168e0843cb67"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2): invokeai/backend/quantization/scripts/load_flux_model_bnb_llm_int8.py:14-42 | invokeai/backend/quantization/scripts/load_flux_model_bnb_nf4.py:27-55 \u2014 before extracting anything, compare \u0060invokeai/backend/quantization/scripts/load_flux_model_bnb_llm_int8.py\u0060 and \u0060invokeai/backend/quantization/scripts/load_flux_model_bnb_nf4.py\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 63 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/scripts/load_flux_model_bnb_llm_int8.py"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"6abc645dcac238a3c7ee9150e9b834bf00fbf28a38e1ae9b97586e41ec411a2d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22\u201328 lines \u00D7 3): invokeai/backend/model_manager/configs/main.py:901-922 | invokeai/backend/model_manager/configs/main.py:973-1000 | invokeai/backend/model_manager/configs/main.py:1340-1363 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/model_manager/configs/main.py:973\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":901}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5fa3a1c983e7aa7c4c88dc99c10e1d8c8e9dc750ca7b08066a2dd0bf2a0cc06"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27\u201328 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/cogview4.py:32-59 | invokeai/backend/model_manager/load/model_loaders/flux.py:1115-1141 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/cogview4.py"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"9589cc56068c5bb8e31e526169a5bfd822e5d271878fc8673f8de0df547665a3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27\u201328 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py:554-581 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1123-1149 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py"},"region":{"startLine":554}}}],"partialFingerprints":{"codehealthFindingId/v1":"e41a220ccd9a78e464f6102e5359d32054a0316672f2d1f79a28af3dfea99318"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2): invokeai/app/invocations/metadata_linked.py:1015-1041 | invokeai/app/invocations/metadata_linked.py:1095-1121 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/metadata_linked.py"},"region":{"startLine":1015}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ed20d25ff860c182aa75a187d628829ec665b658f18ab5cc5556fd660d0a40d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2): invokeai/app/invocations/text_encoder/flux2_dev_text_encoder.py:148-174 | invokeai/app/invocations/text_encoder/flux2_klein_text_encoder.py:125-151 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/flux2_dev_text_encoder.py"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"7469a33ad570e4c7eb14309109a4b9f88ef1e22019c4849df860f18a33acbc89"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19\u201327 lines \u00D7 2): invokeai/app/invocations/vae/flux2_vae_decode.py:102-120 | invokeai/app/invocations/vae/z_image_latents_to_image.py:125-151 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/invocations/vae/z_image_latents_to_image.py:124\u0060 calls \u0060inference_mode\u0060 and \u0060invokeai/app/invocations/vae/flux2_vae_decode.py:99\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/flux2_vae_decode.py"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"864454204b71d613a372be8a6afad2787bacda9e2b60cc2e4ec1322a752695a5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22\u201327 lines \u00D7 2): invokeai/backend/flux/extensions/kontext_extension.py:192-218 | invokeai/backend/flux2/ref_image_extension.py:273-294 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/extensions/kontext_extension.py"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"21de535019680698ab04d4828d9eb9e059413e0d20210f06e9f737ee4b35efed"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2): invokeai/backend/pid/_src/networks/pid_net.py:322-348 | invokeai/backend/pid/_src/networks/pixeldit_official.py:1424-1450 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/backend/pid/_src/networks/pid_net.py:353\u0060 calls \u0060split_inputs_cp\u0060 and \u0060invokeai/backend/pid/_src/networks/pixeldit_official.py:1451\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pid_net.py"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf620e131f58f35c917364038e3cb9dcb2b0eae1607b3e4b88329bdd09c9a1f5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26\u201327 lines \u00D7 2): invokeai/backend/z_image/z_image_control_transformer.py:302-327 | invokeai/backend/z_image/z_image_patchify_utils.py:108-134 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/z_image/z_image_control_transformer.py:302\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_transformer.py"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5cfbb288d698f5ee901dbf74523ac69de8fc7e8fafbe960a68213dc2115ac88"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201326 lines \u00D7 3): invokeai/app/invocations/vae/flux2_vae_decode.py:104-121 | invokeai/app/invocations/vae/flux_vae_decode.py:120-142 | invokeai/app/invocations/vae/z_image_latents_to_image.py:127-152 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/invocations/vae/z_image_latents_to_image.py:124\u0060 calls \u0060inference_mode\u0060 and \u0060invokeai/app/invocations/vae/flux2_vae_decode.py:99\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/flux2_vae_decode.py"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"979d3f7eed38b7d7a03e233e4a902f5eb57964d0b6be4322e6e1187d7f4ce1ad"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2): invokeai/app/services/shared/graph_iterate_planner.py:44-69 | invokeai/app/services/shared/graph_iterate_planner.py:94-119 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_iterate_planner.py"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4f650dec8362026092ecd794d45de626bc64cecbfd16b18bada80ddb60254e4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201326 lines \u00D7 2): invokeai/backend/flux/extensions/regional_prompting_extension.py:178-203 | invokeai/backend/flux2/extensions/regional_prompting_extension.py:104-118 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/flux/extensions/regional_prompting_extension.py:178\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/extensions/regional_prompting_extension.py"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"53a1a1bdfe16003cf9ea6dd95105f7c7a44d49cd3d71cf23ba2b6ef03e501199"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24\u201325 lines \u00D7 3): invokeai/backend/model_manager/load/model_loaders/z_image.py:428-451 | invokeai/backend/model_manager/load/model_loaders/z_image.py:773-797 | invokeai/backend/model_manager/load/model_loaders/z_image.py:896-919 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060config\u0060 to \u0060AnyModelConfig\u0060 in one and \u0060Main_SDNQ_ZImage_Config\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/model_manager/load/model_loaders/z_image.py:891\u0060 calls \u0060detect\u0060, \u0060strip\u0060 and \u0060invokeai/backend/model_manager/load/model_loaders/z_image.py:423\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":428}}}],"partialFingerprints":{"codehealthFindingId/v1":"b20d7a323454f20d9e22742dd4e1042726849c64ef3c0bb901c92c3f9475c48b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): invokeai/app/invocations/ltx2/ltx2_extend_conditioning.py:262-286 | invokeai/app/invocations/ltx2/ltx2_video_conditioning.py:131-155 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/ltx2/ltx2_extend_conditioning.py:262\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/ltx2/ltx2_extend_conditioning.py"},"region":{"startLine":262}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b3e28c18fa9b4833fa0d2b3d510a957a497dbbe90c1a3778c900b4925fe315a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): invokeai/app/util/user_management.py:116-140 | invokeai/app/util/user_management.py:156-180 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/user_management.py"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"2461a8b3f92f374b26977fc91b3f84e50213e70c9430af945a5e89ef0765e5b1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): invokeai/app/util/user_management.py:244-268 | invokeai/app/util/user_management.py:292-316 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/user_management.py"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ee0477198c8380c98262c69058ffcd6c355f810dfb8f2354b4bd7b421f3da4d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (3\u201325 lines \u00D7 3): invokeai/backend/flux/controlnet/instantx_controlnet_flux.py:64-88 | invokeai/backend/flux/controlnet/xlabs_controlnet_flux.py:44-46 | invokeai/backend/flux/model.py:62-86 \u2014 before extracting anything, compare \u0060invokeai/backend/flux/controlnet/instantx_controlnet_flux.py\u0060 and \u0060invokeai/backend/flux/controlnet/xlabs_controlnet_flux.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 57 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/flux/controlnet/xlabs_controlnet_flux.py:44\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/controlnet/instantx_controlnet_flux.py"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"58e5f2f4c9fde5f52e0a0eedfc7e956e1826cfc8fb684ce9d62f810a2a08e89d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201325 lines \u00D7 2): invokeai/backend/flux/extensions/regional_prompting_extension.py:271-295 | invokeai/backend/flux2/extensions/regional_prompting_extension.py:162-174 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/extensions/regional_prompting_extension.py"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"59f7e7f51bd3d9ccfb7b82f85276046bea143a58266ae9704e5cb7479459f151"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24\u201325 lines \u00D7 2): invokeai/backend/minimax_h3/sampling.py:206-230 | invokeai/backend/minimax_h3/sampling.py:363-386 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/minimax_h3/sampling.py:206\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/minimax_h3/sampling.py:362\u0060 calls \u0060cat\u0060, \u0060MiniMaxH3Scheduler\u0060 and \u0060invokeai/backend/minimax_h3/sampling.py:206\u0060 does not \u2014 after which the two agree again for 4 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/minimax_h3/sampling.py"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1be818b60d43001b5601206002f70ef9a97d44cfd49b04bf8bd8abae014bfe9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22\u201324 lines \u00D7 3): invokeai/backend/model_manager/load/model_loaders/z_image.py:346-367 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1593-1616 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1777-1800 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/model_manager/load/model_loaders/z_image.py:346\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"71b665dc75d23fa716d0463aa606b9837fbd0237790b8b04effcdef40e8bf643"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21\u201324 lines \u00D7 2): invokeai/app/invocations/wan/wan_denoise.py:439-459 | invokeai/app/invocations/wan/wan_video_denoise.py:183-206 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/wan/wan_denoise.py\u0060 and \u0060invokeai/app/invocations/wan/wan_video_denoise.py\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 150 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/wan/wan_denoise.py"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"a09fbc10e86e0bc20fead294ff28a7f4cc6821451dd5957e0e515b7a561988c9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): invokeai/backend/ltx2/denoise.py:387-410 | invokeai/backend/ltx2/denoise.py:569-592 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/ltx2/denoise.py"},"region":{"startLine":387}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d576bbd7168b4e80350cda0c0520969919791243c8a9a808bd4cf77ad8e53d2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): invokeai/backend/model_manager/configs/qwen3_encoder.py:308-331 | invokeai/backend/model_manager/configs/qwen3_encoder.py:492-515 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/qwen3_encoder.py"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"0941fbff28b0200338ef71ce7b22cbd1456170ef7194a95366e07e4c631b24dc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201323 lines \u00D7 2): invokeai/app/api/routers/images.py:761-783 | invokeai/app/api/routers/images.py:819-835 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/api/routers/images.py:761\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/images.py"},"region":{"startLine":761}}}],"partialFingerprints":{"codehealthFindingId/v1":"38ca431315ae36e668f3a7f8e46533253f618b3666a9c75e9d1cbedd11b62c35"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20\u201323 lines \u00D7 2): invokeai/backend/model_manager/configs/qwen3_encoder.py:371-393 | invokeai/backend/model_manager/configs/qwen3_vl_encoder.py:117-136 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/qwen3_encoder.py"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"21e66ad3bf45952a35988e82ab152ecdc64730a65f8e34d3408bef3e5a23dd7f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22\u201323 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/z_image.py:323-345 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1753-1774 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/model_manager/load/model_loaders/z_image.py:323\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"a252f7cc63c9469a73727a13ca54c3fdf138e7af2e917dd87c8cf79d22627c21"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20\u201323 lines \u00D7 2): invokeai/backend/patches/lora_conversions/flux_bfl_peft_lora_conversion_utils.py:311-333 | invokeai/backend/patches/lora_conversions/flux_bfl_peft_lora_conversion_utils.py:493-512 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/patches/lora_conversions/flux_bfl_peft_lora_conversion_utils.py:308\u0060 calls \u0060warning\u0060 and \u0060invokeai/backend/patches/lora_conversions/flux_bfl_peft_lora_conversion_utils.py:491\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/lora_conversions/flux_bfl_peft_lora_conversion_utils.py"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"6935b2b8f0baae09b631f82cfa405bf737dc5a0f88a3a68f5fada9530c74bfac"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): invokeai/app/invocations/wan/wan_denoise.py:691-712 | invokeai/app/invocations/wan/wan_video_denoise.py:352-373 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/wan/wan_denoise.py\u0060 and \u0060invokeai/app/invocations/wan/wan_video_denoise.py\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 150 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/invocations/wan/wan_video_denoise.py:347\u0060 calls \u0060expand\u0060 and \u0060invokeai/app/invocations/wan/wan_denoise.py:689\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/wan/wan_denoise.py"},"region":{"startLine":691}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c18e0cfc4fd7245018546aab9029140e8a934e3020c0d33414c89ca5b19fb90"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): invokeai/app/services/shared/database/queries/images.py:364-385 | invokeai/app/services/shared/database/queries/images.py:407-428 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/shared/database/queries/images.py:364\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/queries/images.py"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"3382c9fa6b6ef8d57ea268d1fb7ff0ac1c6a655c330d5aa414171cc7fb0b6c4e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): invokeai/app/util/user_management.py:521-542 | invokeai/app/util/user_management.py:578-599 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/user_management.py"},"region":{"startLine":521}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c46db560eec13de281fc06b8abc1c0ac1a24a58ea0ac7aadff60e7db7e317a2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201322 lines \u00D7 2): invokeai/backend/flux/denoise.py:245-266 | invokeai/backend/flux2/denoise.py:212-228 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/denoise.py"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"8145b770b6e75df467aeccb3e3e04052865a008adf25c5435926ceb79a8afdf6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20\u201322 lines \u00D7 2): invokeai/backend/flux/extensions/instantx_controlnet_extension.py:60-81 | invokeai/backend/flux/extensions/instantx_controlnet_extension.py:99-118 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/extensions/instantx_controlnet_extension.py"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"f13412834e8138942724ba03a5896c0ec4c00f54bbe273a84b29431772114ada"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21\u201322 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/flux.py:1757-1777 | invokeai/backend/model_manager/load/model_loaders/flux.py:1875-1896 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/model_manager/load/model_loaders/flux.py:1754\u0060 calls \u0060get\u0060 and \u0060invokeai/backend/model_manager/load/model_loaders/flux.py:1870\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":1757}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb81b5734d60975dea4719d153868ee4a7b967a0f68c01b697b2573b03a08168"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19\u201322 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/z_image.py:1433-1454 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1639-1657 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":1433}}}],"partialFingerprints":{"codehealthFindingId/v1":"d920ff050791bdcc8f04a22d442476933a555030f3ba8c62b1425e5d71e2d4ca"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): invokeai/backend/z_image/z_image_control_adapter.py:107-128 | invokeai/backend/z_image/z_image_control_transformer.py:221-242 \u2014 before extracting anything, compare \u0060invokeai/backend/z_image/z_image_control_adapter.py\u0060 and \u0060invokeai/backend/z_image/z_image_control_transformer.py\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/z_image/z_image_control_adapter.py:107\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_adapter.py"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"50a83e236d2df68052a15585a0f94cf7d5c26357e4a0ea9540d1cdbc871fefd8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201321 lines \u00D7 3): invokeai/backend/model_manager/load/model_loaders/z_image.py:327-338 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1564-1584 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1757-1768 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"46eafe71ac92c28f763ef8755f7d2fecce5387f75a340484a5c28e216474e65a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201321 lines \u00D7 2): invokeai/app/services/external_generation/providers/alibabacloud.py:101-121 | invokeai/app/services/external_generation/providers/alibabacloud.py:147-162 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/external_generation/providers/alibabacloud.py"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"a766b0ccb7d23ba2c23400b7bc81cc0917d69b6162cab46d3f25ce27efd8b805"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20\u201321 lines \u00D7 2): invokeai/backend/flux/controlnet/state_dict_utils.py:58-77 | invokeai/backend/flux/controlnet/state_dict_utils.py:130-150 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/flux/controlnet/state_dict_utils.py:58\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/controlnet/state_dict_utils.py"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"eedd18815d545e7e0deabf58ae97cdd60c95c06a22ff5b856ee5a93ff40e7b53"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201321 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/z_image.py:1622-1642 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1809-1825 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":1622}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8c3b425e5a851f3d3b1ee56c3bb38bdbf4e77cd1a8834e7229f884760ef30a0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (3\u201321 lines \u00D7 3): invokeai/backend/wan/extensions/wan_ref_image_extension.py:49-69 | invokeai/backend/wan/extensions/wan_ref_image_extension.py:86-101 | invokeai/backend/wan/extensions/wan_ref_image_extension.py:190-192 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/wan/extensions/wan_ref_image_extension.py:49\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/wan/extensions/wan_ref_image_extension.py"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e3f9c9ce0f6e329fcc5607d496f23e883f2de6f5405ea99099d6d0ec8f18298"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 3): invokeai/app/invocations/anima/anima_denoise.py:664-683 | invokeai/app/invocations/flux2/flux2_denoise.py:423-442 | invokeai/app/invocations/z_image/z_image_denoise.py:427-446 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/anima/anima_denoise.py"},"region":{"startLine":664}}}],"partialFingerprints":{"codehealthFindingId/v1":"a02f0423fff3edca3f495eda1ef621f21b32a906cc18e63b96dae79c3d7ab76b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): invokeai/app/api/routers/utilities.py:136-155 | invokeai/app/services/fonts/fonts_parsing.py:69-88 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060record\u0060 to \u0060object\u0060 in one and \u0060Any\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/utilities.py"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"abd29fd2dd36e3dbd22594de6145032fd20d0f70b52361f1a2ecb926cbe77b60"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19\u201320 lines \u00D7 2): invokeai/app/invocations/text_encoder/flux2_klein_text_encoder.py:137-156 | invokeai/app/invocations/text_encoder/z_image_text_encoder.py:109-127 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/text_encoder/flux2_klein_text_encoder.py\u0060 and \u0060invokeai/app/invocations/text_encoder/z_image_text_encoder.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 60 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/text_encoder/flux2_klein_text_encoder.py:137\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/flux2_klein_text_encoder.py"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1086eb17091f86b75b91ead9c94328eeb648d1b5deb39c92f0fb50410fe9a78"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): invokeai/app/invocations/video_concat.py:346-365 | invokeai/app/invocations/video_frame_extract_range.py:309-328 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/video_concat.py"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"cde5f7c9009de973b8ec343918e17dd5f768ebc50aa4e7692d20b2285c1376e6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201320 lines \u00D7 2): invokeai/app/invocations/wan/wan_denoise.py:669-688 | invokeai/app/invocations/wan/wan_video_denoise.py:320-333 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/wan/wan_denoise.py\u0060 and \u0060invokeai/app/invocations/wan/wan_video_denoise.py\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 150 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/wan/wan_denoise.py"},"region":{"startLine":669}}}],"partialFingerprints":{"codehealthFindingId/v1":"c930e57c6205d4a25eede65b3be7740311bfdaf76f857a887bf9d0a9ef1a1820"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): invokeai/backend/flux2/denoise.py:147-166 | invokeai/backend/flux2/denoise.py:252-271 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux2/denoise.py"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"f10079e38a6a9405398c6d43bfc20851e819e6b308156d120e2abbb0417aaf0c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 4): invokeai/app/invocations/metadata_linked.py:640-658 | invokeai/app/invocations/metadata_linked.py:703-721 | invokeai/app/invocations/metadata_linked.py:757-775 | invokeai/app/invocations/metadata_linked.py:827-845 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/invocations/metadata_linked.py:699\u0060 calls \u0060FluxDenoiseLatentsMetaInvocation\u0060 and \u0060invokeai/app/invocations/metadata_linked.py:824\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/metadata_linked.py"},"region":{"startLine":640}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba7564e032de4060188522511d58bdbf9039d87844199763695243d3c1e8bae4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201319 lines \u00D7 2): invokeai/app/invocations/krea2/krea2_denoise.py:801-819 | invokeai/app/invocations/qwen_image_2_1/qwen_image_2_1_denoise.py:358-372 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/krea2/krea2_denoise.py:801\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/krea2/krea2_denoise.py"},"region":{"startLine":801}}}],"partialFingerprints":{"codehealthFindingId/v1":"263e0a70a248834fde5ccaca8bc03c648bc3ac28044e97fbd833ee9cf93f5288"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201319 lines \u00D7 2): invokeai/app/invocations/text_encoder/flux2_klein_text_encoder.py:118-135 | invokeai/app/invocations/text_encoder/z_image_text_encoder.py:89-107 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/text_encoder/flux2_klein_text_encoder.py\u0060 and \u0060invokeai/app/invocations/text_encoder/z_image_text_encoder.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 60 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/text_encoder/flux2_klein_text_encoder.py:118\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/invocations/text_encoder/flux2_klein_text_encoder.py:117\u0060 calls \u0060load\u0060, \u0060enter_context\u0060, \u0060model_on_device\u0060 and \u0060invokeai/app/invocations/text_encoder/z_image_text_encoder.py:89\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/flux2_klein_text_encoder.py"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc5e20a64b5fee2eb1581bdfb8b68e2f058616d05b77f3e8b428b98519059ace"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): invokeai/app/invocations/wan/wan_denoise.py:644-662 | invokeai/app/invocations/wan/wan_video_denoise.py:299-317 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/wan/wan_denoise.py\u0060 and \u0060invokeai/app/invocations/wan/wan_video_denoise.py\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 150 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/wan/wan_denoise.py:644\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/wan/wan_denoise.py"},"region":{"startLine":644}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bf7a1821bb12e3697c30ebab9cc89ec44f0a054a474e59f0b1bb4e98bd02fa7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201319 lines \u00D7 2): invokeai/app/invocations/z_image/z_image_denoise.py:757-775 | invokeai/backend/flux2/denoise.py:193-210 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/z_image/z_image_denoise.py:757\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/z_image/z_image_denoise.py"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"33c9f946a7c9a5fec3d2d7252b6ddd46be2844d440aabe6a38d45647a7c26c1b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201319 lines \u00D7 2): invokeai/app/services/image_files/image_files_disk.py:634-652 | invokeai/app/services/video_files/video_files_disk.py:286-300 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_files/image_files_disk.py"},"region":{"startLine":634}}}],"partialFingerprints":{"codehealthFindingId/v1":"34911390c5e651e4eb4ef91e1f53013a2c8c220e373a4abd7ad064a38bebe5be"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): invokeai/app/services/shared/graph.py:1703-1721 | invokeai/app/services/shared/graph.py:3044-3062 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060effects\u0060 to \u0060Iterable[Any]\u0060 in one and \u0060Iterable[Any] = ()\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1703}}}],"partialFingerprints":{"codehealthFindingId/v1":"81e8793383bc8a0531b1d114e743f7ab5390518e53788cf2404a74e1cecdbae4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201319 lines \u00D7 2): invokeai/app/services/shared/graph_nested_iterate_planner.py:265-281 | invokeai/app/services/shared/graph_nested_iterate_planner.py:311-329 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/services/shared/graph_nested_iterate_planner.py:264\u0060 calls \u0060_discard_source_executed\u0060 and \u0060invokeai/app/services/shared/graph_nested_iterate_planner.py:310\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_nested_iterate_planner.py"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c63415b628fd045c8577267150ea3b6740460f6164b14c7ea577b0bfe994677"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): invokeai/backend/flux/controlnet/state_dict_utils.py:148-166 | invokeai/backend/model_manager/load/model_loaders/flux.py:2294-2312 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/flux/controlnet/state_dict_utils.py:148\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/controlnet/state_dict_utils.py"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"79b1a88c055ccee45245c759fd8c9f4d48070a5dc8902ce52cddb24451e3e8e2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): invokeai/backend/image_util/color_conversion.py:650-668 | invokeai/backend/image_util/color_conversion.py:707-725 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/color_conversion.py"},"region":{"startLine":650}}}],"partialFingerprints":{"codehealthFindingId/v1":"249c1b2ab5abd81d7c19551d901a881e9d6ffa8b70511b6884414671f0f6bdcf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py:124-142 | invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py:123-141 \u2014 before extracting anything, compare \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py\u0060 and \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py\u0060 as WHOLE FILES: this scan already matched 10 separate duplicated blocks between them, totalling at least 161 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"3879e898951d3defa7852279ee49d32d0e949608c92953f5c4b1b8d43d828f5d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201319 lines \u00D7 2): invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py:282-298 | invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py:402-420 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b5ddb6076704c7f6e0d3d892c26dbfd70e2f3b7e462e7faa656ab30a0a7ae6d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201318 lines \u00D7 4): invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_07_01_add_workflow_call_queue_metadata.py:12-29 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_27.py:127-141 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_27.py:160-173 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_27.py:192-205 \u2014 there are 4 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_07_01_add_workflow_call_queue_metadata.py"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a4d8ab71bd05251140eea57b6091278a0eb9c2a6c5d454e3bcd9677e83c48eb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201318 lines \u00D7 4): invokeai/backend/model_manager/load/model_loaders/z_image.py:383-396 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1428-1445 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1635-1648 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1818-1831 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/model_manager/load/model_loaders/z_image.py:1632\u0060 calls \u0060info\u0060 and \u0060invokeai/backend/model_manager/load/model_loaders/z_image.py:381\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":383}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7a579190c612e058c85d4dd9fc229bbbacccfe0e2ce765d0bb64647c5bcbe39"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 4): invokeai/backend/model_manager/load/model_loaders/z_image.py:431-448 | invokeai/backend/model_manager/load/model_loaders/z_image.py:528-545 | invokeai/backend/model_manager/load/model_loaders/z_image.py:777-794 | invokeai/backend/model_manager/load/model_loaders/z_image.py:899-916 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"066cac610853957c80d0cfdb30dffc090406d25efea9abc0fd03d9258a6fe735"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201318 lines \u00D7 4): invokeai/backend/patches/lora_conversions/anima_lora_conversion_utils.py:191-206 | invokeai/backend/patches/lora_conversions/qwen_image_lora_conversion_utils.py:176-191 | invokeai/backend/patches/lora_conversions/wan_lora_conversion_utils.py:231-246 | invokeai/backend/patches/lora_conversions/z_image_lora_conversion_utils.py:237-254 \u2014 before extracting anything, compare \u0060invokeai/backend/patches/lora_conversions/qwen_image_lora_conversion_utils.py\u0060 and \u0060invokeai/backend/patches/lora_conversions/wan_lora_conversion_utils.py\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 72 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/lora_conversions/anima_lora_conversion_utils.py"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"65ecc0e4bad1aa6056af6e770138a723752de552cb9d8c5bb8f52c012cbb649e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 3): invokeai/app/invocations/anima/anima_lora_loader.py:72-89 | invokeai/app/invocations/flux2/flux2_klein_lora_loader.py:111-128 | invokeai/app/invocations/z_image/z_image_lora_loader.py:84-101 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/anima/anima_lora_loader.py\u0060 and \u0060invokeai/app/invocations/flux2/flux2_klein_lora_loader.py\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 54 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/anima/anima_lora_loader.py"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"a435664e6de712d28758e93bc60a7f97e13b6e81adea3c57888b6d566c50c983"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201318 lines \u00D7 3): invokeai/backend/model_manager/load/model_loaders/flux.py:1437-1454 | invokeai/backend/model_manager/load/model_loaders/flux.py:1762-1779 | invokeai/backend/model_manager/load/model_loaders/flux.py:1882-1898 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/model_manager/load/model_loaders/flux.py:1434\u0060 calls \u0060reject_unmarked_int8_weights\u0060 and \u0060invokeai/backend/model_manager/load/model_loaders/flux.py:1760\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":1437}}}],"partialFingerprints":{"codehealthFindingId/v1":"86ffb340c3371ef8e9ea916fa057e9ceab9055130135a7e6b12db9efebe3033f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201318 lines \u00D7 2): invokeai/app/invocations/flux2/flux2_dev_lora_loader.py:156-173 | invokeai/app/invocations/flux2/flux2_klein_lora_loader.py:175-189 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux2/flux2_dev_lora_loader.py"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"f383e311c578e17583f355e5354593c35ac1e2901c1872d08ab097e95d7296df"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201318 lines \u00D7 2): invokeai/app/invocations/vae/qwen_image_2_1_image_to_latents.py:51-68 | invokeai/app/invocations/vae/qwen_image_2_1_latents_to_image.py:37-52 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/qwen_image_2_1_image_to_latents.py"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ff1e7c0ed84bcd37863bedc6eb38a023c4abd336f0b477e4fc783f28f2af704"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): invokeai/app/services/shared/database/queries/videos.py:312-329 | invokeai/app/services/shared/database/queries/videos.py:349-366 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/shared/database/queries/videos.py:312\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/queries/videos.py"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"9faed11ca27983bfa6b76ee7d625ddc6dd42e016af7602a05395dd32e4b210cf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): invokeai/backend/flux2/denoise.py:171-188 | invokeai/backend/flux2/denoise.py:276-293 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux2/denoise.py"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9d39130b7fab970d959ae446b5cf38406036f474f4da97920f8a74f5f497f24"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201318 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/flux.py:1398-1415 | invokeai/backend/model_manager/load/model_loaders/flux.py:1742-1754 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/model_manager/load/model_loaders/flux.py:1398\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":1398}}}],"partialFingerprints":{"codehealthFindingId/v1":"d501e5e9acba7179496bb452115ff1a31e51f853fecf7975093a94dc2065e371"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): invokeai/backend/patches/lora_conversions/flux_bfl_peft_lora_conversion_utils.py:273-290 | invokeai/backend/patches/lora_conversions/flux_bfl_peft_lora_conversion_utils.py:292-309 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/lora_conversions/flux_bfl_peft_lora_conversion_utils.py"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"c919f782cbde15ca7f295f77f47ae5b27b92b9261110cfbbede7c6d279ac9eff"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201318 lines \u00D7 2): invokeai/backend/quantization/scripts/load_flux_model_bnb_llm_int8.py:61-76 | invokeai/backend/quantization/scripts/load_flux_model_bnb_nf4.py:76-93 \u2014 before extracting anything, compare \u0060invokeai/backend/quantization/scripts/load_flux_model_bnb_llm_int8.py\u0060 and \u0060invokeai/backend/quantization/scripts/load_flux_model_bnb_nf4.py\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 63 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/quantization/scripts/load_flux_model_bnb_nf4.py:76\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/scripts/load_flux_model_bnb_llm_int8.py"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ba2474438ecc11076faa0e720a45e388487dcf6b4941a7b5e1962265fa22fd0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201317 lines \u00D7 9): invokeai/app/invocations/anima/anima_denoise.py:253-266 | invokeai/app/invocations/cogview4/cogview4_denoise.py:95-110 | invokeai/app/invocations/flux/flux_denoise.py:713-729 | invokeai/app/invocations/flux2/flux2_denoise.py:680-692 | invokeai/app/invocations/krea2/krea2_denoise.py:215-225 | invokeai/app/invocations/qwen_image/qwen_image_denoise.py:134-145 | invokeai/app/invocations/sd3/sd3_denoise.py:95-110 | invokeai/app/invocations/wan/wan_denoise.py:791-801 | invokeai/app/invocations/z_image/z_image_denoise.py:166-179 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 9 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 9 times. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/anima/anima_denoise.py"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"45adb64696dfe602b9c08b45aad1576a9f68373dafb326ae5292b8c13040ad62"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 3): invokeai/app/invocations/cogview4/cogview4_denoise.py:271-287 | invokeai/app/invocations/qwen_image/qwen_image_denoise.py:440-456 | invokeai/app/invocations/sd3/sd3_denoise.py:261-277 \u2014 \u0060invokeai/app/invocations/cogview4/cogview4_denoise.py\u0060 and \u0060invokeai/app/invocations/qwen_image/qwen_image_denoise.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 3 separate duplicated blocks between them, totalling at least 43 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/cogview4/cogview4_denoise.py:271\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/cogview4/cogview4_denoise.py"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"6889397dd067086f9eca019dea2a132e7164b715b48e554476e93db819c15ecd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): invokeai/app/invocations/flux2/flux2_klein_lora_loader.py:165-181 | invokeai/app/invocations/z_image/z_image_lora_loader.py:137-153 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/flux2/flux2_klein_lora_loader.py\u0060 and \u0060invokeai/app/invocations/z_image/z_image_lora_loader.py\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 101 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux2/flux2_klein_lora_loader.py"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbe1c7dca789e7df630152e934d54233853a287aa868d0dcba6fd6cf54a033a3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201317 lines \u00D7 2): invokeai/app/invocations/vae/flux2_vae_encode.py:115-129 | invokeai/app/invocations/vae/flux_vae_encode.py:122-138 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/vae/flux2_vae_encode.py:115\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/flux2_vae_encode.py"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"abb1c6796e750480b8116c9ebea4c7255391b8ca27f5bd3f8b28adf0afbb0f12"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): invokeai/app/services/events/events_common.py:655-671 | invokeai/app/services/events/events_common.py:691-707 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/events/events_common.py"},"region":{"startLine":655}}}],"partialFingerprints":{"codehealthFindingId/v1":"8928651bc5b7be97cba19764ebd4a5b2f1e774326bd0741a25ba3381307b6b7a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): invokeai/backend/hidiffusion/hidiffusion.py:542-558 | invokeai/backend/hidiffusion/hidiffusion.py:578-594 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/hidiffusion/hidiffusion.py"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"7805f922e5535582fbf22c0ec2c9d41370be24900026a88944c51f3394656e10"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): invokeai/backend/minimax_h3/contiguous_attention.py:59-75 | invokeai/backend/minimax_h3/transformer_minimax_h3.py:170-186 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/backend/minimax_h3/contiguous_attention.py:80\u0060 calls \u0060_head_major_contiguous\u0060 and \u0060invokeai/backend/minimax_h3/transformer_minimax_h3.py:192\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/minimax_h3/contiguous_attention.py"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"e82f3b9f3d6c4add952c43161144d38e101874a6af65727c295c6ea4d824b3be"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201317 lines \u00D7 2): invokeai/backend/util/vae_working_memory.py:424-440 | invokeai/backend/util/vae_working_memory.py:553-564 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/vae_working_memory.py"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf61cdd4a0e44d6d6caa391985e29fa33829cf3997b6e7ddf540ea2a9773b8bd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201317 lines \u00D7 2): scripts/calibrate_flux2_working_memory.py:147-163 | scripts/calibrate_z_image_working_memory.py:100-112 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/calibrate_flux2_working_memory.py"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"42f3cda8ee3a8259c5d7ff8acac188424c503f0e49c8ff6c5fdbdb216bdc2fce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 3): invokeai/app/invocations/anima/anima_lora_loader.py:134-149 | invokeai/app/invocations/flux2/flux2_klein_lora_loader.py:165-180 | invokeai/app/invocations/z_image/z_image_lora_loader.py:137-152 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/anima/anima_lora_loader.py\u0060 and \u0060invokeai/app/invocations/flux2/flux2_klein_lora_loader.py\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 54 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/anima/anima_lora_loader.py"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"904b5a0022397724a0da470d9eee1109a95b197811b8487840e7b340e01ce395"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): invokeai/app/invocations/cogview4/cogview4_denoise.py:338-353 | invokeai/app/invocations/sd3/sd3_denoise.py:315-330 \u2014 \u0060invokeai/app/invocations/cogview4/cogview4_denoise.py\u0060 and \u0060invokeai/app/invocations/sd3/sd3_denoise.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 8 separate duplicated blocks between them, totalling at least 153 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/cogview4/cogview4_denoise.py"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"49426f112285e463d24362c367b9ff365e4b1f098e34455c1095d2e0b3b077a6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201316 lines \u00D7 2): invokeai/app/invocations/composition-nodes.py:123-136 | invokeai/app/invocations/composition-nodes.py:220-235 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/composition-nodes.py"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b29e956d6e9b8bb21d833145894423967b2cad39411a52396eabf83b5c79af6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): invokeai/app/invocations/flux/flux_denoise.py:228-243 | invokeai/app/invocations/flux2/flux2_denoise.py:322-337 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/invocations/flux2/flux2_denoise.py:318\u0060 calls \u0060_get_bn_stats\u0060 and \u0060invokeai/app/invocations/flux/flux_denoise.py:225\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux/flux_denoise.py"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0b6e63ddd67c988d851274ab7eb2aa4b9badbb9eaf6d1bb118cb82dafcb5e84"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): invokeai/app/invocations/pid/flux_pid_decode.py:152-167 | invokeai/app/invocations/pid/pid_upscale.py:192-207 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/pid/flux_pid_decode.py\u0060 and \u0060invokeai/app/invocations/pid/pid_upscale.py\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 65 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/pid/flux_pid_decode.py"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"21a54f9d4e7b1045f2eb63f6375a0662cacae5ba5055a79049786445d0092b19"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): invokeai/app/invocations/vae/cogview4_image_to_latents.py:44-59 | invokeai/app/invocations/vae/sd3_image_to_latents.py:40-55 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/vae/cogview4_image_to_latents.py:44\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/cogview4_image_to_latents.py"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"476240c806b42efb2a44eb972d5de78b5d3e0c61f048486fc96bd8828c1249bc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): invokeai/app/services/download/download_default.py:434-449 | invokeai/app/services/download/download_default.py:452-467 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/download/download_default.py"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"18d39aec4e54d409146bf9ad46b1f67f473d5fd2381a851f01314e7e059ae676"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201316 lines \u00D7 2): invokeai/app/services/external_generation/providers/openai.py:48-63 | invokeai/app/services/external_generation/providers/openai.py:94-108 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/app/services/external_generation/providers/openai.py:109\u0060 calls \u0060get\u0060 and \u0060invokeai/app/services/external_generation/providers/openai.py:64\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/external_generation/providers/openai.py"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"57ab8b0a613059dd06b2337a8ea9f13f2e4e27e3d1a7f5f92e0906b90fd53580"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201316 lines \u00D7 2): invokeai/app/services/images/images_default.py:107-122 | invokeai/app/services/videos/videos_default.py:92-105 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/images/images_default.py:107\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/images/images_default.py"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"0116e97f07bf018823ff2c94af6094d73646c09f9b81072cd8de2182089c784f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py:92-107 | invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py:91-106 \u2014 before extracting anything, compare \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py\u0060 and \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py\u0060 as WHOLE FILES: this scan already matched 10 separate duplicated blocks between them, totalling at least 161 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"56d9fac39f9566fb517435782ad6cf6a92b0cc64684ca7df1e13b2b128dfdddc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201316 lines \u00D7 2): invokeai/backend/minimax_h3/transformer_minimax_h3.py:581-596 | invokeai/backend/minimax_h3/transformer_minimax_h3_pruned.py:191-203 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/minimax_h3/transformer_minimax_h3.py"},"region":{"startLine":581}}}],"partialFingerprints":{"codehealthFindingId/v1":"c972e2fe21092244429c8c98fb8913174c44fcee518310e19b44ef0a885a988d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201316 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/flux.py:2215-2229 | invokeai/backend/model_manager/load/model_loaders/flux.py:2281-2296 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/model_manager/load/model_loaders/flux.py:2215\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":2215}}}],"partialFingerprints":{"codehealthFindingId/v1":"19db3e7391e8dacdcf89b8ffb11b9bfb714fdf809ad786b248146ab4d1a37919"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201316 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/z_image.py:1532-1547 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1739-1751 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/model_manager/load/model_loaders/z_image.py:1532\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":1532}}}],"partialFingerprints":{"codehealthFindingId/v1":"6530ba5423d2f1104eab9f78a9d195bc1eace521c1d5c6926c5678cca54db833"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): invokeai/backend/pid/_src/networks/pixeldit_official.py:1039-1054 | invokeai/backend/pid/_src/networks/pixeldit_official.py:1113-1128 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pixeldit_official.py"},"region":{"startLine":1039}}}],"partialFingerprints":{"codehealthFindingId/v1":"1925cfa97b40071dd1e6e0194bd52007a2e0aecc7b913dbed1cbd68322a46d18"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201316 lines \u00D7 2): invokeai/backend/quantization/scripts/load_flux_model_bnb_llm_int8.py:45-58 | invokeai/backend/quantization/scripts/load_flux_model_bnb_nf4.py:58-73 \u2014 before extracting anything, compare \u0060invokeai/backend/quantization/scripts/load_flux_model_bnb_llm_int8.py\u0060 and \u0060invokeai/backend/quantization/scripts/load_flux_model_bnb_nf4.py\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 63 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/quantization/scripts/load_flux_model_bnb_nf4.py:58\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/scripts/load_flux_model_bnb_llm_int8.py"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"acb4246a1562e641a3719a3df71ae456482119e18a81faa73dd2bceaaca2d9ff"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 4): invokeai/app/api/dependencies.py:262-276 | invokeai/app/services/image_records/image_records_common.py:201-215 | invokeai/backend/pid/_src/networks/pid_net.py:114-128 | invokeai/backend/z_image/z_image_control_transformer.py:158-172 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 4 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 4 times. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/api/dependencies.py:262\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/dependencies.py"},"region":{"startLine":262}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3f044fcd53b0523b105d27239541940e993f945f5efc1f86fcf224415eb69bd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 4): invokeai/backend/model_manager/load/model_loaders/z_image.py:306-320 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1255-1269 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1527-1541 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1734-1748 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/backend/model_manager/load/model_loaders/z_image.py:1752\u0060 calls \u0060ValueError\u0060 and \u0060invokeai/backend/model_manager/load/model_loaders/z_image.py:323\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"5da607d18476345b1f684226912c5949e5daa94bee0adc972df8aeac04c23858"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 3): invokeai/app/invocations/text_encoder/cogview4_text_encoder.py:75-88 | invokeai/app/invocations/text_encoder/sd3_text_encoder.py:124-137 | invokeai/app/invocations/text_encoder/sd3_text_encoder.py:189-203 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/text_encoder/cogview4_text_encoder.py:75\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/cogview4_text_encoder.py"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fc07eeb2efeb1c306766503ec45a6780f396a3baabb8cd2a5994536f7add4f3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 2): invokeai/app/api/routers/style_presets.py:109-123 | invokeai/app/api/routers/style_presets.py:201-214 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/style_presets.py"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"600023653a6aca8ab7e05fd1a8c23ed35d3011af9f6a8af019a5bf627690ab51"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): invokeai/app/invocations/cogview4/cogview4_denoise.py:156-170 | invokeai/app/invocations/sd3/sd3_denoise.py:175-189 \u2014 \u0060invokeai/app/invocations/cogview4/cogview4_denoise.py\u0060 and \u0060invokeai/app/invocations/sd3/sd3_denoise.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 8 separate duplicated blocks between them, totalling at least 153 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/cogview4/cogview4_denoise.py"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"487de408b3f2c4adc301dc22d48c25053f96c6589f9fa7176e894088bf19ff52"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 2): invokeai/app/invocations/cogview4/cogview4_denoise.py:330-344 | invokeai/app/invocations/z_image/z_image_denoise.py:868-881 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/cogview4/cogview4_denoise.py:330\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/cogview4/cogview4_denoise.py"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebee2cb585fc3681b9d13683833809750ad9d962288a3aaa7917d5b38776a149"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): invokeai/app/invocations/composition-nodes.py:1426-1440 | invokeai/app/invocations/composition-nodes.py:1510-1524 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/composition-nodes.py"},"region":{"startLine":1426}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc9f3002d6102e4da05fb2bad8cfb85fc0da16f37f58f9c09acb023fb677c776"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201315 lines \u00D7 2): invokeai/app/invocations/ltx2/ltx2_lora_loader.py:88-102 | invokeai/app/invocations/ltx2/ltx2_lora_loader.py:153-164 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/ltx2/ltx2_lora_loader.py"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdbf0d54e5e858178698a748d0eee571c83efc81618ac2f3b934b3d92728a342"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201315 lines \u00D7 2): invokeai/app/invocations/minimax_h3/minimax_h3_lora_loader.py:81-95 | invokeai/app/invocations/minimax_h3/minimax_h3_lora_loader.py:146-157 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/minimax_h3/minimax_h3_lora_loader.py"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"0967a951b72ec4410f0012e6b2030744a9593670e0c24e04466547201cfecaa8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): invokeai/app/invocations/vae/anima_image_to_latents.py:127-141 | invokeai/app/invocations/vae/z_image_image_to_latents.py:108-122 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/vae/anima_image_to_latents.py\u0060 and \u0060invokeai/app/invocations/vae/z_image_image_to_latents.py\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 36 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/anima_image_to_latents.py"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a150c8c1cef9cb7c1416e2bac54cf9e07bbb613231685564e7bffc8e2ca406a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): invokeai/app/services/gallery/gallery_default.py:141-155 | invokeai/app/services/gallery/gallery_default.py:176-190 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/gallery/gallery_default.py"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d51e37d8a7af957e9d1e1a2d32fe014c0bd3eaafbe7c0396556487071a0912b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): invokeai/app/services/image_records/image_records_default.py:159-173 | invokeai/app/services/video_records/video_records_default.py:134-148 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/image_records/image_records_default.py:159\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_records/image_records_default.py"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"610b2103cbca126711aa9e12c4f10f68744cd87bba293415c5815bf9dfb86d49"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): invokeai/app/services/model_install/model_install_default.py:1115-1129 | invokeai/app/services/model_install/model_install_default.py:1131-1145 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":1115}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ca68f993a14e65a9ae840f4889c39430868b7e6a0c429d69c65e106cb5f9fa0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 2): invokeai/app/services/shared/graph_materializer.py:984-998 | invokeai/app/services/shared/graph_materializer.py:1092-1105 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/shared/graph_materializer.py:984\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":984}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a0f125a1d588b286ec9ed9cc84d185bb0491c5090ccdeb0c80b5b10e0dbbdc5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): invokeai/app/services/shared/sqlite_migrator/migrations/migration_24.py:136-150 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_24.py:158-172 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/shared/sqlite_migrator/migrations/migration_24.py:136\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_24.py"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"5828cc01926d080f166a0322a1f3322d85fa2a13a5278bbdffc7f10f8715ab48"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 2): invokeai/backend/flux/denoise.py:224-237 | invokeai/backend/flux2/denoise.py:192-206 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/denoise.py"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"3856fd39236db3b8d9e41fea9406102dcbe5aae918cd652d83ce2359e9d1d863"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): invokeai/backend/hidiffusion/hidiffusion.py:526-540 | invokeai/backend/hidiffusion/hidiffusion.py:562-576 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/hidiffusion/hidiffusion.py"},"region":{"startLine":526}}}],"partialFingerprints":{"codehealthFindingId/v1":"152f2dd6318d4e79f4dd314935b9800dea8e544b5df0a9e32c9195ba10d8152f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201315 lines \u00D7 2): invokeai/backend/hidiffusion/hidiffusion.py:2151-2162 | invokeai/backend/hidiffusion/hidiffusion.py:2206-2220 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/hidiffusion/hidiffusion.py"},"region":{"startLine":2151}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0606b58b37e6bb74dcb693bd660c6e7dbc2761f36f2652741b0771748bec86e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): invokeai/backend/minimax_h3/packing.py:539-553 | invokeai/backend/minimax_h3/packing.py:695-709 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/minimax_h3/packing.py:539\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/minimax_h3/packing.py"},"region":{"startLine":539}}}],"partialFingerprints":{"codehealthFindingId/v1":"27cb0780f60517e6180018e64cd0c4c66236740654222d81d78d901b025a3593"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201315 lines \u00D7 2): invokeai/backend/minimax_h3/rocm_causal_conv3d.py:50-61 | invokeai/backend/wan/rocm_causal_conv3d.py:41-55 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/minimax_h3/rocm_causal_conv3d.py"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"93c530c91d19b005ce31419569f0b3be459ccdce43df966c441b3943adf216bd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): invokeai/backend/model_manager/load/model_cache/cached_model/cached_model_only_full_load.py:113-127 | invokeai/backend/model_manager/load/model_cache/cached_model/cached_model_with_partial_load.py:227-241 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/cached_model/cached_model_only_full_load.py"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c3331f530319ae70719075a5444914aaa457c0e7cfdedea9fbaa599618d5146"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/flux.py:1897-1911 | invokeai/backend/model_manager/load/model_loaders/flux.py:1912-1926 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":1897}}}],"partialFingerprints":{"codehealthFindingId/v1":"404f3386b75bdb1a038e391234019e21cfd371cd57a1ab85adb0bc2bbbf2b6f1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/krea2.py:731-745 | invokeai/backend/model_manager/load/model_loaders/z_image.py:967-985 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/krea2.py"},"region":{"startLine":731}}}],"partialFingerprints":{"codehealthFindingId/v1":"df605e14a97f224417db6168f14c1216974a3dd54754e3447890c9b41942c29f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u201315 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/qwen_image.py:223-230 | invokeai/backend/model_manager/load/model_loaders/z_image.py:756-770 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/qwen_image.py"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"74f034a2869a2ffd5235ac3b091e603b4684332047e9a8490e2f5dd396f2f7ad"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3): invokeai/app/api/routers/gallery.py:73-86 | invokeai/app/api/routers/gallery.py:128-141 | invokeai/app/api/routers/gallery.py:256-269 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/api/routers/gallery.py:73\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/app/api/routers/gallery.py:143\u0060 calls \u0060HTTPException\u0060 and \u0060invokeai/app/api/routers/gallery.py:89\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/gallery.py"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d5e7e2c443409e26fdc260b4462622e7c5116ced1040615481054c2eba30dca"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 3): invokeai/app/invocations/cogview4/cogview4_denoise.py:334-347 | invokeai/app/invocations/sd3/sd3_denoise.py:312-324 | invokeai/app/invocations/z_image/z_image_denoise.py:872-884 \u2014 \u0060invokeai/app/invocations/cogview4/cogview4_denoise.py\u0060 and \u0060invokeai/app/invocations/sd3/sd3_denoise.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 8 separate duplicated blocks between them, totalling at least 153 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/cogview4/cogview4_denoise.py:334\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/cogview4/cogview4_denoise.py"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"10b552c1508fc1ff8e61d3f51904f2012861db81deeeeed35ddbc7063469c1e2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 3): invokeai/app/invocations/flux/flux_lora_loader.py:84-96 | invokeai/app/invocations/model.py:464-477 | invokeai/app/invocations/model.py:627-640 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/flux/flux_lora_loader.py:84\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux/flux_lora_loader.py"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"f56c9fca84b63b98326f95f9c084ea2127e46f4b2104f9d08b060991dc4fcd70"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3): invokeai/app/invocations/pid/flux2_pid_decode.py:233-246 | invokeai/app/invocations/pid/qwen_image_pid_decode.py:222-235 | invokeai/app/invocations/pid/sdxl_pid_decode.py:195-208 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/pid/flux2_pid_decode.py\u0060 and \u0060invokeai/app/invocations/pid/qwen_image_pid_decode.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 80 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/pid/flux2_pid_decode.py"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"89f5f7c01fb646fc7fb5d916ff2cd50f6c216113513134d24739dd7a695d142a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201314 lines \u00D7 3): invokeai/backend/model_manager/configs/main.py:673-686 | invokeai/backend/model_manager/configs/main.py:860-873 | invokeai/backend/model_manager/configs/main.py:3247-3258 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":673}}}],"partialFingerprints":{"codehealthFindingId/v1":"272c9792409f9fedd6b8df38ec3aeba8db6aa3847e39d6df5bc44748f21cafd5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201314 lines \u00D7 3): invokeai/backend/model_manager/load/model_loaders/flux.py:1394-1407 | invokeai/backend/model_manager/load/model_loaders/flux.py:1739-1747 | invokeai/backend/model_manager/load/model_loaders/flux.py:1837-1850 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/model_manager/load/model_loaders/flux.py:1394\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/backend/model_manager/load/model_loaders/flux.py:1851\u0060 calls \u0060hasattr\u0060 and \u0060invokeai/backend/model_manager/load/model_loaders/flux.py:1408\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":1394}}}],"partialFingerprints":{"codehealthFindingId/v1":"67894206dc9c802436423d43b2c8ed53122e6140f0a48d0177910c3ae71936be"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): invokeai/app/invocations/pid/flux_pid_decode.py:156-169 | invokeai/app/invocations/pid/sd3_pid_decode.py:145-158 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/pid/flux_pid_decode.py\u0060 and \u0060invokeai/app/invocations/pid/sd3_pid_decode.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 80 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/pid/flux_pid_decode.py"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"e92f45596c4be931bb0a5e5adc14e7326761050642445a4c11a3af576d82fb3f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): invokeai/app/invocations/vae/cogview4_image_to_latents.py:63-76 | invokeai/app/invocations/vae/sd3_image_to_latents.py:59-72 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/cogview4_image_to_latents.py"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"51a701a157d04e78aabe28def15aa9ccb10fa2bb2784aec56220fae8e9293cf7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201314 lines \u00D7 2): invokeai/app/invocations/vae/wan_latents_to_image.py:53-66 | invokeai/app/invocations/wan/wan_denoise.py:517-527 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/vae/wan_latents_to_image.py:53\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/wan_latents_to_image.py"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"60f71029fd92ac8a68f19dd05193c498fb5b1736e80cfbcd82c7eb567cdcc402"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): invokeai/app/services/external_generation/providers/openai.py:121-133 | invokeai/app/services/external_generation/providers/seedream.py:103-116 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/external_generation/providers/openai.py"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fae5221738d6f02fe8855fffb22e3f421dcf9c72fcdd962a0e5e2b5723ca9c5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): invokeai/app/services/model_install/model_install_default.py:1351-1364 | invokeai/app/services/model_install/model_install_default.py:1386-1399 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/model_install/model_install_default.py:1351\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":1351}}}],"partialFingerprints":{"codehealthFindingId/v1":"1eead9a2d589af03702e7fb400fb0fec277969c9480d741a778e5bff45f7e3d4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): invokeai/app/services/shared/graph_nested_iterate_planner.py:177-190 | invokeai/app/services/shared/graph_nested_iterate_planner.py:348-361 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/services/shared/graph_nested_iterate_planner.py:176\u0060 calls \u0060_get_input_edges\u0060 and \u0060invokeai/app/services/shared/graph_nested_iterate_planner.py:347\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_nested_iterate_planner.py"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"943af59268271d4b13460831e1357699c29d8ffe0cd7faf358ad2202331e65c7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): invokeai/backend/minimax_h3/contiguous_attention.py:89-102 | invokeai/backend/minimax_h3/transformer_minimax_h3.py:192-205 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/minimax_h3/contiguous_attention.py:80\u0060 calls \u0060_head_major_contiguous\u0060 and \u0060invokeai/backend/minimax_h3/transformer_minimax_h3.py:186\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/minimax_h3/contiguous_attention.py"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c91fff4659a65fcc93ff4f8357efe37873ece094f143eb21fea0d4ed2094028"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): invokeai/backend/model_manager/configs/main.py:3571-3584 | invokeai/backend/model_manager/configs/main.py:3725-3738 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":3571}}}],"partialFingerprints":{"codehealthFindingId/v1":"84b66772d633d297ff22627b17428da84a8d1229a0ec0745baa1dea9de7481c1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201314 lines \u00D7 2): invokeai/backend/patches/lora_conversions/flux_bfl_peft_lora_conversion_utils.py:154-167 | invokeai/backend/patches/lora_conversions/flux_onetrainer_bfl_lora_conversion_utils.py:81-92 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/lora_conversions/flux_bfl_peft_lora_conversion_utils.py"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d649efd0baef27ecc55e1f32e06f2123da936256de30628467f80ccc84e15ff"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): invokeai/backend/pid/_src/networks/pid_net.py:378-391 | invokeai/backend/pid/_src/networks/pid_net.py:414-427 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/pid/_src/networks/pid_net.py:378\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pid_net.py"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa90323c92cbb184264932fba4ff332378cf07605a5b7342f66f51c8409f2b37"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u201314 lines \u00D7 2): invokeai/backend/pid/_src/networks/pid_net.py:442-455 | invokeai/backend/pid/_src/networks/pixeldit_official.py:1511-1518 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/pid/_src/networks/pid_net.py:437\u0060 calls \u0060_unpatchify_features\u0060 and \u0060invokeai/backend/pid/_src/networks/pixeldit_official.py:1508\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pid_net.py"},"region":{"startLine":442}}}],"partialFingerprints":{"codehealthFindingId/v1":"343b7bf6520233e89856a67d032714eac1f297a690d151ca13935b5915c7b092"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201314 lines \u00D7 2): invokeai/backend/quantization/gguf/ggml_tensor.py:41-54 | invokeai/backend/quantization/sdnq/sdnq_tensor.py:59-70 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/quantization/sdnq/sdnq_tensor.py:57\u0060 calls \u0060isinstance\u0060, \u0060process_tensor\u0060 and \u0060invokeai/backend/quantization/gguf/ggml_tensor.py:40\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/gguf/ggml_tensor.py"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"5be80a64d58a621052dcb0fe897a03e0c5c99462d4deefcee6d42e137e0972d6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): invokeai/backend/z_image/z_image_control_transformer.py:390-403 | invokeai/backend/z_image/z_image_control_transformer.py:522-535 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_transformer.py"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"42a1d1dfd8b6b83a38fbfc4edf35b8e5aa118b01d16507de67f697a26dd7512c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): invokeai/backend/z_image/z_image_control_transformer.py:482-495 | invokeai/backend/z_image/z_image_controlnet_extension.py:263-277 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/z_image/z_image_control_transformer.py:480\u0060 calls \u0060super\u0060, \u0060forward\u0060 and \u0060invokeai/backend/z_image/z_image_controlnet_extension.py:261\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_transformer.py"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"68304c42dc16c7363518ba78d6e7b408b9fc8cd2449a560d82f05a5c8fc82b55"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 4): invokeai/app/services/events/events_common.py:143-155 | invokeai/app/services/events/events_common.py:212-224 | invokeai/app/services/events/events_common.py:245-257 | invokeai/app/services/events/events_common.py:281-293 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/events/events_common.py:143\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/events/events_common.py"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"b68c1a26c50098560f8c17724079100bc8cfcabc1be57373b7ff4c1de9c674bd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 3): invokeai/app/invocations/composition-nodes.py:93-105 | invokeai/app/invocations/composition-nodes.py:1428-1439 | invokeai/app/invocations/composition-nodes.py:1512-1523 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/composition-nodes.py"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"643a91f818ff84c5e4bfd1962605035ebda3ce3c594272ebfc063e6e849ffdb5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 3): invokeai/app/invocations/pid/flux2_pid_decode.py:153-164 | invokeai/app/invocations/pid/sdxl_pid_decode.py:119-130 | invokeai/app/invocations/pid/z_image_pid_decode.py:114-126 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/pid/flux2_pid_decode.py\u0060 and \u0060invokeai/app/invocations/pid/sdxl_pid_decode.py\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 93 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/pid/flux2_pid_decode.py"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"6eeda4aa4adf2fc88f0fc84de8817e4128e4cb91d65b600fcbdc866c8a262dc0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3): invokeai/app/invocations/z_image/z_image_denoise.py:757-770 | invokeai/backend/flux/denoise.py:225-237 | invokeai/backend/flux2/denoise.py:193-206 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/z_image/z_image_denoise.py:757\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/z_image/z_image_denoise.py"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"44632da9762e92196696cb4117540fdee2e0b68016770a5413363349605b41ae"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 3): invokeai/backend/model_manager/load/model_loaders/flux.py:999-1010 | invokeai/backend/model_manager/load/model_loaders/flux.py:1535-1546 | invokeai/backend/model_manager/load/model_loaders/z_image.py:702-714 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/model_manager/load/model_loaders/z_image.py:702\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":999}}}],"partialFingerprints":{"codehealthFindingId/v1":"c26f641f2310a1c9f1737d2e70a0799e80b172a5a637e24eae095b7462b181eb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201313 lines \u00D7 2): invokeai/app/api/routers/image_map.py:498-508 | invokeai/app/api/routers/image_map.py:1002-1014 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/image_map.py"},"region":{"startLine":498}}}],"partialFingerprints":{"codehealthFindingId/v1":"4aba917b020b0676480018a115e7e4a8c9f41793db7fcccae41faea5c435e421"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 2): invokeai/app/invocations/anima/anima_denoise.py:638-649 | invokeai/app/invocations/z_image/z_image_denoise.py:403-415 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/app/invocations/anima/anima_denoise.py:652\u0060 calls \u0060unsqueeze\u0060 and \u0060invokeai/app/invocations/z_image/z_image_denoise.py:419\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/anima/anima_denoise.py"},"region":{"startLine":638}}}],"partialFingerprints":{"codehealthFindingId/v1":"bde63fa45f5bd7af84f1196289eae4ee551f943a31da86646377f4863bfee1c7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): invokeai/app/invocations/flux2/flux2_klein_lora_loader.py:197-209 | invokeai/app/invocations/z_image/z_image_lora_loader.py:166-178 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/flux2/flux2_klein_lora_loader.py\u0060 and \u0060invokeai/app/invocations/z_image/z_image_lora_loader.py\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 101 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux2/flux2_klein_lora_loader.py"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"01449d2d8f4c2854a7a45b99a3730ed26e445528d98032b9d51fa79cdcb2971b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201313 lines \u00D7 2): invokeai/app/invocations/ltx2/ltx2_extend_conditioning.py:244-256 | invokeai/app/invocations/ltx2/ltx2_video_conditioning.py:117-126 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/ltx2/ltx2_extend_conditioning.py:244\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/ltx2/ltx2_extend_conditioning.py"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bd17ac429ec46bdad6641e55cb89e05031a2b8cd87bcd799f0178fe9b3c63bd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): invokeai/app/invocations/metadata_linked.py:536-548 | invokeai/app/invocations/metadata_linked.py:592-604 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/metadata_linked.py"},"region":{"startLine":536}}}],"partialFingerprints":{"codehealthFindingId/v1":"edaa5606925017571c985e33e389a7cada7860da19f4ba1d1a266b7a9a917ba2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): invokeai/app/invocations/qwen_image/qwen_image_model_loader.py:121-133 | invokeai/app/invocations/wan/wan_model_loader.py:280-292 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/qwen_image/qwen_image_model_loader.py:121\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/qwen_image/qwen_image_model_loader.py"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"1597917018eb46fcf1a38dc7cb3c87afea5820cf928b2c427e408b0cc59ff5f5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): invokeai/app/invocations/sd/denoise_latents.py:286-298 | invokeai/backend/stable_diffusion/extensions/ip_adapter.py:141-153 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/denoise_latents.py"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"24b92b0ffbb7a03ed7236046b5cdd094e09a04cd0aa388a0d4a3cac7aab1a395"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): invokeai/app/services/shared/graph_materializer.py:649-661 | invokeai/app/services/shared/graph_materializer.py:755-767 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/services/shared/graph_materializer.py:647\u0060 calls \u0060RuntimeError\u0060 and \u0060invokeai/app/services/shared/graph_materializer.py:754\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"57cb7edecc4b208d3d9f03bc1385183cbdd0bdf2ce93c940032e92fee56db515"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): invokeai/backend/flux/denoise.py:154-166 | invokeai/backend/flux/denoise.py:192-204 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/flux/denoise.py:154\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/denoise.py"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff1eb9c870c365f937cfe396a6274d992f246f8c28c8f2e6edada6fe1a20d72c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201313 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/krea2.py:213-225 | invokeai/backend/model_manager/load/model_loaders/krea2.py:226-236 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/model_manager/load/model_loaders/krea2.py:226\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/model_manager/load/model_loaders/krea2.py:226\u0060 calls \u0060startswith\u0060 and \u0060invokeai/backend/model_manager/load/model_loaders/krea2.py:213\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/krea2.py"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b1254875b05e6d02443cb9fb558977843c23f8d86fdb42a699e0efaea13060a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): invokeai/backend/quantization/scripts/load_flux_model_bnb_llm_int8.py:49-61 | invokeai/backend/quantization/scripts/quantize_t5_xxl_bnb_llm_int8.py:55-67 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/scripts/load_flux_model_bnb_llm_int8.py"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a92a615594e0e1578fb256abd465ed72e9b546ce40c003b8b6fba402c7de099"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 5): invokeai/backend/model_manager/configs/base.py:242-253 | invokeai/backend/model_manager/configs/main.py:3554-3565 | invokeai/backend/model_manager/configs/main.py:3708-3719 | invokeai/backend/model_manager/configs/main.py:3873-3884 | invokeai/backend/model_manager/model_on_disk.py:156-167 \u2014 there are 5 copies across 3 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 5 sites; resolving a subset leaves the remainder to drift apart. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/base.py"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7d53f664d3c19edd9def18286035a92cba6445f8ee4af91989a6dee79fbf03e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 3): invokeai/app/invocations/anima/anima_lora_loader.py:155-166 | invokeai/app/invocations/flux2/flux2_klein_lora_loader.py:202-212 | invokeai/app/invocations/z_image/z_image_lora_loader.py:171-181 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/anima/anima_lora_loader.py\u0060 and \u0060invokeai/app/invocations/flux2/flux2_klein_lora_loader.py\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 54 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/anima/anima_lora_loader.py:155\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/anima/anima_lora_loader.py"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"64ef655860dd6f96271072c49adb774780c3d635b8a29afa126781163885e12b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): invokeai/app/services/model_install/model_install_default.py:649-660 | invokeai/app/services/model_install/model_install_default.py:1346-1357 | invokeai/app/services/model_install/model_install_default.py:1381-1392 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/model_install/model_install_default.py:649\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"63870e1e7574d94dab47851f7a35c1ff7b180d1a63b82b54d4fe00aeb39b111e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): invokeai/backend/z_image/z_image_control_transformer.py:388-399 | invokeai/backend/z_image/z_image_control_transformer.py:520-531 | invokeai/backend/z_image/z_image_control_transformer.py:559-570 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/z_image/z_image_control_transformer.py:388\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_transformer.py"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2b207ff498ba40dde87fd22096b06bde0416c0e1b4a57b9cbe257785d0ce295"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): invokeai/app/api/routers/image_map.py:643-654 | invokeai/app/api/routers/image_map.py:869-879 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/api/routers/image_map.py:643\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/image_map.py"},"region":{"startLine":643}}}],"partialFingerprints":{"codehealthFindingId/v1":"6873e88a31b0187c0aba2a71e7b75477919269b26733ca75013a6f22dcbeb979"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/app/api/routers/images.py:553-564 | invokeai/app/api/routers/images.py:991-1002 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/api/routers/images.py:553\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/images.py"},"region":{"startLine":553}}}],"partialFingerprints":{"codehealthFindingId/v1":"35dcb0fdcb09badfbfeffc91a10263821a28ea8aa6b92368caa49843f18a7177"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/app/invocations/cogview4/cogview4_denoise.py:142-153 | invokeai/app/invocations/sd3/sd3_denoise.py:161-172 \u2014 \u0060invokeai/app/invocations/cogview4/cogview4_denoise.py\u0060 and \u0060invokeai/app/invocations/sd3/sd3_denoise.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 8 separate duplicated blocks between them, totalling at least 153 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/cogview4/cogview4_denoise.py"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e120e35d4e39819da2d6f2384ec25b154dcec947ad7b16d5f2b71ce55af220c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/app/invocations/image.py:1013-1024 | invokeai/app/invocations/image.py:1078-1089 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/image.py"},"region":{"startLine":1013}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ba37623052173e2bdc20968dfa0572fed9eb59064073087e06eecacb37fcf1c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/app/invocations/qwen_image/qwen_image_denoise.py:174-185 | invokeai/app/invocations/z_image/z_image_denoise.py:245-256 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/qwen_image/qwen_image_denoise.py"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed7fd78f091fa30c05df74126d410c040c3f28e0430ef62d8434f4d7a98879db"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/app/invocations/text_encoder/anima_text_encoder.py:128-145 | invokeai/app/invocations/text_encoder/z_image_text_encoder.py:71-82 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/text_encoder/anima_text_encoder.py:128\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/anima_text_encoder.py"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c0f3a63f6edaef10b31b6999a6ebc4893f4702e1be5466608b338cfd03871a8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): invokeai/app/invocations/text_encoder/flux2_klein_text_encoder.py:87-98 | invokeai/app/invocations/text_encoder/flux_text_encoder.py:67-77 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/flux2_klein_text_encoder.py"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"63b38c0c7b3d04ba2e4bcc60d674acb4712a3a9fa967af588e345afa98ecff24"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): invokeai/app/invocations/vae/flux2_vae_encode.py:102-113 | invokeai/app/invocations/vae/flux_vae_encode.py:110-120 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/flux2_vae_encode.py"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"15d428e58e4f56f8816bcd2a76435137696d32efd34f1081bc7ad5507b145b84"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/app/invocations/vae/ltx2_latents_to_video.py:310-321 | invokeai/app/invocations/vae/minimax_h3_latents_to_video.py:259-270 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/ltx2_latents_to_video.py"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf44618cbe28791c14d37919220be9d1f35033b1f4b7a9a57d5bfa90e3d83d8b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/app/services/model_install/model_install_default.py:2276-2287 | invokeai/app/services/model_install/model_install_default.py:2296-2307 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":2276}}}],"partialFingerprints":{"codehealthFindingId/v1":"b104fedf74c99e97b3344937421f1689aae41a14f519068e9f1b828fadeb779a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): invokeai/app/services/shared/graph_if_dependencies.py:42-53 | invokeai/app/services/shared/graph_if_dependencies.py:116-126 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/app/services/shared/graph_if_dependencies.py:127\u0060 calls \u0060_get_input_edges\u0060 and \u0060invokeai/app/services/shared/graph_if_dependencies.py:55\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_if_dependencies.py"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"75140d44114b0104299f60b71597adab2fcbce1e4d31f5c561a09e4ebf1dc02d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/app/services/shared/graph_materializer.py:502-513 | invokeai/app/services/shared/graph_materializer.py:614-625 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/shared/graph_materializer.py:502\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":502}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6b042993e640e8269b9370e0a7dcddc635abce4986530423ec6e8f3996c71c0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/app/util/user_management.py:234-245 | invokeai/app/util/user_management.py:467-478 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/user_management.py"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"031b8c52356c79b041e9e8b482f715499ba6f6e004deda2ea301eca464ffc636"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u201312 lines \u00D7 2): invokeai/backend/hidiffusion/hidiffusion.py:1011-1022 | invokeai/backend/util/hotfixes.py:635-642 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/hidiffusion/hidiffusion.py"},"region":{"startLine":1011}}}],"partialFingerprints":{"codehealthFindingId/v1":"badb720bd08dd6ce56b372f0dffa034e95ccd8629766f93b859813738b4cf9db"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py:9-20 | invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py:9-20 \u2014 before extracting anything, compare \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py\u0060 and \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py\u0060 as WHOLE FILES: this scan already matched 10 separate duplicated blocks between them, totalling at least 161 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"585686eb609f311d36c3b482849714fd8c641195e547947637106d9b69e8b0dd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py:51-62 | invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py:50-61 \u2014 before extracting anything, compare \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py\u0060 and \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py\u0060 as WHOLE FILES: this scan already matched 10 separate duplicated blocks between them, totalling at least 161 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccfd744c0b8dc44d0f5bf8796115019ec9dcfd6e27f0fee44f720daf3c53a3f4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/backend/model_manager/configs/ip_adapter.py:91-102 | invokeai/backend/model_manager/configs/ip_adapter.py:164-175 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/ip_adapter.py"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd1e0638f99fb2fa9421165cb52109593853ad8b6124d917fdea6539e36a1491"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201312 lines \u00D7 2): invokeai/backend/model_manager/configs/main.py:3483-3492 | invokeai/backend/model_manager/configs/main.py:3810-3821 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":3483}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f6d3794a45dd2a22cb8c58d788d4f767945a267bff9f198024425d427e223e9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/backend/patches/lora_conversions/krea2_lora_conversion_utils.py:212-223 | invokeai/backend/patches/lora_conversions/z_image_lora_conversion_utils.py:130-144 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/lora_conversions/krea2_lora_conversion_utils.py"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"e03ec53a31c6cafb07f223d52a5ee6025095b8f829b6e312e500a53b3ba55425"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/backend/pid/_src/networks/pid_net.py:364-375 | invokeai/backend/pid/_src/networks/pixeldit_official.py:1459-1470 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/pid/_src/networks/pid_net.py:364\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pid_net.py"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dddd109a37b5ec4392382ed8c77c1807cb950551076ab7c5e5ff615690ef84a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): invokeai/backend/pid/_src/networks/pid_net.py:394-405 | invokeai/backend/pid/_src/networks/pixeldit_official.py:1481-1491 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pid_net.py"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"13500b577802ab3892c8aa267f7b0b368dce4e12f7dc72438b7c4e33d927f19e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/backend/pid/_src/networks/pixeldit_official.py:1026-1037 | invokeai/backend/pid/_src/networks/pixeldit_official.py:1100-1111 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pixeldit_official.py"},"region":{"startLine":1026}}}],"partialFingerprints":{"codehealthFindingId/v1":"24b2d5ffdc6023f9a5b0ab45ae6cb811293cb1b5718931d156f124a5b75b832f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/backend/stable_diffusion/diffusers_pipeline.py:385-396 | invokeai/backend/stable_diffusion/multi_diffusion_pipeline.py:82-93 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusers_pipeline.py"},"region":{"startLine":385}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5302942bf1855b4f5717d195a745db06afbb6385ec035d3bd0cd49dd42d0611"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201312 lines \u00D7 2): invokeai/backend/tiles/tiles.py:281-290 | invokeai/backend/tiles/tiles.py:384-395 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/tiles/tiles.py"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5421091b11497a5ea75855da26547f4da2cd893372eebb79c32c8e926dfcd9d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/backend/util/attention.py:326-337 | invokeai/backend/util/sage_attention.py:358-369 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/attention.py"},"region":{"startLine":326}}}],"partialFingerprints":{"codehealthFindingId/v1":"876be0a5406f192522d968cfd804f588978f06cc24d106fda099ec9266fa3f48"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): invokeai/backend/z_image/z_image_control_transformer.py:419-430 | invokeai/backend/z_image/z_image_control_transformer.py:619-629 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/z_image/z_image_control_transformer.py:419\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_transformer.py"},"region":{"startLine":419}}}],"partialFingerprints":{"codehealthFindingId/v1":"082e7f8d96b43606924f709114f5c936005383bf4848871d18021a7a1c9d471b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201311 lines \u00D7 4): invokeai/backend/model_manager/configs/main.py:1192-1202 | invokeai/backend/model_manager/configs/main.py:3569-3577 | invokeai/backend/model_manager/configs/main.py:3723-3731 | invokeai/backend/model_manager/configs/main.py:3889-3898 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":1192}}}],"partialFingerprints":{"codehealthFindingId/v1":"78ca6e669191f661c902d967212444da1f2107ff558c6ca1d1e8809411fa3367"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 4): invokeai/backend/model_manager/load/model_loaders/cogview4.py:28-38 | invokeai/backend/model_manager/load/model_loaders/flux.py:1111-1121 | invokeai/backend/model_manager/load/model_loaders/flux.py:1153-1163 | invokeai/backend/model_manager/load/model_loaders/qwen_image.py:158-168 \u2014 there are 4 copies across 3 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/backend/model_manager/load/model_loaders/flux.py:1172\u0060 calls \u0060SilenceWarnings\u0060 and \u0060invokeai/backend/model_manager/load/model_loaders/cogview4.py:43\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/cogview4.py"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b0fc1d04722991ba7984520cd39a923f9ae9c8e5b677acf470be3b4983ed038"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201311 lines \u00D7 3): invokeai/app/invocations/vae/anima_image_to_latents.py:124-134 | invokeai/app/invocations/vae/wan_image_to_latents.py:93-101 | invokeai/app/invocations/vae/z_image_image_to_latents.py:105-115 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/vae/anima_image_to_latents.py\u0060 and \u0060invokeai/app/invocations/vae/z_image_image_to_latents.py\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 36 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/vae/anima_image_to_latents.py:124\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/anima_image_to_latents.py"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d8a438473c62a01284524e59c617a0fa0251c330cfa36cbef68c8457b18ac01"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201311 lines \u00D7 3): invokeai/app/services/download/download_default.py:440-448 | invokeai/app/services/download/download_default.py:458-466 | invokeai/app/services/download/download_default.py:486-496 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/download/download_default.py:440\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/download/download_default.py"},"region":{"startLine":440}}}],"partialFingerprints":{"codehealthFindingId/v1":"e210e8d5804f43efcf40d6510229c4c77ada97722894e3f4c03b23e2a05f6f10"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201311 lines \u00D7 2): invokeai/app/api/routers/session_queue.py:621-631 | invokeai/app/api/routers/session_queue.py:874-882 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/session_queue.py"},"region":{"startLine":621}}}],"partialFingerprints":{"codehealthFindingId/v1":"eaf8cfa77fdb21c90e0a308e39923606c2db910d85dfe5f54438d9bd2a31b256"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/app/api/routers/system_prompts.py:83-93 | invokeai/app/api/routers/system_prompts.py:107-117 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060system_prompt_id\u0060 to \u0060str = Path(description=\u0022The id of the system prompt to update\u0022)\u0060 in one and \u0060str = Path(description=\u0022The id of the system prompt to delete\u0022)\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/system_prompts.py"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"b11d1233ccf1570fedbe397eb7042d5b5f1112bbfebafad029446b5324e31606"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/app/api/routers/workflows.py:102-112 | invokeai/app/api/routers/workflows.py:154-164 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060workflow_id\u0060 to \u0060str = Path(description=\u0022The workflow to get\u0022)\u0060 in one and \u0060str = Path(description=\u0022The workflow to delete\u0022)\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/workflows.py"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"22ee44f72124cd360877bde13ce845d539be92e31f14dae65beb2d9bea0b34c7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/app/invocations/krea2/krea2_style_reference.py:224-234 | invokeai/backend/krea2/style_reference_extension.py:106-116 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/krea2/krea2_style_reference.py:224\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/krea2/krea2_style_reference.py"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"86bb1621ea21e402cd8b4a7fc2afb39122955b851c97909056a0d7faffa9abf4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 2): invokeai/app/invocations/resize_latents.py:54-64 | invokeai/app/invocations/resize_latents.py:94-103 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/resize_latents.py:54\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/resize_latents.py"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"c11d347a895edb7b009409a580bf4bbcc00836dd35cbad7c95fe33ae3cd45d9b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 2): invokeai/app/invocations/sd/denoise_latents.py:1133-1143 | invokeai/app/invocations/sd/tiled_multi_diffusion_denoise_latents.py:220-229 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/denoise_latents.py"},"region":{"startLine":1133}}}],"partialFingerprints":{"codehealthFindingId/v1":"73a88fb5ddc9d43fa6a25c2c64db1cd5d9b83c40abe1c047bcc0eb4cdaf004d5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/app/services/external_generation/providers/alibabacloud.py:244-254 | invokeai/app/services/external_generation/providers/alibabacloud.py:279-289 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/external_generation/providers/alibabacloud.py"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"f417b1727a93a59ccf5046f85dec77e9eb4249025873f64a42373292b3d73528"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/app/services/shared/graph.py:1197-1207 | invokeai/app/services/shared/graph.py:1294-1304 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/shared/graph.py:1197\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1197}}}],"partialFingerprints":{"codehealthFindingId/v1":"21b92d6199f53d6ab1a49da2b639b2a7aa5009277677dd32e8e057c5393ce207"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/app/services/shared/graph.py:2131-2141 | invokeai/app/services/shared/graph.py:2144-2154 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":2131}}}],"partialFingerprints":{"codehealthFindingId/v1":"48f6c099e6ed2fb3509668aaed3711776e9fd8fb68b626278a2e46d4291dd060"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/app/services/shared/graph_if_dependencies.py:55-65 | invokeai/app/services/shared/graph_if_dependencies.py:130-140 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/services/shared/graph_if_dependencies.py:127\u0060 calls \u0060_get_input_edges\u0060 and \u0060invokeai/app/services/shared/graph_if_dependencies.py:53\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_if_dependencies.py"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"5958ccd4d1a7055a872f0ba5e533be7d44102b66a47f26ab5d9d4b76ed2a0532"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/app/services/shared/graph_materializer.py:622-632 | invokeai/app/services/shared/graph_materializer.py:950-960 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/shared/graph_materializer.py:622\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":622}}}],"partialFingerprints":{"codehealthFindingId/v1":"869ef2e63638b57630e406c82d91feab52a4274e8564cb875c27dab9f9c251e4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 2): invokeai/app/services/shared/graph_materializer.py:938-948 | invokeai/app/services/shared/graph_materializer.py:979-988 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/shared/graph_materializer.py:938\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":938}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f6c6140fea49835580db029108952a96720acf41cf2565421f7e186be4bfc0a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/app/util/user_management.py:348-358 | invokeai/app/util/user_management.py:386-396 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/user_management.py"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"e470e88ff81bdde5faa45063b3d8d5a7109b47b1d886ae26c59bdb772fd5557a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201311 lines \u00D7 2): invokeai/backend/flux/controlnet/instantx_controlnet_flux.py:48-58 | invokeai/backend/flux/controlnet/xlabs_controlnet_flux.py:30-38 \u2014 before extracting anything, compare \u0060invokeai/backend/flux/controlnet/instantx_controlnet_flux.py\u0060 and \u0060invokeai/backend/flux/controlnet/xlabs_controlnet_flux.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 57 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/controlnet/instantx_controlnet_flux.py"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6aa030d7190a410e1fa0b45bdd9dfa928da9ca46ad53816ec02afd735f5595d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/backend/image_util/lineart.py:152-162 | invokeai/backend/image_util/lineart_anime.py:196-206 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/lineart.py"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"6aab8132f18a680de81983445b9046178b1f9b5f99fcfa51510bc0c045f68609"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 2): invokeai/backend/image_util/lineart_anime.py:184-193 | invokeai/backend/image_util/lineart_anime.py:251-261 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/lineart_anime.py"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f40a895aee816134be6d7526263fb786c2c755eda0bc30fdccb463502225c28"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py:32-42 | invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py:31-41 \u2014 before extracting anything, compare \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py\u0060 and \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py\u0060 as WHOLE FILES: this scan already matched 10 separate duplicated blocks between them, totalling at least 161 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"490661ce8b5e797d418d06e9d819f77b6733e4aa77f41c5e0ac4794880a17fbc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py:202-212 | invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py:201-211 \u2014 before extracting anything, compare \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py\u0060 and \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py\u0060 as WHOLE FILES: this scan already matched 10 separate duplicated blocks between them, totalling at least 161 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py:214\u0060 calls \u0060_load_pretrained_model\u0060 and \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py:216\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b16bedabe92bdb9df8e5daa4539f374d1d9d636a69fb971075fd42a7d2e06fc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/backend/model_manager/load/model_cache/model_cache.py:2867-2877 | invokeai/backend/model_manager/load/model_cache/model_cache.py:2954-2964 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/backend/model_manager/load/model_cache/model_cache.py:2966\u0060 calls \u0060release\u0060 and \u0060invokeai/backend/model_manager/load/model_cache/model_cache.py:2879\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2867}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fc9ddf9714f9f58c66c27c37106c4601b618ceef9e7f7a10dd9f5ab0ae68fbf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/ernie_image.py:104-114 | invokeai/backend/model_manager/load/model_loaders/ernie_image.py:151-161 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/ernie_image.py"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4776bf89ea478756d9c852bf0f83741e434464612f562cc78bc59865e367921"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/vae.py:324-333 | invokeai/backend/model_manager/load/model_loaders/vae.py:474-484 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/vae.py"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"e998e2546fc46d1aa881e091e54fae2bacf225b769dafde0fd6808b22a73ad8b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/z_image.py:293-303 | invokeai/backend/model_manager/load/model_loaders/z_image.py:413-423 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"25a311489bfd965816ce1d99e5a8d376bc56f3b1a21a03874682a62ceb8f470d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/backend/pid/_src/networks/pixeldit_official.py:1060-1070 | invokeai/backend/pid/_src/networks/pixeldit_official.py:1134-1144 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pixeldit_official.py"},"region":{"startLine":1060}}}],"partialFingerprints":{"codehealthFindingId/v1":"58e2cf780cad79eed0bf9dcd78260d245f65d1c6828369f53d48411415c8a511"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/backend/z_image/z_image_control_adapter.py:192-202 | invokeai/backend/z_image/z_image_control_transformer.py:365-375 \u2014 before extracting anything, compare \u0060invokeai/backend/z_image/z_image_control_adapter.py\u0060 and \u0060invokeai/backend/z_image/z_image_control_transformer.py\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_adapter.py"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec42f2ada77ca760bed522a6621642ced3d1c01bad766365ade5e7fcba651433"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 5): invokeai/app/invocations/pid/flux2_pid_decode.py:238-247 | invokeai/app/invocations/pid/flux_pid_decode.py:161-170 | invokeai/app/invocations/pid/qwen_image_pid_decode.py:227-236 | invokeai/app/invocations/pid/sd3_pid_decode.py:150-159 | invokeai/app/invocations/pid/sdxl_pid_decode.py:200-209 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/pid/flux2_pid_decode.py\u0060 and \u0060invokeai/app/invocations/pid/flux_pid_decode.py\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/pid/flux2_pid_decode.py:238\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/pid/flux2_pid_decode.py"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"6396eb9f995732d76b7224428e8704b63495a85f2ba642f34674c0cb2f2e9a4d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u201310 lines \u00D7 5): invokeai/backend/model_manager/load/model_loaders/flux.py:997-1003 | invokeai/backend/model_manager/load/model_loaders/flux.py:1533-1539 | invokeai/backend/model_manager/load/model_loaders/ideogram4.py:488-494 | invokeai/backend/model_manager/load/model_loaders/krea2.py:599-608 | invokeai/backend/model_manager/load/model_loaders/z_image.py:700-706 \u2014 there are 5 copies across 4 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 5 sites; resolving a subset leaves the remainder to drift apart. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/model_manager/load/model_loaders/z_image.py:692\u0060 calls \u0060load_state_dict_ignoring_extras\u0060, \u0060clear\u0060 and \u0060invokeai/backend/model_manager/load/model_loaders/ideogram4.py:486\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":997}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ab0b5bab6e712f9a4ca2d09d916248451466ae7e4a96763ead3c1a5e30ec5d6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 4): invokeai/app/api/routers/images.py:141-149 | invokeai/app/api/routers/style_presets.py:132-141 | invokeai/app/api/routers/style_presets.py:222-231 | invokeai/app/api/routers/workflows.py:366-375 \u2014 there are 4 copies across 3 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/images.py"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"d497457dc7bac6fcb144bacb491bbc7c29bc2b0f086964d392a04e6d367d7a27"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4): invokeai/app/services/shared/graph_materializer.py:503-513 | invokeai/app/services/shared/graph_materializer.py:615-625 | invokeai/app/services/shared/graph_materializer.py:943-953 | invokeai/app/services/shared/graph_materializer.py:1049-1058 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/shared/graph_materializer.py:503\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"d96ae3d43a8d9121222ce2cb60a483f1778783374d6ae88ad6db87aff5084924"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4): invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_conv2d.py:16-25 | invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_invoke_linear_8_bit_lt.py:19-28 | invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_invoke_linear_nf4.py:21-30 | invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_linear.py:88-97 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 4 call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_conv2d.py"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3b18066b324c48e47961063126b89fbfedf2c9bab29f91f7e2f7f36f110aef5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): invokeai/app/invocations/vae/anima_image_to_latents.py:133-142 | invokeai/app/invocations/vae/qwen_image_image_to_latents.py:135-144 | invokeai/app/invocations/vae/z_image_image_to_latents.py:114-123 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/vae/anima_image_to_latents.py\u0060 and \u0060invokeai/app/invocations/vae/z_image_image_to_latents.py\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 36 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/invocations/vae/anima_image_to_latents.py:132\u0060 calls \u0060signal_progress\u0060 and \u0060invokeai/app/invocations/vae/qwen_image_image_to_latents.py:133\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/anima_image_to_latents.py"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac46b4ba2903c32a94266cd855a8bb092c20abcb5f2c1bd3d52b3d4577244581"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/app/api/sockets.py:1051-1061 | invokeai/app/api/sockets.py:1110-1119 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/api/sockets.py:1051\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/sockets.py"},"region":{"startLine":1051}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2515af5aa4822d55a24819464deafed0cc56fb5f2a0da9179b9e27d61c7109a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/app/invocations/composition-nodes.py:190-199 | invokeai/app/invocations/composition-nodes.py:239-248 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/composition-nodes.py"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce8e0cf6512edea8e168faa74ff70cb2e35f67ca24a95b9af70925f17e15ee30"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/app/invocations/ltx2/ltx2_denoise.py:222-231 | invokeai/app/invocations/minimax_h3/minimax_h3_denoise.py:651-660 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/ltx2/ltx2_denoise.py"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"798483994f8efc6683d177df1e1687fdd83fae998e23433dcefe1efd0d840b36"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 2): invokeai/app/invocations/mask.py:157-166 | invokeai/app/invocations/mask.py:191-199 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/mask.py"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7128736bfb44937b956054c7f314a039c499157d7c01fb9f9700782e15ccc25"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/app/invocations/wan/wan_denoise.py:461-470 | invokeai/app/invocations/wan/wan_video_denoise.py:208-217 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/wan/wan_denoise.py\u0060 and \u0060invokeai/app/invocations/wan/wan_video_denoise.py\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 150 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/wan/wan_denoise.py"},"region":{"startLine":461}}}],"partialFingerprints":{"codehealthFindingId/v1":"27c4093eba49458c3b7ecd673c3e9e40c927f6ce417e285cb59ceb4241fd1386"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/app/services/external_generation/providers/gemini.py:111-120 | invokeai/app/services/external_generation/providers/openai.py:117-126 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/external_generation/providers/gemini.py:111\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/external_generation/providers/gemini.py"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"370e69fb50dea05eabb23d4757137a2a2ec66fa16f8c9ebdcc414f96026db09e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/app/services/gallery_maintenance/gallery_maintenance_default.py:274-283 | invokeai/app/services/gallery_maintenance/gallery_maintenance_default.py:408-417 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/gallery_maintenance/gallery_maintenance_default.py"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc0617fc28a3a76d2434874a07bc582e0e83605b43f3093334ea839784aec47b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/app/services/session_processor/workflow_call_batch.py:439-448 | invokeai/app/services/session_processor/workflow_call_batch.py:461-470 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/session_processor/workflow_call_batch.py"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dde935af71ecaf2d9f8e78cb01f37ebe0fb03d5eb66e2cb21a3b301218dda02"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/app/services/session_queue/session_queue_default.py:1113-1122 | invokeai/app/services/session_queue/session_queue_default.py:1129-1138 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/session_queue/session_queue_default.py:1113\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/session_queue/session_queue_default.py"},"region":{"startLine":1113}}}],"partialFingerprints":{"codehealthFindingId/v1":"217e0308f5a584625a3c2edc55d5ec6fe840be4ec18e5a8a5131180eb7e55e8e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/app/services/shared/database/queries/images.py:379-388 | invokeai/app/services/shared/database/queries/videos.py:323-332 \u2014 before extracting anything, compare \u0060invokeai/app/services/shared/database/queries/images.py\u0060 and \u0060invokeai/app/services/shared/database/queries/videos.py\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 44 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/shared/database/queries/images.py:379\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/queries/images.py"},"region":{"startLine":379}}}],"partialFingerprints":{"codehealthFindingId/v1":"4778bb2576eb2fde40fe711cfabbb84640a2a6ed651b2bab998b19ff4205f764"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/app/services/shared/graph.py:573-582 | invokeai/app/services/shared/graph.py:3595-3604 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":573}}}],"partialFingerprints":{"codehealthFindingId/v1":"4882d423bbb3a144b0fd5f5c9c2a7907902abee8074f0752cb8f84526df055db"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u201310 lines \u00D7 2): invokeai/app/services/shared/graph.py:1457-1464 | invokeai/app/services/shared/graph.py:1472-1481 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/shared/graph.py:1472\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1457}}}],"partialFingerprints":{"codehealthFindingId/v1":"d26771627b9b8b53d5a165afb14d8f421dec56c0e062c285a8375765b948e47e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/app/services/shared/graph_iterate_planner.py:337-346 | invokeai/app/services/shared/graph_iterate_planner.py:392-401 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060fan_in\u0060 to \u0060_DirectIterateCollectFanIn\u0060 in one and \u0060_BodyIterateCollectFanIn\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_iterate_planner.py"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6f77d04b2c0e9e4c3ecaf284102840d749c3661f1f522c102ccf8b77ba26f12"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/backend/minimax_h3/transformer_minimax_h3.py:260-269 | invokeai/backend/minimax_h3/transformer_minimax_h3.py:331-340 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/minimax_h3/transformer_minimax_h3.py"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"560a3ef79f01486c2a6c531082f088b15103533c94461e2459b913c620847dc4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/z_image.py:1658-1667 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1834-1843 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/model_manager/load/model_loaders/z_image.py:1658\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":1658}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a322d7f79e98c8dfe3662d47418083c33bc8a8b315d05001d87ed3d9f84fdce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/backend/patches/lora_conversions/flux_kohya_lora_conversion_utils.py:65-74 | invokeai/backend/patches/lora_conversions/flux_onetrainer_lora_conversion_utils.py:62-71 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060state_dict\u0060 to \u0060Dict[str, torch.Tensor]\u0060 in one and \u0060dict[str | int, Any]\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/lora_conversions/flux_kohya_lora_conversion_utils.py"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ec20458b5e926875c8aa074769af0891875700f1265e7a50a1ac17d45ced015"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/backend/quantization/sdnq/utils.py:122-131 | invokeai/backend/quantization/sdnq/utils.py:165-174 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/quantization/sdnq/utils.py:164\u0060 calls \u0060to\u0060 and \u0060invokeai/backend/quantization/sdnq/utils.py:118\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/sdnq/utils.py"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"1627eaf60ecef2576b82e11e561d754e883d4f370395ec0abd4adca189275195"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/backend/z_image/z_image_control_adapter.py:212-221 | invokeai/backend/z_image/z_image_control_transformer.py:404-413 \u2014 before extracting anything, compare \u0060invokeai/backend/z_image/z_image_control_adapter.py\u0060 and \u0060invokeai/backend/z_image/z_image_control_transformer.py\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_adapter.py"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"873fcfcc5c2d075f6954f6fe2566b15d506f0b2b68832a7ae19893ea280acddf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/backend/z_image/z_image_control_transformer.py:574-583 | invokeai/backend/z_image/z_image_controlnet_extension.py:328-337 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_transformer.py"},"region":{"startLine":574}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f3ab1b05681b2adf8ff1a5c344b04e5bc2ee8da4bacc987e5cc5c3a7708ce3b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4): invokeai/app/api/routers/workflows.py:394-402 | invokeai/app/api/routers/workflows.py:458-466 | invokeai/app/api/routers/workflows.py:549-557 | invokeai/app/api/routers/workflows.py:572-580 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/workflows.py"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"822ef5cb505bde933c0b22b9ce0871a27b06720c0af55efdc2e41452da2e8ed4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4): invokeai/app/invocations/flux2/flux2_klein_lora_loader.py:92-100 | invokeai/app/invocations/flux2/flux2_klein_lora_loader.py:194-202 | invokeai/app/invocations/z_image/z_image_lora_loader.py:71-79 | invokeai/app/invocations/z_image/z_image_lora_loader.py:163-171 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/flux2/flux2_klein_lora_loader.py\u0060 and \u0060invokeai/app/invocations/z_image/z_image_lora_loader.py\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 101 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/invocations/flux2/flux2_klein_lora_loader.py:191\u0060 calls \u0060_assert_not_dev_lora\u0060 and \u0060invokeai/app/invocations/z_image/z_image_lora_loader.py:162\u0060 does not \u2014 after which the two agree again for 4 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux2/flux2_klein_lora_loader.py"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"727d5cb5ef898d7c180ebdc85cd1ad5fc4d908a5602d18a3bfa1a77ef1253915"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 3): invokeai/app/invocations/cogview4/cogview4_denoise.py:165-173 | invokeai/app/invocations/qwen_image/qwen_image_denoise.py:188-195 | invokeai/app/invocations/sd3/sd3_denoise.py:184-192 \u2014 \u0060invokeai/app/invocations/cogview4/cogview4_denoise.py\u0060 and \u0060invokeai/app/invocations/qwen_image/qwen_image_denoise.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 3 separate duplicated blocks between them, totalling at least 43 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/cogview4/cogview4_denoise.py"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbc8f77fa9c73c4bc24f69893dab15df4b00cfc5003d3a3c9c186006f30e653b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6\u20139 lines \u00D7 3): invokeai/backend/z_image/z_image_controlnet_extension.py:161-169 | invokeai/backend/z_image/z_image_controlnet_extension.py:295-300 | invokeai/backend/z_image/z_image_controlnet_extension.py:320-325 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_controlnet_extension.py"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"7926311f3e9e568035e51904213c7df9cbc35ff2c86c3b6c26604913345aca23"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/app/invocations/anima/anima_lora_loader.py:153-161 | invokeai/app/invocations/flux/flux_lora_loader.py:170-178 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/anima/anima_lora_loader.py"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"758fdf184acedaa5c56402c6ea05276895bd3fe28c301ad3d16efa1ef6eeb64a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/app/invocations/ltx2/ltx2_lora_loader.py:150-158 | invokeai/app/invocations/minimax_h3/minimax_h3_lora_loader.py:143-151 \u2014 \u0060invokeai/app/invocations/ltx2/ltx2_lora_loader.py\u0060 and \u0060invokeai/app/invocations/minimax_h3/minimax_h3_lora_loader.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 4 separate duplicated blocks between them, totalling at least 30 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/ltx2/ltx2_lora_loader.py"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f980ffd84744aacd997a92ac2314ec6e2329f380af7c5af734a77fe895d46f8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/app/invocations/pid/flux2_pid_decode.py:217-225 | invokeai/app/invocations/pid/z_image_pid_decode.py:186-194 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/pid/flux2_pid_decode.py\u0060 and \u0060invokeai/app/invocations/pid/z_image_pid_decode.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 78 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/pid/flux2_pid_decode.py:217\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/pid/flux2_pid_decode.py"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"62a98066accd979e2ebb9e9602ead898277b3f75e1f2983ed616e9c2ef89bbc3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 2): invokeai/app/invocations/sd/denoise_latents.py:1101-1108 | invokeai/app/invocations/sd/tiled_multi_diffusion_denoise_latents.py:195-203 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/denoise_latents.py"},"region":{"startLine":1101}}}],"partialFingerprints":{"codehealthFindingId/v1":"293f00f2cb25bf10aa160c2be19da25cc33a9633e07b9fc3c432944fbffb01a9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (1\u20139 lines \u00D7 6): invokeai/app/invocations/vae/anima_image_to_latents.py:104-112 | invokeai/app/invocations/vae/anima_latents_to_image.py:141-141 | invokeai/app/invocations/vae/minimax_h3_latents_to_video.py:106-106 | invokeai/app/invocations/vae/wan_image_to_latents.py:73-81 | invokeai/app/invocations/vae/wan_latents_to_image.py:102-105 | invokeai/app/invocations/vae/wan_latents_to_video.py:193-193 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 6 call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/vae/wan_latents_to_image.py:102\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/invocations/vae/anima_latents_to_image.py:137\u0060 calls \u0060unsqueeze\u0060, \u0060tensor\u0060, \u0060view\u0060 and \u0060invokeai/app/invocations/vae/wan_image_to_latents.py:73\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/anima_image_to_latents.py"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ccda94581a026ca243c44eaa4ee4eaf32250be6ca93d70bb5635e163edb25c8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20139 lines \u00D7 2): invokeai/app/invocations/vae/flux2_vae_decode.py:147-155 | invokeai/app/invocations/vae/flux_vae_decode.py:152-158 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/vae/flux2_vae_decode.py:147\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/flux2_vae_decode.py"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f4b275586a026211a49e8bd9337c0be103920e1aaacb766fedfa63ffbcb0aa2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/app/services/external_generation/providers/alibabacloud.py:224-232 | invokeai/app/services/external_generation/providers/alibabacloud.py:263-271 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/services/external_generation/providers/alibabacloud.py:220\u0060 calls \u0060get\u0060, \u0060isinstance\u0060, \u0060ExternalProviderRequestError\u0060 and \u0060invokeai/app/services/external_generation/providers/alibabacloud.py:261\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/external_generation/providers/alibabacloud.py"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"916f5bfbd7f82ebeacfa35f281898b0de63f0a13f68cd043c2d4b8a68fdbdaaa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/app/services/images/images_default.py:403-411 | invokeai/app/services/images/images_default.py:417-425 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/images/images_default.py"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"87f956c6c861010ac151b7be00043e5d067beb7064c8e8c1d04c843821e2e6ae"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/app/services/images/images_default.py:605-613 | invokeai/app/services/videos/videos_default.py:416-424 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/images/images_default.py:605\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/images/images_default.py"},"region":{"startLine":605}}}],"partialFingerprints":{"codehealthFindingId/v1":"9692c4675ac9ee081b4ca1a41adda28b769e9944ba70ac56e13ce61b7d195f01"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/app/services/project_records/project_records_default.py:256-264 | invokeai/app/services/project_records/project_records_default.py:394-402 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/project_records/project_records_default.py:256\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/project_records/project_records_default.py"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"d25e64c8a4193300c08531fad7cf5750cbd1810dd2b0ffa8ce8e7c2715268a9b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/app/services/shared/database/queries/board_images.py:94-102 | invokeai/app/services/shared/database/queries/board_videos.py:76-84 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/queries/board_images.py"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c45d1b962c6d38e223da12072ce25eee309f2d2a572e5f9dd522150e229eee2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/app/services/shared/database/queries/images.py:423-431 | invokeai/app/services/shared/database/queries/videos.py:361-369 \u2014 before extracting anything, compare \u0060invokeai/app/services/shared/database/queries/images.py\u0060 and \u0060invokeai/app/services/shared/database/queries/videos.py\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 44 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/shared/database/queries/images.py:423\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/queries/images.py"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"724bbea717a87504c1f7ca9c1ae4641383663410191965cea1bbef7026ebf7f2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 2): invokeai/app/services/shared/graph_materializer.py:910-918 | invokeai/app/services/shared/graph_materializer.py:1029-1036 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":910}}}],"partialFingerprints":{"codehealthFindingId/v1":"fddd79f55878238e126f57be7480b6a5685aa82379139a9863e4cb8e3d4ee950"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/app/services/shared/graph_scheduler.py:328-336 | invokeai/app/services/shared/graph_scheduler.py:654-662 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_scheduler.py"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2d2ee359c73dd47ddf13a40a1e9090d48d287f58aedcbff54c8a783c9c27a9a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 2): invokeai/app/util/aac_splice.py:160-168 | invokeai/app/util/h264_splice.py:355-362 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/aac_splice.py"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"df0c1332f297aa063c836c85ee49eed61f40dde82780b7e7dffc77fc4c0a910d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/app/util/user_management.py:184-192 | invokeai/app/util/user_management.py:603-611 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/user_management.py"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"a48fdedcf029ce1fcce040a8db9dcf6b45978172990405cc5b7fd3bb052466a2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20139 lines \u00D7 2): invokeai/backend/anima/anima_transformer.py:244-252 | invokeai/backend/anima/anima_transformer.py:836-842 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/anima/anima_transformer.py"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"f60f69a38b44b21f47af20a66e57632454b5ad1b2e9639a199cae082e7429486"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/backend/flux/controlnet/xlabs_controlnet_flux.py:109-117 | invokeai/backend/flux/model.py:112-120 \u2014 before extracting anything, compare \u0060invokeai/backend/flux/controlnet/xlabs_controlnet_flux.py\u0060 and \u0060invokeai/backend/flux/model.py\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 47 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/controlnet/xlabs_controlnet_flux.py"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2d93863c40a15ce1f60fa982920c96a78be29e7806fbae95f8a90b844983375"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/backend/flux/extensions/kontext_extension.py:174-183 | invokeai/backend/flux2/ref_image_extension.py:252-260 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/extensions/kontext_extension.py"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb3b4c3de45a975a952fa677b066bf561a28355c0df614e4460067bda95b49bf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/backend/hidiffusion/hidiffusion.py:1035-1043 | invokeai/backend/util/hotfixes.py:651-659 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/hidiffusion/hidiffusion.py"},"region":{"startLine":1035}}}],"partialFingerprints":{"codehealthFindingId/v1":"efdc3745316adb94126c1f8a02c3db52b41f09176bb91ecc84a008d7b68fa978"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/backend/hidiffusion/hidiffusion.py:2169-2177 | invokeai/backend/hidiffusion/hidiffusion.py:2202-2210 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/hidiffusion/hidiffusion.py"},"region":{"startLine":2169}}}],"partialFingerprints":{"codehealthFindingId/v1":"743a90cf26e7f1337aaa7d0c942bdadbc2f4a1355a28960b004531da9cdd7a99"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/backend/image_util/pidi/model.py:456-464 | invokeai/backend/image_util/pidi/model.py:486-494 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/pidi/model.py"},"region":{"startLine":456}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf064c7ce05bbafea9eab8f89f0f032eb802e16a434d5b255d9eff7f768d2a33"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/qwen_image.py:103-111 | invokeai/backend/model_manager/load/model_loaders/wan.py:334-342 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/qwen_image.py"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3ec56da2dd075b68f203a98954abf085e030b2df36de8e54e0d51f1f15cb2f0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20139 lines \u00D7 2): invokeai/backend/pid/_src/networks/pid_net.py:354-362 | invokeai/backend/pid/_src/networks/pixeldit_official.py:1451-1457 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/pid/_src/networks/pid_net.py:353\u0060 calls \u0060split_inputs_cp\u0060 and \u0060invokeai/backend/pid/_src/networks/pixeldit_official.py:1450\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pid_net.py"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"3371d48c34508bc4d65fe16af1e1baa08ac2a15966b6c44461ef64676c7ebfa3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/backend/pid/_src/networks/pixeldit_official.py:251-259 | invokeai/backend/pid/_src/networks/pixeldit_official.py:675-683 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pixeldit_official.py"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"988a8898289f7c0d65d0892a1e8ace0f39a8510c6b809bc8be25d01fbf54dd1f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/backend/pid/_src/networks/pixeldit_official.py:818-826 | invokeai/backend/pid/_src/networks/pixeldit_official.py:855-863 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/pid/_src/networks/pixeldit_official.py:818\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pixeldit_official.py"},"region":{"startLine":818}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc2117e9db888f5f088121accb218d8ce1a6eab4faa2a34153d8e86950213ae6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/backend/z_image/z_image_control_adapter.py:40-48 | invokeai/backend/z_image/z_image_control_transformer.py:45-53 \u2014 before extracting anything, compare \u0060invokeai/backend/z_image/z_image_control_adapter.py\u0060 and \u0060invokeai/backend/z_image/z_image_control_transformer.py\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_adapter.py"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"80073bf14af54d498b499252f394afa9381a04e2a5301613a227bb50eb1f764c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6\u20138 lines \u00D7 7): invokeai/app/invocations/vae/anima_latents_to_image.py:191-197 | invokeai/app/invocations/vae/cogview4_latents_to_image.py:75-82 | invokeai/app/invocations/vae/ideogram4_latents_to_image.py:91-96 | invokeai/app/invocations/vae/qwen_image_latents_to_image.py:142-149 | invokeai/app/invocations/vae/sd3_latents_to_image.py:77-84 | invokeai/app/invocations/vae/wan_latents_to_image.py:115-121 | invokeai/app/invocations/vae/z_image_latents_to_image.py:155-162 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 7 call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/anima_latents_to_image.py"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"5263850d13c434b925846fa11e4a793723b452a574b3bcd0422d0ff9c54f65b9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (3\u20138 lines \u00D7 5): invokeai/app/invocations/anima/anima_lora_loader.py:60-66 | invokeai/app/invocations/flux/flux_lora_loader.py:65-72 | invokeai/app/invocations/flux2/flux2_klein_lora_loader.py:103-105 | invokeai/app/invocations/qwen_image/qwen_image_lora_loader.py:51-57 | invokeai/app/invocations/z_image/z_image_lora_loader.py:58-65 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/anima/anima_lora_loader.py\u0060 and \u0060invokeai/app/invocations/flux2/flux2_klein_lora_loader.py\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 54 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/app/invocations/anima/anima_lora_loader.py:66\u0060 calls \u0060ValueError\u0060 and \u0060invokeai/app/invocations/flux2/flux2_klein_lora_loader.py:105\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/anima/anima_lora_loader.py"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"79efe3df0750cdd6697dca25b37588b09e0536eabfa9a274d74e7522b71a56ca"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6\u20138 lines \u00D7 4): invokeai/app/services/shared/graph_materializer.py:655-662 | invokeai/app/services/shared/graph_materializer.py:733-738 | invokeai/app/services/shared/graph_materializer.py:761-768 | invokeai/app/services/shared/graph_materializer.py:1189-1194 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/shared/graph_materializer.py:655\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/services/shared/graph_materializer.py:1188\u0060 calls \u0060_discard_source_executed\u0060, \u0060_create_execution_node_copy\u0060 and \u0060invokeai/app/services/shared/graph_materializer.py:655\u0060 does not \u2014 after which the two agree again for 4 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":655}}}],"partialFingerprints":{"codehealthFindingId/v1":"6afc08fc86fc9164b3b2f1ea1dd3f17deeac643a4447b1fbff52b654e0c4ea01"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): invokeai/app/invocations/text_encoder/anima_text_encoder.py:286-293 | invokeai/app/invocations/text_encoder/flux2_klein_text_encoder.py:213-220 | invokeai/app/invocations/text_encoder/z_image_text_encoder.py:213-220 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/anima_text_encoder.py"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e0e8cb4bd0184599e651a66700c645b3702ae58df14ea09ce7f7b703dce0f5f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): invokeai/app/services/external_generation/providers/gemini.py:111-120 | invokeai/app/services/external_generation/providers/openai.py:117-126 | invokeai/app/services/external_generation/providers/seedream.py:101-108 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/external_generation/providers/gemini.py:111\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/external_generation/providers/gemini.py"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"8658fced5ffdc7eab3361d26ab678dbd96f742af5980a0a04bfcc297d40fa31d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): invokeai/app/services/shared/graph.py:1646-1653 | invokeai/app/services/shared/graph.py:1688-1695 | invokeai/app/services/shared/graph.py:1751-1758 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/shared/graph.py:1646\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1646}}}],"partialFingerprints":{"codehealthFindingId/v1":"a89f2eb71a01518d865462bc7f0291c62c52f8b8763f00a59c594cb2c90c7191"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): invokeai/backend/pid/_src/networks/pixeldit_official.py:461-468 | invokeai/backend/pid/_src/networks/pixeldit_official.py:1064-1071 | invokeai/backend/pid/_src/networks/pixeldit_official.py:1138-1145 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pixeldit_official.py"},"region":{"startLine":461}}}],"partialFingerprints":{"codehealthFindingId/v1":"b52cd7c9a3a401a28bd81685f783b8fa74054eb57350e8ad5f37a869a5b56746"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20138 lines \u00D7 3): invokeai/backend/z_image/z_image_control_adapter.py:217-223 | invokeai/backend/z_image/z_image_control_transformer.py:409-415 | invokeai/backend/z_image/z_image_controlnet_extension.py:177-184 \u2014 before extracting anything, compare \u0060invokeai/backend/z_image/z_image_control_adapter.py\u0060 and \u0060invokeai/backend/z_image/z_image_control_transformer.py\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_adapter.py"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"14399ff42d322e1932e22c778139f5fbbeedc826d652258ff49c5a6c3533872c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/app/invocations/anima/anima_denoise.py:995-1006 | invokeai/app/invocations/z_image/z_image_denoise.py:917-924 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/anima/anima_denoise.py"},"region":{"startLine":995}}}],"partialFingerprints":{"codehealthFindingId/v1":"0251d5b932e3144a8fb2ce7b8e92adbc67787eefcc90f8b842d6bdb406377aa3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/app/invocations/composition-nodes.py:1443-1450 | invokeai/app/invocations/composition-nodes.py:1531-1538 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/composition-nodes.py"},"region":{"startLine":1443}}}],"partialFingerprints":{"codehealthFindingId/v1":"a768d52c0f7b3e238f59e50b0b1654072afd00a15a8d85efe624d73fe27bf629"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/app/invocations/ltx2/ltx2_lora_loader.py:100-107 | invokeai/app/invocations/minimax_h3/minimax_h3_lora_loader.py:93-100 \u2014 \u0060invokeai/app/invocations/ltx2/ltx2_lora_loader.py\u0060 and \u0060invokeai/app/invocations/minimax_h3/minimax_h3_lora_loader.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 4 separate duplicated blocks between them, totalling at least 30 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/ltx2/ltx2_lora_loader.py:100\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/ltx2/ltx2_lora_loader.py"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a1cc44d6ae9689725bfdc4e6b9e155dbf665c55cbea34aa084b5a5934ad2322"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/app/invocations/ltx2/ltx2_lora_loader.py:162-169 | invokeai/app/invocations/minimax_h3/minimax_h3_lora_loader.py:155-162 \u2014 \u0060invokeai/app/invocations/ltx2/ltx2_lora_loader.py\u0060 and \u0060invokeai/app/invocations/minimax_h3/minimax_h3_lora_loader.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 4 separate duplicated blocks between them, totalling at least 30 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/ltx2/ltx2_lora_loader.py:162\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/ltx2/ltx2_lora_loader.py"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb36ca6c34d2099c53ecec69a16d86eb12c35db36bb5211420897a8463e46499"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20138 lines \u00D7 2): invokeai/app/invocations/model.py:532-538 | invokeai/app/invocations/model.py:692-699 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/app/invocations/model.py:702\u0060 calls \u0060model_copy\u0060 and \u0060invokeai/app/invocations/model.py:540\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/model.py"},"region":{"startLine":532}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6a3ab0e1b9ab23c5b4ff57cf9fc0598ea120a799134eb9a031f2d5e88a071db"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/app/invocations/model.py:540-547 | invokeai/app/invocations/model.py:704-711 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/model.py"},"region":{"startLine":540}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe1a98f9d92f360cd53cc94405c5b2097d07e1e9370ade117816f84da9522f5b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/app/invocations/pid/flux2_pid_decode.py:163-170 | invokeai/app/invocations/pid/pid_upscale.py:135-142 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/pid/flux2_pid_decode.py\u0060 and \u0060invokeai/app/invocations/pid/pid_upscale.py\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 57 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/pid/flux2_pid_decode.py"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cc30adc3f69332c35566300e52b4f9f2b808c2f5d882823b8f3bdd24332b403"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/app/invocations/sd/sdxl.py:39-46 | invokeai/app/invocations/sd/sdxl.py:79-86 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/sdxl.py"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"679932dd9f15a9b6720c2da807e6da12509faabc0e210ecbbb78e86e39221f97"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/app/invocations/text_encoder/ernie_image_text_encoder.py:68-75 | invokeai/app/invocations/text_encoder/ideogram4_text_encoder.py:52-59 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/ernie_image_text_encoder.py"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"aec5a342a4835525d2443379d42389f6747b8d3904a54f04498c2b43dc28ef12"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (1\u20138 lines \u00D7 6): invokeai/app/invocations/vae/anima_image_to_latents.py:113-120 | invokeai/app/invocations/vae/anima_latents_to_image.py:142-142 | invokeai/app/invocations/vae/minimax_h3_latents_to_video.py:107-107 | invokeai/app/invocations/vae/wan_image_to_latents.py:82-89 | invokeai/app/invocations/vae/wan_latents_to_image.py:106-106 | invokeai/app/invocations/vae/wan_latents_to_video.py:194-194 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 6 call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/invocations/vae/anima_image_to_latents.py:107\u0060 calls \u0060encode\u0060, \u0060sample\u0060, \u0060to\u0060 and \u0060invokeai/app/invocations/vae/anima_latents_to_image.py:137\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/anima_image_to_latents.py"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"d20e6c4b2821821d98b0142779c62cdcaa085b0e609cc12fc47ac2cbc7f2a930"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/app/invocations/video_frame_extract.py:58-65 | invokeai/app/invocations/video_frame_extract_range.py:194-201 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/video_frame_extract.py"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"0be09e20c1eb750a0b56b275fb38999a3e738ec47efc290831c81ce687a599ad"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/app/services/download/download_default.py:549-556 | invokeai/app/services/download/download_default.py:654-661 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/download/download_default.py"},"region":{"startLine":549}}}],"partialFingerprints":{"codehealthFindingId/v1":"9908ae950d9cf8002d743aeb390044eb7850726444f603ff2dd76c5eda05c98e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/app/services/shared/database/queries/images.py:487-494 | invokeai/app/services/shared/database/queries/videos.py:426-433 \u2014 before extracting anything, compare \u0060invokeai/app/services/shared/database/queries/images.py\u0060 and \u0060invokeai/app/services/shared/database/queries/videos.py\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 44 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060changes\u0060 to \u0060ImageRecordChanges\u0060 in one and \u0060VideoRecordChanges\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/queries/images.py"},"region":{"startLine":487}}}],"partialFingerprints":{"codehealthFindingId/v1":"25df1ca1316441a43c909aed6370e3cf161849c2c6453c8bb1428a38aa787ae5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/app/services/shared/graph.py:1218-1225 | invokeai/app/services/shared/graph.py:1323-1330 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/shared/graph.py:1218\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/app/services/shared/graph.py:1226\u0060 calls \u0060_get_output_edges\u0060 and \u0060invokeai/app/services/shared/graph.py:1331\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1218}}}],"partialFingerprints":{"codehealthFindingId/v1":"36f933c00b7cb6c1a95b38ad04e532ad64ea571cc3138a3226b5a5ed04e5f988"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/app/services/shared/graph_loop_topology.py:226-233 | invokeai/app/services/shared/graph_loop_topology.py:570-577 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_loop_topology.py"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"18ae6fed34c02df4eba35e630c5e70ce5f6d3f16cbc8a891d980cc4a3f2ed7f0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20138 lines \u00D7 2): invokeai/backend/flux/controlnet/instantx_controlnet_flux.py:149-155 | invokeai/backend/flux/controlnet/xlabs_controlnet_flux.py:116-123 \u2014 before extracting anything, compare \u0060invokeai/backend/flux/controlnet/instantx_controlnet_flux.py\u0060 and \u0060invokeai/backend/flux/controlnet/xlabs_controlnet_flux.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 57 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/controlnet/instantx_controlnet_flux.py"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"563a5b0c75dbea4b6125a71ff611caae16ccfe5a16a462f3d40913e432882ccf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): invokeai/backend/image_util/color_conversion.py:420-427 | invokeai/backend/image_util/color_conversion.py:429-436 | invokeai/backend/image_util/color_conversion.py:437-444 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/image_util/color_conversion.py:420\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/image_util/color_conversion.py:420\u0060 calls \u0060where\u0060 and \u0060invokeai/backend/image_util/color_conversion.py:437\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/color_conversion.py"},"region":{"startLine":420}}}],"partialFingerprints":{"codehealthFindingId/v1":"629e111efc1a3ff4bcef0ecf981fe210973fd8bbd04af4e687e4a3c029d0d845"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20138 lines \u00D7 2): invokeai/backend/image_util/imwatermark/vendor.py:229-236 | invokeai/backend/image_util/imwatermark/vendor.py:295-301 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/image_util/imwatermark/vendor.py:229\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/imwatermark/vendor.py"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffbe4a6b9b33c1d24e481cc321c32f99b5d6c5aead764fef8ea2ea447c31b395"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/backend/model_manager/configs/lora.py:482-489 | invokeai/backend/model_manager/configs/lora.py:490-497 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/lora.py"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"af9ab8cfa1016ef15f9fe9d103fbacf88ab548336094dba2ebb9d2950f487125"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/backend/model_manager/configs/qwen3_encoder.py:693-700 | invokeai/backend/model_manager/configs/qwen3_encoder.py:744-751 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/qwen3_encoder.py"},"region":{"startLine":693}}}],"partialFingerprints":{"codehealthFindingId/v1":"40ea0b314aae78812db24debadcd677dddae07c3a48ddbcc1c3fc7d679009670"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/backend/pid/_src/modules/conditioner.py:414-421 | invokeai/backend/pid/_src/modules/conditioner.py:533-540 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/modules/conditioner.py"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6b633d937a850960edf4ef93d5d91694fc0b8face77555ae536d75c6abcb193"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 7): invokeai/app/invocations/pid/flux2_pid_decode.py:212-218 | invokeai/app/invocations/pid/flux_pid_decode.py:138-144 | invokeai/app/invocations/pid/pid_upscale.py:182-188 | invokeai/app/invocations/pid/qwen_image_pid_decode.py:204-210 | invokeai/app/invocations/pid/sd3_pid_decode.py:131-137 | invokeai/app/invocations/pid/sdxl_pid_decode.py:180-186 | invokeai/app/invocations/pid/z_image_pid_decode.py:181-187 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/pid/flux2_pid_decode.py\u0060 and \u0060invokeai/app/invocations/pid/flux_pid_decode.py\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/pid/flux2_pid_decode.py:212\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/pid/flux2_pid_decode.py"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"64966a76ebf4e903d10a06f69d622fa9e499ac7a334c0620b90077164fed08e5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 4): invokeai/app/invocations/flux/flux_lora_loader.py:160-167 | invokeai/app/invocations/flux2/flux2_dev_lora_loader.py:155-161 | invokeai/app/invocations/flux2/flux2_klein_lora_loader.py:174-181 | invokeai/app/invocations/z_image/z_image_lora_loader.py:146-153 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/flux2/flux2_klein_lora_loader.py\u0060 and \u0060invokeai/app/invocations/z_image/z_image_lora_loader.py\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 101 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux/flux_lora_loader.py"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"38b01adaa604f04f5b07d062b21aa589ca11c7af606c5b9d234048e65fc6c68d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 4): invokeai/app/invocations/text_encoder/anima_text_encoder.py:288-294 | invokeai/app/invocations/text_encoder/flux2_klein_text_encoder.py:215-221 | invokeai/app/invocations/text_encoder/z_image_text_encoder.py:215-221 | invokeai/app/invocations/z_image/z_image_denoise.py:919-925 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 4 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/anima_text_encoder.py"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"96326a5b8ae53490050889970d463670920be1d8c0d50ac8956de73e99712af9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): invokeai/app/invocations/metadata_linked.py:737-743 | invokeai/app/invocations/metadata_linked.py:788-795 | invokeai/app/invocations/metadata_linked.py:865-871 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/metadata_linked.py:788\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/metadata_linked.py"},"region":{"startLine":737}}}],"partialFingerprints":{"codehealthFindingId/v1":"68fe212e3a0b8b9a096da07867b820ec972f6579c7717e4a5c8d4bdfdcf0c512"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): invokeai/app/invocations/pid/qwen_image_pid_decode.py:158-164 | invokeai/app/invocations/pid/sdxl_pid_decode.py:134-140 | invokeai/app/invocations/pid/z_image_pid_decode.py:131-137 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/pid/qwen_image_pid_decode.py\u0060 and \u0060invokeai/app/invocations/pid/sdxl_pid_decode.py\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 87 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/pid/qwen_image_pid_decode.py:158\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/pid/qwen_image_pid_decode.py"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7c438ba79ab02a770088ef553b757aeb7c29f3b94235d80f9d3daa20e04836b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): invokeai/app/services/session_queue/session_queue_default.py:1097-1103 | invokeai/app/services/session_queue/session_queue_default.py:1115-1121 | invokeai/app/services/session_queue/session_queue_default.py:1131-1137 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/session_queue/session_queue_default.py"},"region":{"startLine":1097}}}],"partialFingerprints":{"codehealthFindingId/v1":"401db8b2339a1789cf3eb614084e3e9f9626f3ef8f3eaafa2e381bcf1e39a4a5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): invokeai/backend/flux/controlnet/instantx_controlnet_flux.py:127-133 | invokeai/backend/flux/controlnet/xlabs_controlnet_flux.py:108-114 | invokeai/backend/flux/model.py:111-117 \u2014 before extracting anything, compare \u0060invokeai/backend/flux/controlnet/instantx_controlnet_flux.py\u0060 and \u0060invokeai/backend/flux/controlnet/xlabs_controlnet_flux.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 57 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/flux/controlnet/instantx_controlnet_flux.py:125\u0060 calls \u0060controlnet_x_embedder\u0060 and \u0060invokeai/backend/flux/model.py:110\u0060 does not \u2014 after which the two agree again for 4 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/controlnet/instantx_controlnet_flux.py"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"91b9fb1867719b8d0ea0277a02de0ebe19913f74e4cccc21e4b45eb3c88a3a81"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): invokeai/backend/image_util/hed.py:132-138 | invokeai/backend/image_util/lineart.py:152-159 | invokeai/backend/image_util/lineart_anime.py:196-203 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/hed.py"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"34e0d14b6c59104c2323abb0e48206faef4da29f25cb986c3603c5c76cc69547"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): invokeai/backend/model_manager/configs/main.py:3486-3492 | invokeai/backend/model_manager/configs/main.py:3655-3662 | invokeai/backend/model_manager/configs/main.py:3814-3821 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":3486}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f3ba946e5d60df271f4b1a2a3bae916d6ba258bf28462f63d6df43957095126"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): invokeai/backend/pid/_src/networks/pid_net.py:370-376 | invokeai/backend/pid/_src/networks/pixeldit_official.py:1465-1471 | invokeai/backend/pid/_src/networks/pixeldit_official.py:1490-1496 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/pid/_src/networks/pid_net.py:370\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pid_net.py"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7f3d42ead4c50d97ab5829aa8b32e209101ae1870d5a5826016ace0803fb8b7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/app/api/routers/utilities.py:208-214 | invokeai/app/services/fonts/fonts_parsing.py:119-125 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/utilities.py"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0adafc903eac4756e0e26ea85c257a4a46f1964a6624a5b5d0aa226c0206c78"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/app/api/routers/videos.py:1125-1131 | invokeai/app/api/routers/videos.py:1153-1159 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/api/routers/videos.py:1125\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/videos.py"},"region":{"startLine":1125}}}],"partialFingerprints":{"codehealthFindingId/v1":"1069865d5074ab4578591c4541077535bf5f8fdd4a1f1d03445e28a284855f0a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/app/api/routers/workflows.py:487-493 | invokeai/app/api/routers/workflows.py:508-514 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/workflows.py"},"region":{"startLine":487}}}],"partialFingerprints":{"codehealthFindingId/v1":"d86659f78370fa8c6f7a25fd08da4a5504973a9fedc22352bb53923827a3076d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/app/invocations/flux/flux_denoise.py:597-603 | invokeai/app/invocations/flux/flux_denoise.py:635-641 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux/flux_denoise.py"},"region":{"startLine":597}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc4dc526c144cbd4cfe78f683979adfe5381ffa7e134f53fb6b59ef4bea1fe5e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/app/invocations/image.py:1227-1233 | invokeai/app/invocations/image.py:1303-1309 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/app/invocations/image.py:1312\u0060 calls \u0060_prepare_mask\u0060, \u0060get_pil\u0060 and \u0060invokeai/app/invocations/image.py:1236\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/image.py"},"region":{"startLine":1227}}}],"partialFingerprints":{"codehealthFindingId/v1":"542169e503d45cd862768d924de5b00be2f620c60cb5c1ec8962fa77230d95c0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/app/invocations/model.py:448-454 | invokeai/app/invocations/model.py:608-614 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/model.py"},"region":{"startLine":448}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5a6f7dba173b68b9a67ff595cff765fb2f886745c9c6e3168cb72d07be3d890"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/app/invocations/model.py:551-557 | invokeai/app/invocations/model.py:715-721 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/model.py"},"region":{"startLine":551}}}],"partialFingerprints":{"codehealthFindingId/v1":"9947b6c0c26ad433a206a816c5b6fb653688d6fe4a02ad9fea85437e3137dec2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/app/invocations/vae/wan_latents_to_video.py:199-205 | invokeai/app/invocations/vae/wan_latents_to_video.py:230-236 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/app/invocations/vae/wan_latents_to_video.py:206\u0060 calls \u0060iter_wan_vae_decode_chunks\u0060, \u0060cpu\u0060 and \u0060invokeai/app/invocations/vae/wan_latents_to_video.py:237\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/wan_latents_to_video.py"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f380d8621bc630b1c255a4be4a571f100d57e233b9f8b108f4f959d1d8012c3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/app/services/shared/execution_engine/scheduler.py:379-385 | invokeai/app/services/shared/execution_engine/scheduler.py:423-429 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/services/shared/execution_engine/scheduler.py:378\u0060 calls \u0060add\u0060 and \u0060invokeai/app/services/shared/execution_engine/scheduler.py:422\u0060 does not \u2014 after which the two agree again for 4 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/execution_engine/scheduler.py"},"region":{"startLine":379}}}],"partialFingerprints":{"codehealthFindingId/v1":"def1262f1e2850079ebe911993db4aaa00d6f162278a745020728bf45e1a7d50"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/backend/anima/anima_transformer.py:269-275 | invokeai/backend/anima/anima_transformer_patch.py:36-42 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/anima/anima_transformer.py"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"e507dd544d22f0b40a388994934ccdba79f1ffb00766afe3abc644660637ec77"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/backend/ernie_image/denoise.py:118-124 | invokeai/backend/ernie_image/denoise.py:164-170 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/ernie_image/denoise.py"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"73fbc0cb032201432d5dde90604d5414059680d2a62eb7d4648c2ad9729ca89a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/backend/flux/controlnet/state_dict_utils.py:87-93 | invokeai/backend/flux/controlnet/state_dict_utils.py:149-166 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/flux/controlnet/state_dict_utils.py:87\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/flux/controlnet/state_dict_utils.py:148\u0060 calls \u0060pop\u0060 and \u0060invokeai/backend/flux/controlnet/state_dict_utils.py:86\u0060 does not \u2014 after which the two agree again for 4 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/controlnet/state_dict_utils.py"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"a166bd55e27a44cedcd81f3516315ce527d33ec1e3d69b58dff5c893e93b74cc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/backend/flux/custom_block_processor.py:27-33 | invokeai/backend/flux/ip_adapter/ip_double_stream_block_processor.py:41-47 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/flux/ip_adapter/ip_double_stream_block_processor.py:41\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/custom_block_processor.py"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"8533dfd2ef60a482d6f4ca756c30fce89df68489467e81f6f7f4d372b2384801"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/backend/image_util/hed.py:138-144 | invokeai/backend/image_util/hed.py:207-213 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/image_util/hed.py:133\u0060 calls \u0060normalize_image_channel_count\u0060, \u0060resize_image_to_resolution\u0060 and \u0060invokeai/backend/image_util/hed.py:205\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/hed.py"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a2e2844c3692af502273af6025b0a0abd463b9245ef2e6319980e33b6626a6d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/backend/minimax_h3/rocm_causal_conv3d.py:62-68 | invokeai/backend/wan/rocm_causal_conv3d.py:56-62 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/minimax_h3/rocm_causal_conv3d.py"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa1a39275c86b4a2280793fd771bb3a56c3efb26d12e0e850c8f79ec7250e8e2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/backend/model_manager/configs/lora.py:187-193 | invokeai/backend/model_manager/configs/lora.py:200-206 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/lora.py"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c2a7fde9065ea44ef2d68b600793682eae9ad239cb297f7a02bba95c6b1b305"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/flux.py:2239-2245 | invokeai/backend/model_manager/load/model_loaders/flux.py:2295-2312 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/model_manager/load/model_loaders/flux.py:2239\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/model_manager/load/model_loaders/flux.py:2294\u0060 calls \u0060pop\u0060 and \u0060invokeai/backend/model_manager/load/model_loaders/flux.py:2238\u0060 does not \u2014 after which the two agree again for 4 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":2239}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e312b1c71cfed02f30da7399c209bba20eeec323dca49dff1929bbf1e261916"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/flux.py:2272-2278 | invokeai/backend/model_manager/load/model_loaders/flux.py:2298-2317 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/model_manager/load/model_loaders/flux.py:2272\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":2272}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d8986f2a1d9ee55853199412283e8fd10844799421ea554ece219b70c660ed8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/backend/pid/_src/networks/pixeldit_official.py:345-351 | invokeai/backend/pid/_src/networks/pixeldit_official.py:356-362 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pixeldit_official.py"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"368ead0510b47b0f629bed0132a0470bbdb93181c9116e7d980bfb1818eac09d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/backend/stable_diffusion/diffusers_pipeline.py:593-599 | invokeai/backend/stable_diffusion/extensions/rescale_cfg.py:21-27 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusers_pipeline.py"},"region":{"startLine":593}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e4cf6ca6cff3c04d529d746c16218901cabd2660f73fa95fed911afa5179853"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/backend/z_image/z_image_control_transformer.py:279-285 | invokeai/backend/z_image/z_image_patchify_utils.py:70-76 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_transformer.py"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0477d752149ee11c7a1bc93ae881093235c930ba42178b8c226e54eede25552"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 6): invokeai/app/invocations/pid/flux2_pid_decode.py:242-247 | invokeai/app/invocations/pid/flux_pid_decode.py:165-170 | invokeai/app/invocations/pid/qwen_image_pid_decode.py:231-236 | invokeai/app/invocations/pid/sd3_pid_decode.py:154-159 | invokeai/app/invocations/pid/sdxl_pid_decode.py:204-209 | invokeai/app/invocations/pid/z_image_pid_decode.py:221-227 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/pid/flux2_pid_decode.py\u0060 and \u0060invokeai/app/invocations/pid/flux_pid_decode.py\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/invocations/pid/flux2_pid_decode.py:242\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/pid/flux2_pid_decode.py"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9084a5221b744620f47ce054f4b8ad4501bb4dd237359e5403d6feed3860dc4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 5): invokeai/app/invocations/text_encoder/anima_text_encoder.py:288-293 | invokeai/app/invocations/text_encoder/flux2_dev_text_encoder.py:258-263 | invokeai/app/invocations/text_encoder/flux2_klein_text_encoder.py:215-220 | invokeai/app/invocations/text_encoder/z_image_text_encoder.py:215-220 | invokeai/app/invocations/z_image/z_image_denoise.py:919-924 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 5 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 5 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/anima_text_encoder.py"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"f247106237e4155fab393a510d294afc15927a0ed9817fd23e0305d8b10b4748"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): invokeai/app/invocations/krea2/krea2_denoise.py:884-889 | invokeai/app/invocations/qwen_image/qwen_image_denoise.py:568-573 | invokeai/app/invocations/text_encoder/krea2_text_encoder.py:129-134 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/krea2/krea2_denoise.py"},"region":{"startLine":884}}}],"partialFingerprints":{"codehealthFindingId/v1":"43cdd4c5dad4cb153cb0eab6bc0dc5a93de4e691960d2e87147d09736559188d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): invokeai/app/services/shared/execution_engine/child.py:40-45 | invokeai/app/services/shared/execution_engine/primitives.py:99-104 | invokeai/app/services/shared/execution_engine/scheduler.py:47-52 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/execution_engine/child.py"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"38febe73ebb21396735bbba31da1388b46eec871fbc1ccd0ad2ba01aaaaae6b0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): invokeai/backend/flux/controlnet/instantx_controlnet_flux.py:56-61 | invokeai/backend/flux/controlnet/xlabs_controlnet_flux.py:36-41 | invokeai/backend/flux/model.py:54-59 \u2014 before extracting anything, compare \u0060invokeai/backend/flux/controlnet/instantx_controlnet_flux.py\u0060 and \u0060invokeai/backend/flux/controlnet/xlabs_controlnet_flux.py\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 57 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/controlnet/instantx_controlnet_flux.py"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad272fcdc1bad718a28691c7fc2df61e5f9fe8870e357f6181bf6df573fae1dd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): invokeai/backend/model_manager/load/model_loaders/vae.py:396-401 | invokeai/backend/model_manager/load/model_loaders/vae.py:520-525 | invokeai/backend/model_manager/load/model_loaders/wan.py:535-540 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/model_manager/load/model_loaders/vae.py:519\u0060 calls \u0060_wan_family_dtype\u0060 and \u0060invokeai/backend/model_manager/load/model_loaders/vae.py:394\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/vae.py"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"e84bf07a49e58b616427371fcb90caff014a667548c921b62f3673e2eaaf19fa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/app/api/routers/model_manager.py:910-915 | invokeai/app/api/routers/model_manager.py:955-960 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/model_manager.py"},"region":{"startLine":910}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4c5bddca50258b142923930e0fe68f5850b9e329d62b365c90e9cfbd8f9f166"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/app/invocations/baseinvocation.py:762-767 | invokeai/app/invocations/baseinvocation.py:890-895 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060cls\u0060 to \u0060Type[TBaseInvocation]\u0060 in one and \u0060Type[TBaseInvocationOutput]\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/baseinvocation.py"},"region":{"startLine":762}}}],"partialFingerprints":{"codehealthFindingId/v1":"efb54f3f5663e07b75443dcdd6191f39ceeaa1c0aa032e61ca714624f7489e19"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/app/invocations/flux/flux_denoise.py:586-592 | invokeai/app/invocations/flux2/flux2_denoise.py:797-802 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/app/invocations/flux/flux_denoise.py:583\u0060 calls \u0060isinstance\u0060 and \u0060invokeai/app/invocations/flux2/flux2_denoise.py:794\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux/flux_denoise.py"},"region":{"startLine":586}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd3ee2063096393ea68bd47740775fe7e03c98d26e4d236a5e7afc5dcd61f8be"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/app/invocations/krea2/krea2_model_loader.py:86-95 | invokeai/app/invocations/qwen_image_2_1/qwen_image_2_1_model_loader.py:79-84 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/krea2/krea2_model_loader.py"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8aeb5e526379b92ed6b340f567dc3bccba882db9b412200cc84065ea10cd639"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/app/invocations/sd/create_denoise_mask.py:61-66 | invokeai/app/invocations/sd/create_gradient_mask.py:193-198 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/create_denoise_mask.py"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cd8710d883da0af1830fae6d71be583c2777f674996fa0ff63d3c8625ba14c7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/app/services/image_files/image_files_disk.py:411-416 | invokeai/app/services/video_files/video_files_disk.py:163-168 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/app/services/image_files/image_files_disk.py:419\u0060 calls \u0060__persist_journal_directory\u0060 and \u0060invokeai/app/services/video_files/video_files_disk.py:169\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_files/image_files_disk.py"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"91846af18014542b7a68cac08e747c21a59a851722381e1a5f703d8cb6a19e3a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/app/services/session_queue/session_queue_default.py:903-908 | invokeai/app/services/session_queue/session_queue_default.py:948-953 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/session_queue/session_queue_default.py"},"region":{"startLine":903}}}],"partialFingerprints":{"codehealthFindingId/v1":"d42fe7060e42bf5b7f03c0d98963d23878b3b6804174a4cc64824ff3327c0752"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/app/services/shared/database/queries/images.py:521-526 | invokeai/app/services/shared/database/queries/videos.py:460-465 \u2014 before extracting anything, compare \u0060invokeai/app/services/shared/database/queries/images.py\u0060 and \u0060invokeai/app/services/shared/database/queries/videos.py\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 44 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/queries/images.py"},"region":{"startLine":521}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea5c975928bd8262b51281e29824eaf05be1171e8768ccc17fc1120b77c6ba2e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/app/services/shared/execution_engine/scheduler.py:365-370 | invokeai/app/services/shared/execution_engine/scheduler.py:410-415 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/execution_engine/scheduler.py"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8a7d4338860a272af716b909a34b878a4e7ef9b2d57503a90f08d67a2d13d21"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/app/services/shared/graph.py:418-423 | invokeai/app/services/shared/graph.py:430-435 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"becd65156eeb53da9cd09ea0b003f80c5790534d8a4a6207a6c6aaa12ad8a09a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/app/services/shared/graph.py:2292-2297 | invokeai/app/services/shared/graph.py:3722-3728 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/shared/graph.py:2292\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":2292}}}],"partialFingerprints":{"codehealthFindingId/v1":"4045ae321a850ce3f3dea517ae3573388d2b5d1d691aac9962ef1fdb3e6ba856"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/app/services/shared/graph.py:2294-2299 | invokeai/app/services/shared/graph.py:3999-4004 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/shared/graph.py:2294\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":2294}}}],"partialFingerprints":{"codehealthFindingId/v1":"a44d2ff9050ac9c13c358a78c1c41103d51d5ce9e0e4a1254b336239c8c706ed"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/app/services/shared/graph_iterator_ancestry.py:82-87 | invokeai/app/services/shared/graph_iterator_ancestry.py:141-146 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_iterator_ancestry.py"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4cfea3edf7888c1e6c247c6a11393a982af47dd385411a332e3f25a56055031"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/app/util/user_management.py:82-87 | invokeai/app/util/user_management.py:144-149 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/user_management.py"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"9211235fed1e4c063e5cd292eb97dd7933ff9609990e4ff9cae363f8d39dc062"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/app/util/user_management.py:450-455 | invokeai/app/util/user_management.py:551-556 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/user_management.py"},"region":{"startLine":450}}}],"partialFingerprints":{"codehealthFindingId/v1":"38fd7311951d0b9f9b1cfa492ea0ef4911d4bc13f71984069d495e8635210ecd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/backend/flux/custom_block_processor.py:35-40 | invokeai/backend/flux/ip_adapter/ip_double_stream_block_processor.py:49-55 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/flux/ip_adapter/ip_double_stream_block_processor.py:49\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/custom_block_processor.py"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9c3251348b35092a29d0e00044c77ee75f17abf94a836b6a9ab22c4ba15214c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/backend/flux/custom_block_processor.py:35-40 | invokeai/backend/flux/modules/layers.py:164-169 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/custom_block_processor.py"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"710af37a53958faf661850085f765b4c5156758ddd9c600091d37534a76b2f52"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/backend/image_util/dw_openpose/utils.py:140-145 | invokeai/backend/image_util/dw_openpose/utils.py:153-158 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/dw_openpose/utils.py"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"49f16c3a36cbb36dd67e6e991800fd2059fe54ad86d98896e90cc5b9ae760f8f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py:1313-1318 | invokeai/backend/model_manager/load/model_loaders/qwen_image.py:330-335 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py"},"region":{"startLine":1313}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8cda878a9a5a25b0b176c8ea8fe3132493ad6c07c1d344e2ee2b674c3e71880"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/z_image.py:1054-1059 | invokeai/backend/model_manager/load/model_loaders/z_image.py:1063-1068 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":1054}}}],"partialFingerprints":{"codehealthFindingId/v1":"eca1e055162421dea50a42921c9bde01ef976789a5892f31532ac469c953ac9c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/backend/patches/lora_conversions/flux_kohya_lora_conversion_utils.py:143-148 | invokeai/backend/patches/lora_conversions/flux_kohya_lora_conversion_utils.py:171-176 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/lora_conversions/flux_kohya_lora_conversion_utils.py"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9b9af51a21d98f08a3f37e05c1444f9669d3c9b9dcfc234459032371a7c03cc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/backend/quantization/gguf/utils.py:156-161 | invokeai/backend/quantization/gguf/utils.py:183-188 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/gguf/utils.py"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"745a37f4d177b871bab87f089cb302c7da29d3c822f7c9fd468ba661f4ac64ac"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/backend/rectified_flow/er_sde_scheduler.py:425-430 | invokeai/backend/rectified_flow/er_sde_scheduler.py:477-482 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/rectified_flow/er_sde_scheduler.py:476\u0060 calls \u0060_sigma_to_alpha_sigma_t\u0060 and \u0060invokeai/backend/rectified_flow/er_sde_scheduler.py:423\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/rectified_flow/er_sde_scheduler.py"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"794e4e10b43f7adbfa01bf2420892929fff30616a2d16387b3ca7490e60dd7ce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/backend/stable_diffusion/diffusion/custom_atttention.py:125-130 | invokeai/backend/stable_diffusion/extensions/ip_adapter.py:276-283 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/stable_diffusion/diffusion/custom_atttention.py:125\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusion/custom_atttention.py"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f2b587370fd14c7b63fa42895f8b3270aae13c737b2323fea2f36f1b62d011b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/backend/z_image/z_image_control_transformer.py:542-547 | invokeai/backend/z_image/z_image_controlnet_extension.py:308-315 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/z_image/z_image_controlnet_extension.py:308\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/z_image/z_image_control_transformer.py:541\u0060 calls \u0060all\u0060 and \u0060invokeai/backend/z_image/z_image_controlnet_extension.py:307\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_transformer.py"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e0e4ddafeb2384b7641b0fb2dcde1fc21c705aaa324a888816c4d04c73f99f7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): scripts/calibrate_flux2_working_memory.py:420-425 | scripts/calibrate_z_image_working_memory.py:205-210 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/calibrate_flux2_working_memory.py"},"region":{"startLine":420}}}],"partialFingerprints":{"codehealthFindingId/v1":"602d4d045121d3b48f5951aa6642a2f9599b093b7ee6352674472502293e99e0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 7): invokeai/app/util/user_management.py:124-128 | invokeai/app/util/user_management.py:164-168 | invokeai/app/util/user_management.py:241-245 | invokeai/app/util/user_management.py:289-293 | invokeai/app/util/user_management.py:474-478 | invokeai/app/util/user_management.py:524-528 | invokeai/app/util/user_management.py:581-585 \u2014 all 7 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/user_management.py"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f80e59a57cbb763f7b3cd5213e1821186c2e6dbae28e624a6e6ba008fa733e1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4): invokeai/app/invocations/ltx2/ltx2_lora_loader.py:98-102 | invokeai/app/invocations/ltx2/ltx2_lora_loader.py:160-164 | invokeai/app/invocations/minimax_h3/minimax_h3_lora_loader.py:91-95 | invokeai/app/invocations/minimax_h3/minimax_h3_lora_loader.py:153-157 \u2014 \u0060invokeai/app/invocations/ltx2/ltx2_lora_loader.py\u0060 and \u0060invokeai/app/invocations/minimax_h3/minimax_h3_lora_loader.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 4 separate duplicated blocks between them, totalling at least 30 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/ltx2/ltx2_lora_loader.py"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdf16a658e5ce6a06f57202a83482dc3466b66b62748126e4584c0ac94b1cf3b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4): invokeai/backend/pid/_src/networks/pid_net.py:374-378 | invokeai/backend/pid/_src/networks/pid_net.py:410-414 | invokeai/backend/pid/_src/networks/pixeldit_official.py:1469-1473 | invokeai/backend/pid/_src/networks/pixeldit_official.py:1494-1498 \u2014 there are 4 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pid_net.py"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"db01914613a876ad75729c7993c0246cb50790861fb5b680ad8712a776157b93"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): invokeai/backend/flux/custom_block_processor.py:42-46 | invokeai/backend/flux/ip_adapter/ip_double_stream_block_processor.py:57-61 | invokeai/backend/flux/modules/layers.py:171-175 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/flux/ip_adapter/ip_double_stream_block_processor.py:57\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/custom_block_processor.py"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"43d156b4f78e2c922ee75adb4de090c58d23efa831bd97764fc1a68bb8965f81"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): invokeai/backend/minimax_h3/taehv_decoder.py:82-86 | invokeai/backend/minimax_h3/taehv_decoder.py:88-92 | invokeai/backend/minimax_h3/taehv_decoder.py:94-98 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/minimax_h3/taehv_decoder.py"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"c09280ff98fafb4099440d13d03cb00bb74d1d6971501c6a0d3172cecc29a702"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (3\u20135 lines \u00D7 4): invokeai/backend/z_image/z_image_control_adapter.py:205-207 | invokeai/backend/z_image/z_image_control_transformer.py:380-385 | invokeai/backend/z_image/z_image_control_transformer.py:512-517 | invokeai/backend/z_image/z_image_control_transformer.py:552-556 \u2014 before extracting anything, compare \u0060invokeai/backend/z_image/z_image_control_adapter.py\u0060 and \u0060invokeai/backend/z_image/z_image_control_transformer.py\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 66 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_adapter.py"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec1d9b9d91edd4ac1d949bf169bdbe6b09a9ac37d1ec718f686342d30a2525a6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/app/api/routers/utilities.py:530-534 | invokeai/app/api/routers/utilities.py:647-651 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060body\u0060 to \u0060ExpandPromptRequest\u0060 in one and \u0060ImageToPromptRequest\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/utilities.py"},"region":{"startLine":530}}}],"partialFingerprints":{"codehealthFindingId/v1":"546b16d1d2dc24d784b6a03697c9384cc9f9c1a56edb1e9a2a81cd8ad29258df"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/app/api/routers/utilities.py:540-544 | invokeai/app/api/routers/utilities.py:656-660 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/utilities.py"},"region":{"startLine":540}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fe57eacbefb23dd65d7bf2071371030de43ac6d29980a9dba81e84ff4cffeee"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/app/invocations/metadata_linked.py:529-533 | invokeai/app/invocations/metadata_linked.py:585-589 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/metadata_linked.py"},"region":{"startLine":529}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bbccfa3fcac63237ec99792fbf174af4fd150400778649da5fa46852c588ac3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/app/invocations/wan/wan_lora_loader.py:193-197 | invokeai/app/invocations/wan/wan_lora_loader.py:274-282 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/wan/wan_lora_loader.py"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"e39de6804831c5cb380d53979ae45dcaa7f990c196783213477628fb0e0dbf4a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/app/services/image_records/image_records_common.py:176-184 | invokeai/app/services/video_records/video_records_common.py:107-111 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_records/image_records_common.py"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"78520f9539f7430f49da37921709dd73b1c98402e002478dbbd18fae7992db72"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/app/services/shared/execution_engine/child.py:60-64 | invokeai/app/services/shared/execution_engine/primitives.py:61-65 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/execution_engine/child.py"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"63487f6136b6f3281bb53316c13ee9809ec401b06fd27236321d34bf321d2640"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/app/services/shared/execution_engine/child.py:67-71 | invokeai/app/services/shared/execution_engine/primitives.py:68-72 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/execution_engine/child.py"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1ca65b5a97109be51a00d1ced2c300d595bc5e3d7aa347fab28803c7354d73c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/app/util/database_copy.py:174-178 | invokeai/app/util/database_copy.py:257-261 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/database_copy.py"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"4afff4f5623632ec15d7947292640d89c1509456fe64421bc2c98288f1a62483"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/backend/flux/controlnet/state_dict_utils.py:120-124 | invokeai/backend/flux/controlnet/state_dict_utils.py:151-169 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/flux/controlnet/state_dict_utils.py:120\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/controlnet/state_dict_utils.py"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"007866bfd3ab0d0ea75b913af3af7da96785aa724ab8cad1e9b9f1e1816c64ac"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/backend/flux/controlnet/state_dict_utils.py:142-146 | invokeai/backend/model_manager/load/model_loaders/flux.py:2288-2292 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/flux/controlnet/state_dict_utils.py:142\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/controlnet/state_dict_utils.py"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"23df9430e1ce19ba97593cbc7fa3865c9d58070e1fae86a091298cbd98695f70"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (4\u20135 lines \u00D7 3): invokeai/backend/flux/custom_block_processor.py:50-53 | invokeai/backend/flux/ip_adapter/ip_double_stream_block_processor.py:64-70 | invokeai/backend/flux/modules/layers.py:178-182 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/custom_block_processor.py"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"14948014d70f679187cd48ea0503a88806fcc070abaa6538aec7a2e9c43da4d1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/backend/image_util/color_conversion.py:625-629 | invokeai/backend/image_util/color_conversion.py:695-699 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/image_util/color_conversion.py:625\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/color_conversion.py"},"region":{"startLine":625}}}],"partialFingerprints":{"codehealthFindingId/v1":"9221d4746531dc632c436f5d96418b4a7629ebe7d1099f939e97e339213b10d6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/backend/image_util/color_conversion.py:684-688 | invokeai/backend/image_util/color_conversion.py:940-944 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/color_conversion.py"},"region":{"startLine":684}}}],"partialFingerprints":{"codehealthFindingId/v1":"76d263b40be4cc7cf8221ab88ce0013dd48405562d4b3b329baa09675ffb9055"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/backend/image_util/color_conversion.py:691-695 | invokeai/backend/image_util/color_conversion.py:947-951 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/image_util/color_conversion.py:691\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/color_conversion.py"},"region":{"startLine":691}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba68d135af235e4f0b2122854b7ec13b88c48d280ea6c055a306f61aba98a4d7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/backend/image_util/hed.py:128-132 | invokeai/backend/image_util/hed.py:201-205 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/backend/image_util/hed.py:133\u0060 calls \u0060normalize_image_channel_count\u0060, \u0060resize_image_to_resolution\u0060 and \u0060invokeai/backend/image_util/hed.py:207\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/hed.py"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6026977dd431a22b6ec1c87908de2608cf2dc63f0e212abac17578ca2e596b0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/backend/image_util/lineart_anime.py:152-156 | invokeai/backend/image_util/lineart_anime.py:225-229 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/lineart_anime.py"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"c43101d896d53b130c6b2b8c191330f0df4b4bfec57072c04bc46d0b8d70d915"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/backend/image_util/mlsd/utils.py:68-72 | invokeai/backend/image_util/mlsd/utils.py:125-129 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mlsd/utils.py"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"d76bee968821f866bd0dc501ba14cdb2e5320c9ae517703bcb97334f71ecdf8d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/backend/pid/_src/networks/pixeldit_official.py:139-143 | invokeai/backend/pid/_src/networks/pixeldit_official.py:178-182 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060invokeai/backend/pid/_src/networks/pixeldit_official.py:185\u0060 calls \u0060arange\u0060 and \u0060invokeai/backend/pid/_src/networks/pixeldit_official.py:145\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pixeldit_official.py"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"dee0d81222214d3257c7a7157617658c8929f5327ae6a93e0f45ded00c2223c0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/backend/z_image/z_image_control_transformer.py:586-590 | invokeai/backend/z_image/z_image_controlnet_extension.py:341-346 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/z_image/z_image_control_transformer.py"},"region":{"startLine":586}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c5d83fa5bc8cdfae24a6aad7ff4ef18d47eec81f96ebe4261a9d6ffe5310b79"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (132 lines \u00D7 2): invokeai/app/services/image_files/image_files_base.py:14-145 | invokeai/app/services/image_records/image_records_base.py:25-190 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_files/image_files_base.py"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb084d34d6be7757ced88b1e70e2663ca21a7941f7b10ba88702424e37527c1e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (44 lines \u00D7 2): invokeai/app/services/item_storage/item_storage_base.py:16-59 | invokeai/app/services/videos/videos_base.py:26-202 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/item_storage/item_storage_base.py"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"d77f2ff4852bd13e5a01d3b1b8aa0d5b05320319b1bc6e40fbf68a85e0c66ea8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (126 lines \u00D7 3): invokeai/app/services/image_files/image_files_base.py:14-145 | invokeai/app/services/image_records/image_records_base.py:25-190 | invokeai/app/services/video_records/video_records_base.py:21-146 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_files/image_files_base.py"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"8298622d1f78bd9305d7eeb6da61bcd9c056e9bfaf1324f5d14be24b650f5cff"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/app/api/routers/utilities.py:116-128 | invokeai/app/services/fonts/fonts_default.py:660-671 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/utilities.py"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"662e6360f251cf7e4524da2c69856b37662cdd2ab054ccf3a2ba2cf0a3b52dbd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): invokeai/app/api/routers/utilities.py:166-186 | invokeai/app/services/fonts/fonts_parsing.py:35-53 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/utilities.py"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"635a9e9a0960ef99014ec9900748f19e1d8296c590f751ee12dc5dc931a19f66"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/app/invocations/sd/denoise_latents.py:243-251 | invokeai/app/invocations/sd/tiled_multi_diffusion_denoise_latents.py:134-142 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060v\u0060 to \u0060Union[List[float], float]\u0060 in one and \u0060list[float] | float\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/denoise_latents.py"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ce2cd65c031102724b1ff15ea9a27591ca01393cf546c8af5e99100b939a866"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/app/invocations/wan/wan_denoise.py:779-783 | invokeai/app/invocations/wan/wan_video_denoise.py:404-408 \u2014 before extracting anything, compare \u0060invokeai/app/invocations/wan/wan_denoise.py\u0060 and \u0060invokeai/app/invocations/wan/wan_video_denoise.py\u0060 as WHOLE FILES: this scan already matched 7 separate duplicated blocks between them, totalling at least 150 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/wan/wan_denoise.py"},"region":{"startLine":779}}}],"partialFingerprints":{"codehealthFindingId/v1":"c58dc5867e9159eefe539fb2354f810b7682450c3d7ef8fdd1f5883b2079ab14"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): invokeai/app/services/external_generation/external_generation_default.py:355-365 | invokeai/app/services/external_generation/providers/atlascloud.py:358-368 | invokeai/app/services/external_generation/providers/gemini.py:223-233 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/external_generation/external_generation_default.py"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"19f55ddb14492fc8a84ea02d2d147f569ea9132d03924c82abdc56d371ff8ffa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/app/services/gallery_maintenance/gallery_maintenance_default.py:965-971 | invokeai/app/services/video_files/video_files_disk.py:241-247 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/gallery_maintenance/gallery_maintenance_default.py"},"region":{"startLine":965}}}],"partialFingerprints":{"codehealthFindingId/v1":"f64427a35d4eb38a52389b6237d9aac03a4dd88fda950e9d2376dc44fc2f3d44"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/app/services/model_records/model_records_base.py:91-97 | invokeai/backend/model_manager/configs/base.py:88-94 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/model_records/model_records_base.py"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"866e0e83f6c85f1668384ee65404b561f67ae51b72ba38c7e2840840c3396d11"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/app/services/session_processor/workflow_call_batch.py:93-100 | invokeai/app/services/shared/workflow_graph_builder.py:245-252 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/session_processor/workflow_call_batch.py"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d228e2e1f19e81ffff4623b9d0077f0f8b60ce693c00f0944b52c036315acdc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/app/services/shared/database/queries/images.py:503-508 | invokeai/app/services/shared/database/queries/videos.py:442-447 \u2014 before extracting anything, compare \u0060invokeai/app/services/shared/database/queries/images.py\u0060 and \u0060invokeai/app/services/shared/database/queries/videos.py\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 44 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/queries/images.py"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"40c5cdc41ded953ac1b70ec984c74238171c49be78f83b92f931f7a2ad6320dc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/backend/flux/extensions/base_controlnet_extension.py:22-31 | invokeai/backend/flux/extensions/xlabs_ip_adapter_extension.py:32-41 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/extensions/base_controlnet_extension.py"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"951b5d0f5c4e8be14e1712a9b91fbf4ba3238ac0ca9fa0bf6f38843f71ba066a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py:71-87 | invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py:70-86 \u2014 before extracting anything, compare \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py\u0060 and \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py\u0060 as WHOLE FILES: this scan already matched 10 separate duplicated blocks between them, totalling at least 161 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py:71\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb9fe8d8f285da3627f729c48016efd84b92585fdde077aefb253eb1457d0f0c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py:112-119 | invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py:111-118 \u2014 before extracting anything, compare \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py\u0060 and \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py\u0060 as WHOLE FILES: this scan already matched 10 separate duplicated blocks between them, totalling at least 161 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a1d0015c6ddb04ba85505850accc282849a05509a75a706328faf9872bb0cf1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py:235-242 | invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py:235-242 \u2014 before extracting anything, compare \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py\u0060 and \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py\u0060 as WHOLE FILES: this scan already matched 10 separate duplicated blocks between them, totalling at least 161 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py:235\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"86dea3fc65eff8594c318a444f910940cf96bd1e6928c02d11427ad262f0827c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): invokeai/backend/minimax_h3/autoencoder_kl_minimax_h3.py:901-920 | invokeai/backend/minimax_h3/autoencoder_kl_minimax_h3_audio.py:659-678 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/minimax_h3/autoencoder_kl_minimax_h3.py"},"region":{"startLine":901}}}],"partialFingerprints":{"codehealthFindingId/v1":"50bfc73f4225add90efce5f7bc279dcd9c40a1ae419292746d445747a1e43d87"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 10): invokeai/backend/model_manager/configs/controlnet.py:101-105 | invokeai/backend/model_manager/configs/controlnet.py:166-170 | invokeai/backend/model_manager/configs/ip_adapter.py:56-60 | invokeai/backend/model_manager/configs/ip_adapter.py:136-140 | invokeai/backend/model_manager/configs/lora.py:536-540 | invokeai/backend/model_manager/configs/lora.py:601-605 | invokeai/backend/model_manager/configs/lora.py:1476-1480 | invokeai/backend/model_manager/configs/main.py:282-286 | invokeai/backend/model_manager/configs/main.py:1084-1088 | invokeai/backend/model_manager/configs/t2i_adapter.py:53-57 \u2014 there are 10 copies across 5 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 10 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/controlnet.py"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"d85471a4796741ba00f1826a4c02852493f4cbe6878dac80130107071502a927"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/backend/model_manager/configs/main.py:104-114 | invokeai/backend/quantization/sdnq/loaders.py:383-400 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060state_dict\u0060 to \u0060dict[str | int, Any]\u0060 in one and \u0060dict[str, Any]\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"77d1e4b4ef5f97c1e3f93e13a4b384873e08f461af191fa46a1fca892442f137"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 4): invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_conv1d.py:38-43 | invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_flux_rms_norm.py:31-36 | invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_invoke_linear_8_bit_lt.py:62-67 | invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_invoke_linear_nf4.py:89-94 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 4 call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_conv1d.py"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"b897bdaaa20871116985500445cd866f7b99150537cede5fa70773a45ab3fa84"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 4): invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_diffusers_rms_norm.py:34-40 | invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_embedding.py:23-29 | invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_group_norm.py:16-22 | invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_layer_norm.py:19-25 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 4 call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_diffusers_rms_norm.py"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0d16ed1f0ba26d0c99274d1a3c0b3c301cd17b7a9525a2aaedd594aeb18de33"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 6): invokeai/backend/model_manager/load/model_loaders/anima.py:178-187 | invokeai/backend/model_manager/load/model_loaders/flux.py:1025-1034 | invokeai/backend/model_manager/load/model_loaders/flux.py:1071-1080 | invokeai/backend/model_manager/load/model_loaders/qwen_image.py:208-217 | invokeai/backend/model_manager/load/model_loaders/z_image.py:463-472 | invokeai/backend/model_manager/load/model_loaders/z_image.py:738-747 \u2014 there are 6 copies across 4 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 6 sites; resolving a subset leaves the remainder to drift apart. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/anima.py"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"067bd7e9258d2847a339ba48a8c062e51d455120ec2db7ddef41958c3b6354fb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): invokeai/backend/patches/lora_conversions/anima_lora_conversion_utils.py:216-228 | invokeai/backend/patches/lora_conversions/z_image_lora_conversion_utils.py:195-210 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/lora_conversions/anima_lora_conversion_utils.py"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"844cd666ed0b301ff3072ef49a415f130a515989db2ea07601e5b34360ca2c2d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): invokeai/backend/patches/lora_conversions/ltx2_lora_conversion_utils.py:119-134 | invokeai/backend/patches/lora_conversions/minimax_h3_lora_conversion_utils.py:171-186 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/lora_conversions/ltx2_lora_conversion_utils.py"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8c4e26d1ccf1355d19a1bb2580bd7678a071fab1a27a3f6825f9e0ba89b1e20"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/app/api/routers/board_images.py:92-102 | invokeai/app/api/routers/videos.py:155-165 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/board_images.py"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"98583d0d5567ad43997a3182dd1330d4fdea5b73fe1a4469895dd087b979a300"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): invokeai/app/invocations/flux/flux_controlnet.py:90-100 | invokeai/app/invocations/sd/controlnet.py:102-112 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux/flux_controlnet.py"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"0154ec251e85a656ccb3d439819f1478c86b6e09205ad9558f4d388d43f107ab"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/app/services/board_image_records/board_image_records_default.py:40-45 | invokeai/app/services/board_video_records/board_video_records_default.py:27-32 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/board_image_records/board_image_records_default.py"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"e19ace29642964075d9c7c1fe40cac4ac93fa71e864294fed5ccb9e5b4bdb6b6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/app/services/download/download_default.py:369-376 | invokeai/app/services/model_install/model_install_default.py:1232-1239 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on. Note first that the copies are not typed on the same thing: the declarations holding them bind \u0060job\u0060 to \u0060DownloadJobBase\u0060 in one and \u0060ModelInstallJob\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/download/download_default.py"},"region":{"startLine":369}}}],"partialFingerprints":{"codehealthFindingId/v1":"dca508cce3f1b140acff3ca36e6ec7856c9bc6f004a3d38265ac79bbdd949266"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/app/services/shared/execution_engine/child.py:26-30 | invokeai/app/services/shared/execution_engine/primitives.py:33-37 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/execution_engine/child.py"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc9cf1da3114fe390cf3301ccd66523daae6fe66bf908fd88ba58da7bb57a04d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 12): invokeai/app/services/shared/sqlite_migrator/migrations/migration_10.py:22-37 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_13.py:19-33 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_14.py:49-63 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_15.py:21-36 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_16.py:19-33 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_17.py:22-37 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_18.py:31-49 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_4.py:72-85 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_5.py:21-36 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_6.py:48-64 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_7.py:74-90 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_9.py:17-31 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 12 call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_10.py"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5b77ad2f7bbd9ad5f08accf2c82efacefd74cc9326b947cc073edfe7e5585e7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 3): invokeai/app/services/shared/sqlite_migrator/migrations/migration_11.py:61-77 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_2.py:143-168 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_3.py:57-72 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_11.py"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"157237daf9eef7b8d1a6ae32b03a8f5caf949e6e6a8842e316b1c5273b7e648e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): invokeai/app/services/shared/sqlite_migrator/migrations/migration_12.py:24-37 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_8.py:78-93 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on. Note first that the copies are not typed on the same thing: \u0060InvokeAIAppConfig\u0060 names \u0060invokeai.app.services.config\u0060 in one and \u0060invokeai.app.services.config.config_default\u0060 in another \u2014 different types that share a simple name, which is why the text matched. A single extracted unit cannot be given a parameter type that fits both, so unifying those types (or introducing a shared abstraction over them) is the step that has to come BEFORE the extraction above; if they are deliberately separate, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_12.py"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d65763de9443d4956e50870f1a9e18b3e6128183445234c0543bc45b67aecd8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 5): invokeai/app/services/shared/sqlite_migrator/migrations/migration_22.py:78-91 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_23.py:184-195 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_24.py:228-250 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_25.py:51-63 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_26.py:104-117 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 5 call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_22.py"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"2920ad84ea109be6626686848365c4731a62ee52731afc373e3aca7460271285"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/app/services/style_preset_images/style_preset_images_disk.py:37-44 | invokeai/app/services/workflow_thumbnails/workflow_thumbnails_disk.py:36-43 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/style_preset_images/style_preset_images_disk.py"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"603d68da7e1a0047ee12d89679fecf6c3d1755eda9af3728c885eb88a8ff5704"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): invokeai/app/services/style_preset_images/style_preset_images_disk.py:69-80 | invokeai/app/services/workflow_thumbnails/workflow_thumbnails_disk.py:72-83 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/style_preset_images/style_preset_images_disk.py"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"025742508d68d44ea8ef765913bf11e7e5bc85a50f2bf1d0f13a893574a42c8a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): invokeai/backend/model_manager/configs/flux_redux.py:33-40 | invokeai/backend/model_manager/configs/ltx2_duration_head.py:33-40 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/flux_redux.py"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fc9b3c639e2162649ebf49a07e49b7647dc05cf82f3f7e1bd38a51a9350aaab"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): invokeai/backend/model_manager/load/model_loaders/ltx2.py:422-430 | invokeai/backend/model_manager/load/model_loaders/minimax_h3.py:193-201 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/ltx2.py"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"b80c6a6ad072f463261c2c2bfb56f452637b15bbfd8b65763a1cf97da1c45c9e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): invokeai/backend/patches/lora_conversions/qwen_image_lora_conversion_utils.py:61-77 | invokeai/backend/patches/lora_conversions/wan_lora_conversion_utils.py:158-167 \u2014 before extracting anything, compare \u0060invokeai/backend/patches/lora_conversions/qwen_image_lora_conversion_utils.py\u0060 and \u0060invokeai/backend/patches/lora_conversions/wan_lora_conversion_utils.py\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 72 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/lora_conversions/qwen_image_lora_conversion_utils.py"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"7aa7d45ffebea183266fae02d4432febff886762aa2144323d1e2190d4ba3539"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/app/api/routers/image_map.py:524-529 | invokeai/app/api/routers/image_map.py:561-566 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/api/routers/image_map.py:524\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/image_map.py"},"region":{"startLine":524}}}],"partialFingerprints":{"codehealthFindingId/v1":"29ec9d42b1c06b7e2fa99c6beec57b7aa27162e14e48980dbcfca9a53333d585"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/app/invocations/metadata_linked.py:777-781 | invokeai/app/invocations/metadata_linked.py:849-853 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/metadata_linked.py"},"region":{"startLine":777}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bd004281052b6dffb5bbd607771d7ce148c30524e9a5fed4e50e88dc451edf6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/app/services/external_generation/providers/atlascloud.py:350-354 | invokeai/app/services/external_generation/providers/gemini.py:208-212 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/external_generation/providers/atlascloud.py"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ca641fdeef508c0c44d6035fb7d101d49bddfe0a9add04a14ea46ee00dbefc0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/app/services/shared/database/queries/images.py:326-330 | invokeai/app/services/shared/database/queries/videos.py:282-286 \u2014 before extracting anything, compare \u0060invokeai/app/services/shared/database/queries/images.py\u0060 and \u0060invokeai/app/services/shared/database/queries/videos.py\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 44 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/queries/images.py"},"region":{"startLine":326}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cfde79f88da9b96457944765827bfdfeac6495c27185e7fb7f988f397115707"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_10_10_board_roles.py:47-53 | invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_10_10_project_workspaces.py:27-33 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_10_10_board_roles.py:47\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_10_10_board_roles.py"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"02a25b4d7645af5b270d96fd3fae9b7df1fe6974b46910e7f66938dfc7626cba"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/app/util/aac_splice.py:192-196 | invokeai/app/util/h264_splice.py:240-244 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/aac_splice.py"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b24438cc489ca16b2c4035d9183a06f6672a50444cc7ec02c5ab9a36c8619c4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): invokeai/backend/pid/_src/networks/pid_net.py:480-484 | invokeai/backend/pid/_src/networks/pixeldit_official.py:1527-1531 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pid_net.py"},"region":{"startLine":480}}}],"partialFingerprints":{"codehealthFindingId/v1":"130fac6ba5a5f7e4b7bbd60a56ab0113edd904f1213725a5bf2730da9b7315a1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/backend/pid/_src/networks/pixeldit_official.py:145-151 | invokeai/backend/pid/_src/networks/pixeldit_official.py:187-193 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060invokeai/backend/pid/_src/networks/pixeldit_official.py:184\u0060 calls \u0060arange\u0060 and \u0060invokeai/backend/pid/_src/networks/pixeldit_official.py:143\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pixeldit_official.py"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"65d8e924d3ede0c74abc0a96716a765611381c1a0e953db65d864d1dc541b29e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): invokeai/backend/pid/_src/networks/pixeldit_official.py:881-887 | invokeai/backend/pid/_src/networks/pixeldit_official.py:1000-1006 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/networks/pixeldit_official.py"},"region":{"startLine":881}}}],"partialFingerprints":{"codehealthFindingId/v1":"e499316a41bd4fed09ef423002f50f0d489d21f6fd729bfc8b03aac0ff75f227"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): invokeai/backend/wan/rocm_causal_conv3d.py:72-77 | invokeai/backend/wan/rocm_causal_conv3d.py:104-109 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/wan/rocm_causal_conv3d.py"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab37d8981bced3ed308b7db6ac25d4b387d153123c83bd61495ddb21464d66cd"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: PixelDiTModel (LCOM4 4): PixelDiTModel\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":"invokeai/backend/pid/_src/models/pixeldit_model.py"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad8e738ba8c4c1017aa6d9ad6727fceb6be003360dc112aba0b129ecca35192b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: FilterType: 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":"invokeai/frontend/webv1/src/features/controlLayers/store/types.test.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e5ff0fbaf7897a1a295ea466cf5a2e42bb37427146f555eba87f50af5f37425"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: IP Adapter Method: 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":"invokeai/frontend/webv1/src/features/controlLayers/store/types.test.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"70555c98ba4bb0dd76e2b51502e268ae7695f38840544b327f4c555ad60cb69e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: CLIP Vision Model: 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":"invokeai/frontend/webv1/src/features/controlLayers/store/types.test.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0d211ee7c749418551385705255e005fe6f8cdc9949489584bbb62f038f96d7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Control Mode: 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":"invokeai/frontend/webv1/src/features/controlLayers/store/types.test.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a45cf60566d91fe1441bfdc408a91358c2b66cdc1fb140094c7716f95c778e2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: DepthAnything Model Size: 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":"invokeai/frontend/webv1/src/features/controlLayers/store/types.test.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"07ef1be595983343bf2c6ccbf310693caeb3bbdba39c508def19e8593714a147"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: Processor Configs: 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":"invokeai/frontend/webv1/src/features/controlLayers/store/types.test.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"249b6efb8ca34c176772bac01bd9307211694a105395356c8d62425a9e0ebed4"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: CanvasEntityIdentifier: 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":"invokeai/frontend/webv1/src/features/controlLayers/store/types.test.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6888a8ed661154429a582c366b2589ff8a6e976959194d1079361ed0c8b9338"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the initial state aligned with the persisted schema: 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":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.test.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"065d4f0692e5ef285c1a06eba6e9b2456417e9860ef3065150c612e6b30fa41c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the initial state aligned with the persisted schema: 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":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSettingsSlice.test.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"aad2efd227bfd63efc307db4ed0383637eff8144e852b706bef259cc10cf6604"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: BoardRecordOrderBy: 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":"invokeai/frontend/webv1/src/features/gallery/store/types.test.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6950012ed1be4dcfbb0623b452ec654f496a448e592b0900a140ac50991bd47"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should narrow the type of the element if a type guard is provided and the element matches: 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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/form-manipulation.test.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"b72bb270849389af8332b84dd1aea6fb576b9c2d19ea3872c20001b0961dfc0e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: should infer field names: 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.test.ts"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"7225b4fdcf3284fe8a11af66d999a78d4b3822ecb9d03813914ea9c27a32e432"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: covers all runtime config image subfolder strategies exposed by the API: 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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageSubfolderStrategySelect.test.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"76e47272f2edc92199c250cf5a370df3c43a9125786ffcf138900876a03c0933"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: starts the next test with an element at the iframe corner reachable: 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":"invokeai/frontend/webv2/src/architecture/browserTestViewport.browser.test.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"44ef852e4dbdfde8e1eccb4a71c6c485a95559b5acab2e47c23a05252d208ed0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens an empty library on Add Fonts, and its empty state leads back there: 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":"invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.browser.test.tsx"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"48ca324c5ab105dd5a71778ed5022e497e90b63ba68df4db878e350680d45d7c"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: accepts an optional nullable expansion seed: 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":"invokeai/frontend/webv2/src/features/generation/data/promptUtilities.test.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"3728e3577d1ee3c666f3aaeea8aceed9610cb5aeddc19f6e7fe381df17bb314a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: requires the backend-selected expansion seed in responses: 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":"invokeai/frontend/webv2/src/features/generation/data/promptUtilities.test.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"188fa9f0113c489754580b3820f4c3e84cf16d5cfc128a105ea7b18b4104ec5a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: hands focus to the picker the last row was excluded from once that row is removed: 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":"invokeai/frontend/webv2/src/features/generation/ui/shared/ConceptRow.browser.test.tsx"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7bbb0be63b1608f9b20372744482178473999e01796c91d1e64785f8f9674cd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: reaches Add Models from the library header: 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":"invokeai/frontend/webv2/src/features/models/ui/ModelManagerDrafts.browser.test.tsx"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c7e5f97d6ea9ea96c810fd2e094546ca3271a71ca24fa2fa25039849f6229de"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the detail when a model is opened from elsewhere, such as the install queue: 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":"invokeai/frontend/webv2/src/features/models/ui/ModelManagerDrafts.browser.test.tsx"},"region":{"startLine":584}}}],"partialFingerprints":{"codehealthFindingId/v1":"41b43fcc1bc683565f59ab32616e3e2d3fd3bdd05d906604ca35b22e42bcf220"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens a non-empty library on the list: 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":"invokeai/frontend/webv2/src/features/models/ui/ModelManagerDrafts.browser.test.tsx"},"region":{"startLine":622}}}],"partialFingerprints":{"codehealthFindingId/v1":"e80864f350f4a34a5162a012c2f2913a916b8cee8e318e52896f38a82c43a1f1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: stays on the list, now empty, when the last model is deleted: 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":"invokeai/frontend/webv2/src/features/models/ui/ModelManagerDrafts.browser.test.tsx"},"region":{"startLine":652}}}],"partialFingerprints":{"codehealthFindingId/v1":"9091465d9320cb3d041c8e0df09bf007f0d9060fb9b5ecc0a08a7259c0631aeb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows compatible installed models through the public picker: 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":"invokeai/frontend/webv2/src/features/models/ui/components/ModelSelect.browser.test.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d200638944c29a47d3165e54cc5660f3a9d2b702830e324728bc719d48afc50"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: remembers the base filter across a close and reopen: 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":"invokeai/frontend/webv2/src/features/models/ui/components/ModelSelect.browser.test.tsx"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2181bfc9c27e124d056cea8c13b4274ac44d36ffcf8f5d24fc13bb7d53b9fdd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens a non-empty library on the list: 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":"invokeai/frontend/webv2/src/features/nodes/ui/NodeManagerView.browser.test.tsx"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e1fed3ab205249096b9505f326e86c2a2eb0d72f8188128e655283cffcc5aee"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: stays on the list, now empty, when the last pack goes: 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":"invokeai/frontend/webv2/src/features/nodes/ui/NodeManagerView.browser.test.tsx"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcf4786de900c9ba2be4c1725ced2b28426a77a21126d4f6333130bdf0ac46d1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens the detail from the Add shortcut, shown only when the panes take turns: 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":"invokeai/frontend/webv2/src/platform/ui/ManagerLayout.browser.test.tsx"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"73c4096b9c272d4925670b33320401e37e0b69d2a69440b9de8a8bfc1c510495"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: hides the hairlines either side of a pointed row, stacked or virtualized: 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":"invokeai/frontend/webv2/src/platform/ui/list/ListChrome.browser.test.tsx"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"eae41120433f5564fe7c2867ccbdbf5cf1f2c5c4c942dbef9146c7453bbd1e5a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: dismisses only the language list with Escape and retains dialog focus: 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":"invokeai/frontend/webv2/src/platform/ui/settings/SettingsSelect.browser.test.tsx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"45a204e3f0db42d716b732479d2f7d619f70e9d5fbf08a7e2e8ae65f4c228833"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: composites two rasters over the checkerboard: 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/golden/compositeGolden.browser.test.ts"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"11b07982abe59061fa20dcd14c8bc9f37405c5ab422a5d905f5d36847a004a36"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: blends the upper raster with ${blendMode}: 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/golden/compositeGolden.browser.test.ts"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0c980e9bbe987c9fd79cc401216be6d6e0ab3996e64901bc5a98d80dd969740"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: applies layer opacity: 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/golden/compositeGolden.browser.test.ts"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9c67cdc3fcc464321d4dbad127400e02ccd8a25f69f79bfa700ddd4ce9808cf"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: rotates a layer through its transform: 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/golden/compositeGolden.browser.test.ts"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"eac3ce2f9a756271b101556ff76fc4d90e09a0aecc244b14f386f17bdcf84e57"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: clips document layers to the clip rect but not the checkerboard: 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/golden/compositeGolden.browser.test.ts"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"a10051e08b853ca940bc07884a5a6484be12528aa9dc305d3089349420a6c622"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: colorizes an inpaint mask with a ${style} fill: 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/golden/compositeGolden.browser.test.ts"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc8c476b4faa96078b123db953031ee241302f5569789acc135ad1a53592271d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: skips a hidden control layer normally but draws it while isolated: 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/golden/compositeGolden.browser.test.ts"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d7bfbabe5724bd69ab4f6ac74b46b433ca158b005777bb31c9e4482dd286e39"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: renders the generation base from enabled raster layers only: 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/golden/compositeGolden.browser.test.ts"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecd27fedb3627f1cc0b4c34778966853c4f8327d1d0f47e8b5c069132f5197c1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: requires preview commit callbacks to be synchronous: 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/operationController.test.ts"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"931994f70f93e068d314f08a41b12c2378ab5cd32de097d6b4e11d0342b212c7"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: skips hidden regions, stops at edges, and enters the center without an initial target: 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":"invokeai/frontend/webv2/src/workbench/hotkeys/WorkbenchNavigation.browser.test.tsx"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"db8878ed4d61ca62b529afa0d0b2c81fea5a99ddc786af6adc9954a6f5e689a8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: loads the link when assistive technology opens the menu without hovering or focusing the trigger: 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":"invokeai/frontend/webv2/src/workbench/launchpad/HelpMenu.browser.test.tsx"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"158505dafb94e2daa82ca7da8f2594639c5b9437a5fa65a635374394b2e9c6b1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: edits a matching preference and reveals it in its section without losing its value: 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":"invokeai/frontend/webv2/src/workbench/settings/SettingsDialog.browser.test.tsx"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb01b027e12da2e62ea6a6fb7a20134efedc508f800534efac1a3ebf0acb1377"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: lists project settings, and widget settings only for widgets in the open project: 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":"invokeai/frontend/webv2/src/workbench/settings/SettingsDialog.browser.test.tsx"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"9842afcb68917063881dd010dc3d78ec07fe57ef4695c92c1773f7a8e47f8eec"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: reveals a search result through the section selector in a narrow window: 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":"invokeai/frontend/webv2/src/workbench/settings/SettingsDialog.browser.test.tsx"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"1465b64eeb03b420b0f16ed01309ebf13c4e9ae63faf784c827f8b68fb56852f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: restores section scroll after searching, switching sections, and reopening: 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":"invokeai/frontend/webv2/src/workbench/settings/SettingsDialog.browser.test.tsx"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f85ff6485c0c1a2db443c21c472f3621821f917a26e6dc1d1e91761eeec3459"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns focus to the widget gear when quick settings close with Escape: 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":"invokeai/frontend/webv2/src/workbench/settings/SettingsDialog.browser.test.tsx"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"7325c0e7d2d6cd4096a7e3ac391a3978d3aa6bee5c92abb7ceefbcfadb4c61df"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: lists only settings that need no open project and follows the route: 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":"invokeai/frontend/webv2/src/workbench/settings/PreferencesPage.browser.test.tsx"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf49fe5e788e8985e4010c9f98034586f5f0e099c4d0ab5204931afe6eda110a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: edits a preference through the shared settings store: 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":"invokeai/frontend/webv2/src/workbench/settings/PreferencesPage.browser.test.tsx"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb10cfe2e5f23e0915624b392a887e59e71456b490e6c52a01d81e4a46aa7d4b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: narrows sections while searching and reveals a result in its section: 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":"invokeai/frontend/webv2/src/workbench/settings/PreferencesPage.browser.test.tsx"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"bae813c34b34ded6910a9ede4d84f403b695f9ac5075996d670be90540fc8828"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: replaces a search left behind when another page asks for a setting: 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":"invokeai/frontend/webv2/src/workbench/settings/PreferencesPage.browser.test.tsx"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ba74ecc1c65cd4dde87d4e3f406ab5e451ac4e9e2faa1e009c39750003b2ec3"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps a search when the rail link returns to the page: 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":"invokeai/frontend/webv2/src/workbench/settings/PreferencesPage.browser.test.tsx"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bb710a4bc653824d670a2ffa16f76671cc296328cca1459c20425e2a28422e1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: jumps to search on \u0060/\u0060 unless a field is being typed in: 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":"invokeai/frontend/webv2/src/workbench/settings/PreferencesPage.browser.test.tsx"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"d44dec6576c7b16d7a4e14913777f30f8e7e64412b035949827bfef7d21b21c8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: returns to the last section from the bare route and corrects unknown sections: 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":"invokeai/frontend/webv2/src/workbench/settings/PreferencesPage.browser.test.tsx"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"857bce7661ca0750dcfac8ca27005b213bee91e32e0514809ba530ca87618559"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens on the section list from the bare route and on a section from its route: 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":"invokeai/frontend/webv2/src/workbench/settings/PreferencesPage.browser.test.tsx"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab7d9666a2f1c3dfb6f713fcc2f490e4b1bbf9ce12376f964bca57d834a84355"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: moves focus between a section and its row, and keeps browser history on the same panes: 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":"invokeai/frontend/webv2/src/workbench/settings/PreferencesPage.browser.test.tsx"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"db9bbed90ecd2118089cd3bc899c3595d70cd3f2b1f2d3a34ff15d42405be270"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: opens search results from the list and returns to it: 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":"invokeai/frontend/webv2/src/workbench/settings/PreferencesPage.browser.test.tsx"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ba263942388e556de1cecb9e87058f880e086c113276b681a3ad372176f61da"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: flags a binding that shares its key with a multi-widget shortcut on any of that shortcut\u2019s widgets: 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":"invokeai/frontend/webv2/src/workbench/settings/HotkeysSettingsSection.browser.test.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"8165af643bfbdafdfb3f811baac968c9c8dafd58143473f18ae17319656aa681"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows localized described rows and each destructive confirmation in the light theme: 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":"invokeai/frontend/webv2/src/workbench/settings/GalleryMaintenance.visual.browser.test.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"61856230a6a49e6f2759a0e89e5321f9de641dc5bf24526d48541280e07463d1"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows a narrow dark-theme layout and a destructive confirmation: 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":"invokeai/frontend/webv2/src/workbench/settings/GalleryMaintenance.visual.browser.test.tsx"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce5b8c969e628d0d62f32e97a2ce3aadd90c190e3eb6b789bcfdf7dbfb22e983"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: captures preview loading and recovery error states: 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":"invokeai/frontend/webv2/src/workbench/settings/GalleryMaintenance.visual.browser.test.tsx"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"0175ec62055f2baff93707733e33ba5eac6b4bca1cf0041a801f5bc56895b80e"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows an unseen version again for the next account after one dismissed it: 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":"invokeai/frontend/webv2/src/workbench/shell/WhatsNewDialog.browser.test.tsx"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f6596c213f81fddc05b77648004ec6ed4d4704e40f5775d346fec794aec34e0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: offers a keyboard-selectable Sponsors link in a new tab when enabled: 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":"invokeai/frontend/webv2/src/workbench/shell/DonationMenuItem.browser.test.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"41732a4aea10bd8bf7b7b47d6b4bfcc7687bcd6cdaaf648efa02a491925d02ac"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: explains the dot on hover: 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":"invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetStrip.browser.test.tsx"},"region":{"startLine":610}}}],"partialFingerprints":{"codehealthFindingId/v1":"c86294e0e8c9f05b4d5226d3a9db482eb19c82f39945595c0a49652c08515caf"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: closes on Escape and returns focus to the slot: 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/ToolStrip.browser.test.tsx"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"61bd5c236de4011e11a56637c75ba57891ddeb04c5b4c2be665b7202b12994d8"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: holds the save button while a save of the candidate is in flight: 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/StagingBar.browser.test.tsx"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"217e218655f8708f7da27175528000b1cee593d3157b810cc8d4d958e20f5671"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: offers the optimal frame size only while the frame renders at its own size: 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/GenerateCanvasRenderSize.browser.test.tsx"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"26efd45d524a335d5c5ca1ef964c4aa5a5eccbe1e55b7d5a09291ad021622511"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: surfaces an initial catalog failure and retries it without losing built-ins: 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/TextOptions.browser.test.tsx"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a9fc82bc854398f690420295239d6d4cb2b39ae2cbf66b57f6ea651ee9acce0"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: translates a refusal and updates an already visible error when the language changes: 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/FilterOptions.browser.test.tsx"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cfea551f2bcb645e789f7f227a34895cc9470f083f044eecfe5a720dfc00233"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: falls back to English for a refusal the language does not translate: 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/FilterOptions.browser.test.tsx"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad95e703dd72c52365552c213de943edcefcd2bb10aeb06b7fea98d61b29c274"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: summarizes an unexpected failure and keeps its message as technical detail: 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/FilterOptions.browser.test.tsx"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1a0cd4e2e5f089be53a68ed4d1da8fbada8ae3d67b6c1133e771220365c0759"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: clears the error once a retry starts: 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/FilterOptions.browser.test.tsx"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ccec270d498e78cd36fb88c2fc9159bb2fd94d683e57a4507a105634e7323df"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: announces the actual size, including sub-pixel sizes: 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/BrushOptions.browser.test.tsx"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f718efbd338f9d691e6f7c2c33b9a83a891d28c0929874ad72641147793d195"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: advances from the minimum with the keyboard in sub-pixel steps: 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/BrushOptions.browser.test.tsx"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9f3281ff70a95c81fae72b54e9ffc87894758bf7b9ef3d3404d3c5c09dadc80"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: supports PageUp and PageDown in logical brush units: 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/BrushOptions.browser.test.tsx"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"95e01f581e3cf96b79bb5f13d4431a8a65bc7f1c807d1e6824eb018ede89a5fd"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: reaches the exact track maximum with End, then keys keep stepping in 10px units like \u0060]\u0060: 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/BrushOptions.browser.test.tsx"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"372a03c75a00f7539456eca54ffdf3a2083727f269e870d94bf2416217e76f5a"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: steps from the actual size above the track instead of jumping back onto it: 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/BrushOptions.browser.test.tsx"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"257d60b207f387839241d1c9d2dce16e5c35da8ff067b5164b35b7ca8286e80b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: starts each Run workflow open from a fresh form: 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerSurfaceHost.browser.test.tsx"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"7aa8bb3be20d47eb6a986c434d8bcc55c39af22867d3ca733ef58028efb84846"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: enables Filter as soon as the layer %s, without reselecting it: 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerFilterOperationButton.browser.test.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1337a548c3103934d91e3100fad3e8da9652c4ec69d56362643c67aa8eb1f2f"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: disables both controls without an editable selection: 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerBlendRow.browser.test.tsx"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fa0036068707d2ece22cb7f10b4b3c53f2c316678f4fbc7c0a47d05315969f9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: disables the weight while document editing is locked: 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.browser.test.tsx"},"region":{"startLine":527}}}],"partialFingerprints":{"codehealthFindingId/v1":"a683f8e550154f1914591615762801c97f62e225c89742171688eadc876ea9e2"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the pair on the wheel and switches the editing target: 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/LayerEditorPanes.browser.test.tsx"},"region":{"startLine":914}}}],"partialFingerprints":{"codehealthFindingId/v1":"81e24ba76e6a5c64404a04315f1d40994a7ed02b29957b8b36504cc349b77f09"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: shows the empty state with undo and redo disabled: 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/LayerEditorPanes.browser.test.tsx"},"region":{"startLine":1032}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7829a9d5a08a9d3d9a15944686855c59067c0ee00cd55e4186bf98a624e857b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: reports the selection position in the whole board while only the pages around it are loaded: 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewNavigation.browser.test.tsx"},"region":{"startLine":2218}}}],"partialFingerprints":{"codehealthFindingId/v1":"028d1bd8cf27f86458c35cf28541a7d248f4ba554c15e679b99e7e6dc8338f59"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: reports no position for a selection its stamped page does not hold until a step locates it: 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewNavigation.browser.test.tsx"},"region":{"startLine":2239}}}],"partialFingerprints":{"codehealthFindingId/v1":"bca1a909a80e506d43a7afbfcc1f1f56c29d85e9506533d89fb43effebe334f9"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps the position of a selection that moved onto an adjacent loaded page: 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewNavigation.browser.test.tsx"},"region":{"startLine":2261}}}],"partialFingerprints":{"codehealthFindingId/v1":"960a33a1c74a322120f6b35fd4649cf91bbc9bcc0ef5402aba8bd4657ea2cb09"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: keeps a meaningful settings route when all global bindings are unassigned: 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":"invokeai/frontend/webv2/src/workbench/widgets/shortcuts/ShortcutGuide.browser.test.tsx"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad3c33da17a68bc2c89733fe52cc10c8f8d1453cafc883b6bf532201bf6e4eb5"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: labels properties guidance, keeps it through editable focus, hides beneath modals and forgets a switched project: 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":"invokeai/frontend/webv2/src/workbench/widgets/shortcuts/ShortcutGuide.browser.test.tsx"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"f94f5532e82adbefb1e4a376035964838013be182a89120a2ed4bdd29ca78c97"}},{"ruleId":"D10","level":"warning","message":{"text":"Fixed-sleep synchronisation: waits for a held lock until its holder lets it go, and stops waiting once aborted: This test starts work it did not wait for (\u0060waiting\u0060, still running when the sleep starts) and then orders itself against it with \u0060new Promise((resolve) =\u003E {\n      setTimeout(resolve, 20);\n    })\u0060 \u2014 a fixed wait, not a signal that the work is done. Whether it passes depends on how loaded the machine is, which is why a test written this way is green on a developer\u0027s box and random in CI. Wait for the event itself instead: the process\u0027s own exit or output, a completion handle, or a condition polled to a timeout."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/browser/webLocks.browser.test.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"9873f422a2773b3c43a83cd4703571b926647f6c4cb26f7d2af737904e74901d"}},{"ruleId":"D10","level":"warning","message":{"text":"Fixed-sleep synchronisation: extracts through a live unflushed mask whose contract bitmap is still null: This test starts work it did not wait for (\u0060engine\u0060, still running when the sleep starts) and then orders itself against it with \u0060new Promise((resolve) =\u003E {\n      setTimeout(resolve, 0);\n    })\u0060 \u2014 a fixed wait, not a signal that the work is done. Whether it passes depends on how loaded the machine is, which is why a test written this way is green on a developer\u0027s box and random in CI. Wait for the event itself instead: the process\u0027s own exit or output, a completion handle, or a condition polled to a timeout."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.mask.test.ts"},"region":{"startLine":565}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9e8034cee32fee34b7fc4dc1bf0ec034ec40bfe53aa132b162c19aad3ebed51"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: waits for media-cookie refreshes before logging out: This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/store/logoutAfterServerConfirmation.test.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"f89268c7757b3d5c03ada1dbb87f58d3b86495132089ee6d8616d102fadd8a7a"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: issues a single batch request for a multi-video deletion: This test sets up 3 test doubles (for example \u0060vi.mock/jest.mock of an imported module\u0060) against 1 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.test.ts"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8e77456aaca9d42ea5fcee75d4b622cafb21b00df14a8ac3ef20f49fd42bdbf"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: persists on layout change after debounce: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.test.ts"},"region":{"startLine":1123}}}],"partialFingerprints":{"codehealthFindingId/v1":"52668cfc12862fd11d9e48652f3f476ba5f016614a8f779594eb856dcd604891"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not second-guess a chunk the server itself refused: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/images.test.ts"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"8380a43b336a171db6fec90f65aad3e89d78614d214d771f425df04db3498af9"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not publish a chunk that came back after the session changed: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/images.test.ts"},"region":{"startLine":937}}}],"partialFingerprints":{"codehealthFindingId/v1":"0605bf899e13397d65f96a9b6e39bc4e7a78d5ad8ee19218e62f9f45d77723ce"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: invalidates workflow list caches on workflow_created: This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.test.ts"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b06970f58860c10d9156e12e0943dff4a226b6ebd17b8a46131b5fa53ac2cbd"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: ignores unrelated events for workflow cache invalidation: This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.test.ts"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"921d91877c09515b7516798cd6a414758e7c75598dada35de4713d5b5d9311d1"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: clears selected workflow ids from call_saved_workflow nodes on workflow_deleted: This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.test.ts"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"f22425eba579773a5f2cd96508a932632b9966a96e143c053648950723f75b74"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not clear selected workflow ids from call_saved_workflow nodes on workflow_updated: This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.test.ts"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"e254b24658d102d20387d4023163205e3d19cec54fb95fe457da53b5cfbb621f"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: clears selected workflow ids when another user revokes shared access: This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.test.ts"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"84430e1cb6bafd42a8bc26596a3e43f01d6e32f10a1534da0f92052fb03e4320"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: keeps selected workflow ids when access remains for $user_id: This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.test.ts"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"93c3b6df400398f8ff6153b7b676ceb97104a000348eb957da9e28bc16e2d92a"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: routes the admin\u0027s own invocation_complete to the own-event handler: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.test.ts"},"region":{"startLine":566}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3cf1e80ca9aa887a9ba05bf80793168f7ab043560b5e2d183fa3c1b4779143d"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: hands back a disposer that ends the completion handler session: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.test.ts"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dc29e116958384d76ed3ce531559a2a8f26f7774dc9f717548cc55b7962b43d"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: processes each completion event exactly once \u2014 a duplicate delivery does no gallery work: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.test.ts"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d4c1f9f5fd59e56c8dc202dac1953ee8029b9ad164e896f4fa34b483a0934f4"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: rejects a duplicate that arrives while the first delivery is still awaiting its DTO fetch: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.test.ts"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ca62d3f1741ee3145f73d162faef7efff223c21e6093b8c7cf23ed04045e6d6"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: retries only the output whose lookup failed, leaving the ones that landed alone: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.test.ts"},"region":{"startLine":450}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a24873bde446078209371ee61758625d2348cd1750766561a716267557da3b8"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: retries a failed lookup inside an image collection: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.test.ts"},"region":{"startLine":487}}}],"partialFingerprints":{"codehealthFindingId/v1":"97832a9376dfd26691cbe5132ae3be859e40202fbe8ab78d800f83b7b7f2af92"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: lets a duplicate that overlapped a lost delivery become the retry: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 2 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.test.ts"},"region":{"startLine":517}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9a4cec1af49b3f728f3afe7b7d756f19745795ee259007ec8b07ce47d5c3bb0"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: retries only the image half of a mixed result, not the video that landed: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.test.ts"},"region":{"startLine":600}}}],"partialFingerprints":{"codehealthFindingId/v1":"b68c84dd13fe2345170626aeb798838c29fc4829ddab8bf39a301938094cc179"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: retries the lost output alongside an intermediate one, without redoing the intermediate: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.test.ts"},"region":{"startLine":686}}}],"partialFingerprints":{"codehealthFindingId/v1":"16a0deaa8ee50ae4c0322179513546ff902bbd68c0def39beeb9b2c8dc68a0c2"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: serializes several duplicates waiting on one lost delivery into a single retry: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 2 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.test.ts"},"region":{"startLine":721}}}],"partialFingerprints":{"codehealthFindingId/v1":"1505e19f6741438f3b4be53a4cbc736263c047c10e615d5c24b5978107ee85c2"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not move the selection again when a retry lands the lost output: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.test.ts"},"region":{"startLine":843}}}],"partialFingerprints":{"codehealthFindingId/v1":"195e69cad68ed0857d1b28aeb5b7e5c3d006f4b76230b1f47318312b9e307ea1"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: refetches a lost output on its own, without waiting for a duplicate delivery: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.test.ts"},"region":{"startLine":886}}}],"partialFingerprints":{"codehealthFindingId/v1":"247f3c90e4781692fd49323bb1130d4470ff842f199e3fb3061dde4fb8108f05"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: gives up after a bounded number of refetches: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.test.ts"},"region":{"startLine":917}}}],"partialFingerprints":{"codehealthFindingId/v1":"c36c271b80e3a1199b4586de31d8b494b2eb09816c4e6f5edfa241da126f0e02"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: drops a scheduled refetch when a duplicate delivery recovers the output first: This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.test.ts"},"region":{"startLine":944}}}],"partialFingerprints":{"codehealthFindingId/v1":"a67c9bc3f5ad266168c31035c12785b380692d9dbd536ce6f6fe737cfe5568f4"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not run a second chain of refetches when a duplicate delivery lands: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.test.ts"},"region":{"startLine":973}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cff318dcb2ce04db602f8bd80e278b91f1acd2e8a5261e8de33d2b9771be74b"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: drops pending refetches when its session is torn down: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.test.ts"},"region":{"startLine":1043}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f60af3a34635b41086091d0d192c14acd1330226f1df2594d05d79552d00dbc"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: resumes the backoff for a duplicate rather than restarting it: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.test.ts"},"region":{"startLine":1171}}}],"partialFingerprints":{"codehealthFindingId/v1":"96298188b056050466dc053c3128c3ffe4b3b382d0a4697e476d9ae5a1129359"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: ignores an event delivered after disposal: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.test.ts"},"region":{"startLine":1206}}}],"partialFingerprints":{"codehealthFindingId/v1":"6518759fb6b77c4c969cc31a36201ae0d5480e5c948e472b096717340945f15d"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: stops fetching the rest of a result once its session has ended: This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 2 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.test.ts"},"region":{"startLine":1283}}}],"partialFingerprints":{"codehealthFindingId/v1":"94e17e688ab1dd9319792ce805222438af0c7fe5edf56a1eb64107083a47cfd1"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: still processes distinct invocations of the same queue item: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.test.ts"},"region":{"startLine":1323}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a7759f079501629a97bac689736833838ad5bddefd7710c7bba26de294cf449"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: coalesces a burst of upload events into one invalidation and detaches on dispose: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 6 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/data/realtimeRuntime.test.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0fc41ea0b7df0f9ddb1ce8ec8bc92df245969159c9509b9ff1a7b4ecd915bf7"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: steps the selection and auto-add off a board moved into a project the panel hides, and back on failure: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 2 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryActions.browser.test.tsx"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"09f8b854772b6bdc2e870446f512800fefe43b8d23ee5d6d77762f4838d49a9a"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: leaves choices the user made while a failing move was in flight: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 2 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryActions.browser.test.tsx"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c190012cb3a23087f3c4527eace73ad6db5a6864e97da8da50a4674d75fd7e0"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: keeps the selection and auto-add on a board that stays in sight: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryActions.browser.test.tsx"},"region":{"startLine":461}}}],"partialFingerprints":{"codehealthFindingId/v1":"4527204d05721002edd90987961d7557b49a7d9b6a25a074773976bb8042f1e7"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: selects a video with Space without activating keyboard DnD: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.browser.test.tsx"},"region":{"startLine":1155}}}],"partialFingerprints":{"codehealthFindingId/v1":"3771aef14500f7c115c24b02092a88f1fa284e01a4aa09278d10dcd85f2373ff"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: opens the focused video in Preview with Enter, once, without activating keyboard DnD: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.browser.test.tsx"},"region":{"startLine":1169}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4321d4932c3d27e1cf62239b6d7ed11ce8fdccc7bd83395b98d026b71d7731c"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: lets $modifier\u002BEnter reach app hotkeys from a focused tile without activating it or starting a drag: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.browser.test.tsx"},"region":{"startLine":1282}}}],"partialFingerprints":{"codehealthFindingId/v1":"517a2eb8e8b5a0d109736e035dd9fd0f3976613cff8974a9533a8184cc665cdc"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: keeps the rest of the selection when Ctrl-click removes a primary whose next primary is unloaded: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 2 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.browser.test.tsx"},"region":{"startLine":2296}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4d6888df11a753ebe2f9bd777b7f4ddfbc7f57ba678d2d0ecb5030ef7f6842c"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: uses an indexed reveal to request and scroll to only the located page: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 2 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.browser.test.tsx"},"region":{"startLine":3145}}}],"partialFingerprints":{"codehealthFindingId/v1":"d49650681477d555ade0d2fa4361d7b65e1916de30b2196fe0221d8e4a1ba72d"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: invalidates the template list exactly once after import: This test sets up 3 test doubles (for example \u0060vi.spyOn\u0060) against 2 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/usePromptTemplates.browser.test.tsx"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cfb78237f262cfa477d0f20f4d062e4f2fd13f21ee7321850b3c73893c2b5a1"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: applies the template that was clicked: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplates.browser.test.tsx"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ab0824b7bf10d7bca47ec511bb3bd6acc1d87748ceee4353c8e821bc7f6afa4"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: detaches rather than clears when the applied template is deleted: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplates.browser.test.tsx"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"257019f0117566ef5c59a2cda74edb57b7b3634a90503ee5dcf5ea1e0d43d719"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: saves a new template as the user\u2019s own: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplates.browser.test.tsx"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"74e03cbdda96809c9936583434ff405c91bb3badfac6a1464dabca4fdce2f407"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not download a prompt-template export whose body finishes after account rotation: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 2 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplates.browser.test.tsx"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"eddaa7140ed70a8404fe8575ea03f037dd2638a74bf890ba5792d5fa0733311c"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: offers model, weight, toggle, and removal actions from the row context menu: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/shared/ConceptRow.browser.test.tsx"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"e11f5f5c818d0fb015f403a66605fb7a15953f96dc0049ad15811b16bb602cf1"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: unwraps a backend detail body into the error callback: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/detail/RelatedModelsSection.browser.test.tsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0a5a36908d4a95e79759b3cb96bc9ecfad4f37644fd989829ff0bd86b7ae269"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: durably records a new run before enqueueing it: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"191783ad1d8583b219281a450de1ffdb656d7f76c56d324610637da18f4998c5"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: reads the board listing again when a %s run bound for the %s fails, so a board that refused it leaves it: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"4146158f0bc7f45e17c053f805b87f7a0274ea69fdfe10289662c1c3a7fff856"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not enqueue when project persistence returns %s: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":554}}}],"partialFingerprints":{"codehealthFindingId/v1":"953ce45afc3efb32961b2580f96bc2b047ab7e96bfae21e9f9a5c6f768b6ebf8"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: leaves durable enqueue receipt acknowledgement to the durable acknowledgement worker: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":590}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0f45499d3dfd91784e3353fa15781a80e7eaa8403d598140676000ddafd4da3"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: acknowledges a terminal receipt in memory when the run was proven never durable: This test sets up 7 test doubles (for example \u0060vi.fn\u0060) against 2 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":634}}}],"partialFingerprints":{"codehealthFindingId/v1":"e16af27ad9c21343eb3b9144d8c3f8c6c4ff9e01561a979949d58eba9db62525"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not retry a fallback acknowledgement after account disposal: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 3 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":820}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c1cb5e82ae7fc4070fe979da005c2a25c94f28745cd96210eb7889e4bf8fd99"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: continues the backend run and reports when local recovery cannot be written: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":877}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd3e86fe262c76e82832e15ef07793c067c0fbe1ce67b0b4dd3810e1dfb653d6"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: reconciles exactly once after a project closes and reopens while ownership is pending: This test sets up 7 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":966}}}],"partialFingerprints":{"codehealthFindingId/v1":"44b1c882c4d9120025132bc916f9a95f69fbe54b3d21d592a69a1b380e9ef498"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not let result routing from a closed lifecycle mutate a reopened project: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 2 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":1032}}}],"partialFingerprints":{"codehealthFindingId/v1":"69644fe00738d0b7f2cc31cad6e09343990c2cd48f163744608b0436a6aed5d8"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: keeps ownership until an in-flight journal write drains on close: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":1089}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2d22a78bb39bc97ae37f8ae707419e06a9e38c1f7fbff091755e92c5bd8b3d0"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: coalesces status bursts to one in-flight and one latest journal write: This test sets up 5 test doubles (for example \u0060vi\n      .fn\u0060) against 2 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":1130}}}],"partialFingerprints":{"codehealthFindingId/v1":"9758785fd507492d538f2c37a4fa644861c71c7d4372ee984ae79a9d73aaac77"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: retains recovery and ownership until backend cancellation is acknowledged: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 10 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":1177}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f3cbf6bed853a5ee709e4baef413bcd1e557fff15ccc0575241c3c313a2dc39"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: retains ownership and retries a failed terminal journal removal: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":1235}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6cdcc3bc3460ef9f212787a79305cc6372c29a4fcb1511d9f085b819d27f43b"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: cancels an enqueue accepted after local cancellation before settling recovery: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 6 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":1573}}}],"partialFingerprints":{"codehealthFindingId/v1":"d289f880511a2ed73fcb3081a46e7262c9cb84e480c44a9fa66ea7f424a9c0fd"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: reconciles an ambiguously accepted enqueue instead of failing or submitting twice: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":1632}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd4d2dd5c0fde2376468824740d2a9d19b37694231e84efd599da8c4bb8b9d02"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: fails a run whose enqueue keeps returning a 500 instead of retrying forever: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":1667}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7691f26c0e914b551bf486e948de1b69c6b8dcb483c6693b68d0ce47c109755"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: forgets earlier 500s once the run settles, so a later run of the item starts fresh: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 2 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":1698}}}],"partialFingerprints":{"codehealthFindingId/v1":"66f52d02309e0bdd16ea54cac2cbf08620e7f178d3b7e0e0e2fadb593fbde765"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: recovers from 500s that stop within a second instead of failing the run: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":1745}}}],"partialFingerprints":{"codehealthFindingId/v1":"d555deffdf9071d9ce3e90e84b060968dbdaef8ea19d8bd992905cc96fc927b8"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: keeps retrying an enqueue that returns 503 while the server is unavailable: This test sets up 6 test doubles (for example \u0060vi\n      .fn\u0060) against 3 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":1821}}}],"partialFingerprints":{"codehealthFindingId/v1":"510852561cef35901b6d0ff19a1b72f8d7d69a360fef219a4c113594fb477cd2"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: keeps reconciling after three consecutive lost enqueue responses: This test sets up 6 test doubles (for example \u0060vi\n      .fn\u0060) against 3 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":1850}}}],"partialFingerprints":{"codehealthFindingId/v1":"70b3f8837109e32b1137fc9458f5b250d400dba5225878e7348a62014e14febd"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: owns and journals a fresh pending run while offline, then submits it after reconnect: This test sets up 7 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":1878}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3526bacc713bd4a4f52988fd8a01d57d88a18ea42ce07a30eec8e150d6fbda7"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: adopts a partially accepted enqueue instead of abandoning its backend items: This test sets up 6 test doubles (for example \u0060vi\n      .fn\u0060) against 0 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2015}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0745834868d5cc3f774733e2781e2a005ab6a568cd87f81945f1c71a91c3eae"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: retries transient reconciliation failures while the connection remains up: This test sets up 5 test doubles (for example \u0060vi\n      .fn\u0060) against 1 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2124}}}],"partialFingerprints":{"codehealthFindingId/v1":"61acfb872615cd5783b08d014933bbee0455f06a650091f39b17277868e20ecf"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: restores journal rows before reconciliation and leaves a contended run to its owning tab: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 6 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2157}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7efc2e705ac337428026d3b514dbf264a0ccb5bc538c159f4e5de629a2616a1"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: retries reconciliation after another tab releases run ownership: This test sets up 7 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2204}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cc171249eabfd46c1c22aeca5c58778871af3bd2e192e4a461af744b72dfd24"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: settles the journal and releases ownership after a restored run completes: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2251}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3db59d74bfa29d43e9a97e084210aba790d9669a26debbcd237682d67251e23"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: loads and reconciles journal rows before processing a project opened mid-session: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2306}}}],"partialFingerprints":{"codehealthFindingId/v1":"97124977fabe93b10f4ac61364c61e8148f88730e887ec3c5011ed60947b35c2"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: recovery routes waiting preview correctly for $name: This test sets up 7 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 5 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2364}}}],"partialFingerprints":{"codehealthFindingId/v1":"19758137be5e39a672c7f4f861c035bfdce40c05dfb20d9791de51d0bc3c730c"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: retains a running journal row when its project tab closes: This test sets up 7 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 5 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2420}}}],"partialFingerprints":{"codehealthFindingId/v1":"0677729faac49f6c5c253f800f8cb80f88e452e126013af16c1f70d0a9dab6c4"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: lands result videos on the enqueue-time board, excluding intermediates: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2629}}}],"partialFingerprints":{"codehealthFindingId/v1":"aced9ba95d5924a76a48f119c8d4b4e21cbc99f47cfb30bd52d53cc4db9fc2ce"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: records a video-routing failure without failing the completed run: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2651}}}],"partialFingerprints":{"codehealthFindingId/v1":"68beb6541e4661dbf3f480684c39604b2f5aa0f736434374043d83190f45083e"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: routes an uncategorized (%s) run\u0027s results for display without a board attach: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2669}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fc1b3b8a74f9924f103bf0ddaaeef5e6d1eecdd51c9380ded1da903dfa35c4d"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: still shows a finished video when its board attach fails: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2695}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f8920d99b2ad187e3c6f1a1d0416e497e22209357fcc8348fa5d26ca36eb0af"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: reports the board each video reached when an attach partly fails, then retries only the rest: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2716}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dfb9afe14bf06d0c2c6a2d45f1d13b504eff2c96eb4f82d6625bc162cc2cf2d"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: reports no board when the destination port attaches nothing (virtual board): This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2753}}}],"partialFingerprints":{"codehealthFindingId/v1":"b281875a52d4b68c11f7a6e8357d06574921b9314c5cc1f6b5d37f433a68ab33"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: records unreadable result videos and attaches only the readable ones: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2773}}}],"partialFingerprints":{"codehealthFindingId/v1":"a50d86bd8c96fb27c70ecc9a2adbcf51f12b8ffd1a1acbdc218946b01a281369"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: records a failed video read without attaching or routing the videos: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2807}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbe54d5b8f9229daaca7b0b26308cf081bed4ceb9a186d0bfe11d4d5b507302c"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: still shows a video when its post-attach re-read fails: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2825}}}],"partialFingerprints":{"codehealthFindingId/v1":"a030128e91f217b4a323bcc8b4ad2e283509cded9e3f90fdb002159b08cba2c3"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: never routes an input image echoed into the results (first-frame keyframe): This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2860}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd05984e6c1aee54803a8d72bb37ced413817b62d8ed9ee5aa8bfde80bc5b571"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: never routes an input video echoed into the results (extend-video source clip): This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2886}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a613e3e652aab1f64403c7a9ad15fe490a2c135a99a69196625b4cefad79631"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: leaves a video on the board its node saved it to: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2910}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1e723df73a6734ff673fef03ec806fb94af9e5baa709c96e9910df97a956c82"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: attaches only the unassigned videos of a mixed batch and reports each final board: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2930}}}],"partialFingerprints":{"codehealthFindingId/v1":"b758d2d26a6c727b872c786f117499e791129168151e3650c0ffcf85067bfb78"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not move a video back after the user moves it between partial and final settlement: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2953}}}],"partialFingerprints":{"codehealthFindingId/v1":"43f199c65f1dde82358abd9a50d747d0f400968c087c17ffef7d9ed98355279d"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: leaves an image on the board its node saved it to and attaches only unassigned images: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":2974}}}],"partialFingerprints":{"codehealthFindingId/v1":"00ed4af80084f82def4cb45b12d7d1bd8104261a25708720586587ff4cbb550c"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: skips the board attach call when every image already has a board: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":3004}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b57fb0aaa2c2d6cd7bcea2da9bd4b5e5404ab089e1b0e52fe5907b4ac6473a8"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: reopens the run that owns a retried item and routes its rerun to the run destination: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":3099}}}],"partialFingerprints":{"codehealthFindingId/v1":"08b2da8eb408a146b835309fc3b9058841fac3c716859f6804ceeb5b51e5e3ce"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: stages what another tab\u0027s Workflow rerun produced, and nothing for a rerun that failed: This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":3259}}}],"partialFingerprints":{"codehealthFindingId/v1":"f89e0387872cfd4f0997c6c6ec122da8075f2cdb92a67cf526a64d0be8b82c9e"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: adds a Gallery rerun its run could not adopt to that run\u0027s board: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":3305}}}],"partialFingerprints":{"codehealthFindingId/v1":"fee65085b01c06b0a4f0fabc9f5b453b14d9b204c5fc4723492cf428530cfdc4"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: adds a video rerun its active run could not adopt to that run\u0027s board: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.test.ts"},"region":{"startLine":3330}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cca2c365ee02b7c01aed9aae613e72c9248d4f293ccdb18b7b481184b5fe333"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: attaches once and coalesces a burst of queue events into one invalidation: This test sets up 5 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 6 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/data/realtimeRuntime.test.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"691cc932192f1913957f4b7a419befc2a367b52ce3b4c2a51c9fb326caf859e3"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: updates transient progress without invalidating the queue list: This test sets up 4 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/data/realtimeRuntime.test.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"0944bac6bda51d2743de81fd8672249ed608d37b459decdeeaea11c539de3290"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: forwards the reporting GPU so concurrent sessions can be told apart: This test sets up 4 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/data/realtimeRuntime.test.ts"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"d16b3337f00e07a311ab91f9e3ee985d471ac5b4494dfb6f28f40ca9621b7522"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: keeps completed previews until result hydration and clears failed previews immediately: This test sets up 4 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/data/realtimeRuntime.test.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"85c71bcce113b2444ac5f404a6f516d49e7797f24bbb5dc0663a029d5c60b74c"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: ignores timers and socket callbacks after its account scope expires: This test sets up 4 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/data/realtimeRuntime.test.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"314be4dd14b81c1412779b64ab78778cb947fe63519b5e90878a889a8333a9f7"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: fits a newly shown workflow once on mount without animating, and not again as the flow changes: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowSelectionRequestRuntime.browser.test.tsx"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"e143c3d355111faaeb685106039ef8bb61e1bd00b77b182376921c98b7dc17fe"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: holds the fit until the node templates have settled: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowSelectionRequestRuntime.browser.test.tsx"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1dcb6a49090333e9f0a1bf07d09f56992058603cf73d9f9f219723fb97497e0"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: waits for a node with a known template to be rebuilt with it: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowSelectionRequestRuntime.browser.test.tsx"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"701e13a3b524ef47df384a635d59af39e7e19344171e99c81ff05cc50130eb2f"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: gives up the mount fit once the user moves the view first: This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowSelectionRequestRuntime.browser.test.tsx"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5c5d8960ca5ae6c687218fc5301b704b8f57ad086cffcb4986e367a7abca1fd"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: counts the unmeasured nodes of a large graph at a typical node size: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowSelectionRequestRuntime.browser.test.tsx"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"0066ebc9f8ccb94185fea7af141391e00a185053a425a79481bfe15eba51fb7f"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: toggles from a click on the switch when hosted in a Field with an external id: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.browser.test.tsx"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"5654c44df65231309639b95ac9d70a6168aa1055659089fae6ee83c605a0030f"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not upload a gallery image that failed to load: This test sets up 3 test doubles (for example \u0060vi\n        .spyOn\u0060) against 1 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.browser.test.tsx"},"region":{"startLine":1056}}}],"partialFingerprints":{"codehealthFindingId/v1":"b166869b80a3a41af5b1bcb82f2a0facee676267684369d275ce504c049bd861"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: reports a replacement token with the credential that sent the request, from checked and raw fetches: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/transport/http.test.ts"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb04e0e2b63f85dba12c92df3f1fd71c3d96302a8941470138a83aae3ec109c5"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: emits both a change and a commit when a swatch is picked: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/ColorPicker.browser.test.tsx"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fb20f19e1e5299e7dfd9b3990286c6322436ac04c97930a3f65b578b030ddb1"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: leaves drafts alone when the page is hidden before loading or after its account lifetime ended: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 2 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/persistenceRuntime.test.ts"},"region":{"startLine":1247}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc744f355a5464324d7254ac35781541488fd614b345addefe3eccd0b1e8acb3"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: reads the board listing alongside generator resolution and dispatches only once both have answered: This test sets up 4 test doubles (for example \u0060vi.spyOn\u0060) against 3 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/invocationSubmit.test.ts"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ac8ada16f97a3ed03aab929fa4ecb8a79f190107cd31559a1738c9fd5a4e25a"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: carries the captured project and workflow through generator resolution to the dispatch: This test sets up 3 test doubles (for example \u0060vi.spyOn\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/invocationSubmit.test.ts"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"4395a769432cf17c536bc5c2901cf478aadfd77ebb7755374f1fbba751497a07"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: queues nothing for a workflow the captured project no longer owns: This test sets up 3 test doubles (for example \u0060vi.spyOn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/invocationSubmit.test.ts"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"87399ae335ae401eb7e536b7ceaf4d2291a7270cf295d3b76a9e6851452e844f"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: keeps Invoke Front on a Workflow dispatch: This test sets up 3 test doubles (for example \u0060vi.spyOn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/invocationSubmit.test.ts"},"region":{"startLine":493}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a6351f7db3e0702faf1ba7a969995db4e549f4bc1c831b9137d4a9ca382de0f"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: uploads per-generation composites through the intermediate seam, not the durable one: This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 2 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.test.ts"},"region":{"startLine":1168}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5d9094761c221a092a3cf97300195d9d6d464582ae407342fad8550f6010d80"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: re-rasterizes and resets persistence bookkeeping on a revision-bump swap that reuses a layer id with a different source: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 5 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.test.ts"},"region":{"startLine":4134}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1c5ceb972e3503c3da3a3600aac92d26d4efd51b7ce8927a2f7614478f3887b"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: re-rasterizes when the paint layer\u2019s source genuinely changes (swap to a persisted bitmap): This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.test.ts"},"region":{"startLine":14230}}}],"partialFingerprints":{"codehealthFindingId/v1":"981144b172588992d7a9a8795f396eaacafc31c1cc26fe1326919b40acc6e3cb"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: routes only user edits, never system-originated ones or history replays: This test sets up 4 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mutationContext.test.ts"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"aec207fe03a4dd2ee663c218e42359708d886dabce9a8528d2457084e0f08939"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not resurrect dirty persistence when an in-flight upload rejects after %s: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.test.ts"},"region":{"startLine":932}}}],"partialFingerprints":{"codehealthFindingId/v1":"afc0218250954d230c931b507c5e163d5c554984870040e126ac9aefff9d2a76"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not resurrect dirty persistence when in-flight encoding rejects after %s: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 5 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.test.ts"},"region":{"startLine":961}}}],"partialFingerprints":{"codehealthFindingId/v1":"706b56dc38223e32049c8fd7406942a15275aae17a9a29e19d8a333d448a7035"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not hash or upload when in-flight encoding fulfills after %s: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.test.ts"},"region":{"startLine":991}}}],"partialFingerprints":{"codehealthFindingId/v1":"89377707300c9e22dded8defc0e834e439526fac89fe1c6e8df435ca214434c6"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: stops obsolete upload retries when %s lands during retry backoff: This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.test.ts"},"region":{"startLine":1041}}}],"partialFingerprints":{"codehealthFindingId/v1":"388bdad13cf018c098f83c81bff0ea4ea7fa8cd59289846ae00fd272ac2c0d03"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: preserves a fresh same-id generation while obsolete encoding settles: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 5 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.test.ts"},"region":{"startLine":1084}}}],"partialFingerprints":{"codehealthFindingId/v1":"438e822e1bec3e004a9a990c7997bbf12e96a918c8ffbe6ee79edc1a2e6464b6"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: lets an error observer %s failed persistence without a later dirty resurrection: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.test.ts"},"region":{"startLine":1112}}}],"partialFingerprints":{"codehealthFindingId/v1":"d514bc68b6cbecda0114afaace27bb64aebb6f0a612568cac923eb8f6f8f8037"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: reports the first failure and the final failure only: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.test.ts"},"region":{"startLine":1294}}}],"partialFingerprints":{"codehealthFindingId/v1":"160a66dfc41c631adf05b0f3adb8b0801ad3c61a77d14ff3d9b1d1f24a315376"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: routes to the active tool onWheel when present: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/input/wheel.test.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"1741eccf66874651cb7a362b8689ab3398f8593e7c4f34bc90e5beafbc61068d"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: skips the render when tasks leave nothing invalidated, and a cancelled task never runs: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/scheduler.test.ts"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ac7e5ce3fc137cc57363724bf22994303236dfe00294ed6088cacab8e793459"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: keeps rendering the frame after a task throws: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/scheduler.test.ts"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed32ff2bc1586a36dead56ea7f9df5aea8c439db9d031890a986dc079459c507"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not load or call onReady when the font is already available: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/fontLoader.test.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7dd0951c91022dffcaa9248aff00242fc8c2c10f106109813f79e1e4564a234"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: kicks a load for an unavailable font and calls onReady when it resolves: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/fontLoader.test.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8237596544981d7c13c6127f59c270e51d77ae8fa83545c7988e0b1d09b4c4a"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not call onReady again after a completed load: This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/fontLoader.test.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a88abe1fceeb8ac63cedd97eaa3aa2db438f21af1a58e2de40a926f42d8c9ab"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: dedupes concurrent loads of the same font (one load, both onReady fire): This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/fontLoader.test.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"cffce74eaab49ece428b4355447a9681380fdcf84eed3af6ebe698febd655c52"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not fence a ready result when the runtime announces ordinary loading state: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/fontLoader.test.ts"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6ee9af241941ee566afb3fa2c7356f9cd76185fd0f99e677a835557d440c32a"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: never re-decimates the whole stroke while it renders frame by frame: This test sets up 3 test doubles (for example \u0060vi.spyOn\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/strokeSession.test.ts"},"region":{"startLine":833}}}],"partialFingerprints":{"codehealthFindingId/v1":"42584541b4eb898e9fc2f0b2e54e4c80563582336b571cf19d6df891b3b14ee4"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: reserves the composite surface and coverage buffer until execution settles: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/compositeForGeneration.test.ts"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e50aeac67552bbe8c88f25513091db652593ae812ebe40748b52b8283415fe5"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: reads \u002B writes the adjusted layer pixels (bake) and NOT for a plain layer: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/compositeForGeneration.test.ts"},"region":{"startLine":420}}}],"partialFingerprints":{"codehealthFindingId/v1":"10c0c7ceb0d6f5b34b90c2283da721d035ab505d38d6bee6843b268b85157540"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: verifies the exact ordinary listing page before changing Gallery state and sends the absolute slot to the grid: This test sets up 4 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 5 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/revealGalleryItem.test.ts"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5449376a32231b040db302181e0aa2a32aa1b41b1a5fde6297a8c8c13af153d"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: stands down before any Gallery change when the ticket\u0027s own condition fails once the page is verified: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 5 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/revealGalleryItem.test.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"e93667e071eaf56e259bf78d23ad23a08e574165ea20d2e6a20d1cbdb931f10d"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: keeps selection, filters, board, and scroll unchanged when the one locator retry cannot verify a page: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 6 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/revealGalleryItem.test.ts"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6423b8a4ee1d650c728dcf5a546b51723be3afabd7ca5a13dcb54a0c9e76305"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: resolves semantic or cluster selections against the ordinary destination listing before clearing the query: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/revealGalleryItem.test.ts"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d9596618dcc648d56ffec57a6afbd45d82339c6e76bf8115eddff0be0b6f503"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: resets a media filter that hides the item and locates it in the listing of both kinds: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/revealGalleryItem.test.ts"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"85c25cd0283a927e7419854cd4c410922245615581493f0b65c20dda807fba45"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: keeps a media filter that shows the item and locates it within that kind: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/revealGalleryItem.test.ts"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"387f548216aa1a8628d306fd29f2d4cbec1a7878910ed836b78aff759da7bb7b"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: drops the landing when the media filter changes while the locator is in flight: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/revealGalleryItem.test.ts"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e665429e4cd092ac9a14f2dbbaf025baf1fffb54196b96049ac59f4f9114bed"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: does not resolve media when the originating gesture account changed before the reveal chunk runs: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/revealGalleryItem.test.ts"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2816a563913dcc0f1d04c67db73da9a896bfd40228eaf0e38cf08e3f179c3cf"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: clears a clip the panel is holding when the recalled run used none: This test sets up 4 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.test.ts"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf630961fc5925a54dd8c3f945f5a0165b9047e673736b14f7bbbbb8429280b8"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: keeps the current references when every recorded reference was deleted: This test sets up 4 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/executeImageRecall.test.ts"},"region":{"startLine":500}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4ecb09054be38278dbd8dfcdb06e720a66e7be5fbb0ed10afafaae025358ab9"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: reveals a single image or video by its gallery reference: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.browser.test.tsx"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"957ad7c7164be82457297c15875f9292798a9f1d6d804c7b491959230200a08b"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: offers Unstar All from the host\u0027s star answer for a selection with unloaded members: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.browser.test.tsx"},"region":{"startLine":660}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ec372be226677c8b023c6a5790a607b34816c62188394be654a20522ce6a23e"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: hands the choice to delete the project boards through whichever path deletes: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/library.test.ts"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7cdc34043be88e246c686aaab45bd08a38c555e25db959475fc0753919b9477"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: keeps persistence resources alive across a StrictMode-style synthetic remount: This test sets up 3 test doubles (for example \u0060vi.spyOn\u0060) against 0 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.test.ts"},"region":{"startLine":904}}}],"partialFingerprints":{"codehealthFindingId/v1":"fee0a3768a4a6000099b8e197d5516c6c74078f8f610d37cfc008fb026895bce"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: gives up project locks held for an unfinished resolution when a newer editor takes over: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.test.ts"},"region":{"startLine":991}}}],"partialFingerprints":{"codehealthFindingId/v1":"f32696c0655f322232dc678ebea03ad9f3731bac83473a99175143af50330d74"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: issues no requests for a restore that created nothing: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/restoreProjectMedia.test.ts"},"region":{"startLine":533}}}],"partialFingerprints":{"codehealthFindingId/v1":"a11f9532958c2945ca36046b0ad2379328daf6d6a61ed3bd068ba049422a8bda"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: retains exact recall when a terminal item disappears before journal settlement: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRunPersistence.test.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"02d68d127c3d687587fb3adae2f294d56272d351e151ab6c15c0a7c4285de36d"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: waits on a run under the name its owner acquires, taking it only for a moment: This test sets up 6 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRunLocks.test.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"851bee76ff2b69f57f1737771282bbb54338c51a4840e992a1d0cd6b91b3c532"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: cancels its session and reports when the edit cannot be prepared: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/useStructuralCommit.browser.test.tsx"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"101508ee7cbf395a996288244407a28d8e494bd1a9be81a3ff19972af0c0c763"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: prepares from the session\u0027s baseline, and from the live document once the engine ended the session: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/useStructuralCommit.browser.test.tsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"03a1b2275b2a16a9af58b2edae36c4b140f3bbf7a8d5b1a3ad7272a1838da2d7"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: quick switch prefers the bookmark, falls back to the previous selection, and skips missing layers: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 4 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHotkeyCommands.test.ts"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"a741a27ae98a8ac843a76586c5048ce50729b5f3206613e5b6aa3d6113fd8aaa"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: reports when whole-layer duplication throws: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 1 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHotkeyCommands.test.ts"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"03a0527dde1f6af51b45bfee230bb939e3b3b8684362ecebb010d096ce3282c2"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: explains a %s whole-layer duplication refusal: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHotkeyCommands.test.ts"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdee520156caac73ec987008e0b67b83735e92a4d6cdb117f5e71c5582bfadc6"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: resetSelected explains a refused clear and stays silent when there is nothing to clear: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHotkeyCommands.test.ts"},"region":{"startLine":561}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a6bc9ee7f48d1007976402de35a8fa9c6266b21f47e4c617aaea5fcda3912be"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: reports a merge the engine refused: This test sets up 3 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHotkeyCommands.test.ts"},"region":{"startLine":589}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd4390b1bcb6d6730ceb5a7c1a92f95a528fb228969ed9485125a9a0ee33074a"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: anchors the zoom at the viewport centre: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHeaderCommands.test.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"6240078f865b04e1a688ed3f2a9aa1ab5edc838cda47f3e6fc6450cbb28a3bae"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: re-reads the viewport size on every call: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHeaderCommands.test.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"219cb3972418ae20aa82d4b1347f4de43db0b19b8e4a52aa87fb2785b6597a91"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: commits one undoable setCanvasBbox whose inverse restores the current bbox: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHeaderCommands.test.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"f81cddf262d65d560469c008434eaf7ba7022491a75fc094532288e10b5e6d5b"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: is inert with a null rect (nothing to fit to): This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHeaderCommands.test.ts"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa033c72f329a78136b7003ceb7f9adee84b9e1b7a28451c78dcdd4a74152e1d"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: is inert while editing is locked, even with a valid rect: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHeaderCommands.test.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c0c9fce893d1db743f639ac37e2aa1c29462e5284b66b10da940ada0c63f8f1"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: fitBboxToLayers commits the layers rect and re-fits: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHeaderCommands.test.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"e584f5adf009f9b4ebadb6187b2ffab666b408a891d148670c1960f0aec79444"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: fitBboxToMasks commits the masks rect and does NOT re-fit: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHeaderCommands.test.ts"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc80090b65f08b27c2bd03545ce87d01039095e685efab110e12357ff80ae393"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: newSession opens the confirm dialog instead of replacing directly: This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 2 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHeaderCommands.test.ts"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"bec190d5a82cf051a7c749675d6f66d1f8a41f02f656a9b278174774416cc94e"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: fit commands are inert with no rect to fit to: This test sets up 3 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHeaderCommands.test.ts"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a00dff95ef9619ff459084374572f995cd5e862eb530336d4e696601df65808"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: ignores an unknown command id: This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 3 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHeaderCommands.test.ts"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"1db031f190d63cd88e564fbd0b529be003ff2711bead93e02ae0cb6199598132"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: %s runs the bar\u2019s %s action for the candidate: This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 1 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/StagingItemContextMenu.browser.test.tsx"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"2aebcf796b3762151f53148257cd5823f5108a5bfcb28220c7ad10b53d78da45"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: wires every bar action and save target to the engine: This test sets up 5 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 12 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/SamOptions.test.ts"},"region":{"startLine":420}}}],"partialFingerprints":{"codehealthFindingId/v1":"5aa654b3d1b43d80072827b92f1d8349baf837ff946a60649c6f6411b800e4a3"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: refreshes a loaded map when the socket reconnects, and detaches cleanly: This test sets up 4 test doubles (for example \u0060vi.fn\u0060) against 0 real object(s) of its own, and its only verification is 5 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapDataRuntime.test.ts"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee0736d84e7ced6e158f1d72e5dcf7f2bcecbfd324aab3d89690665bbcafc742"}},{"ruleId":"D10","level":"note","message":{"text":"Mock-dominated test: cycles all modes through the M command and keeps swap and exit separate: This test sets up 4 test doubles (for example \u0060a double assigned in a shared setup\u0060) against 0 real object(s) of its own, and its only verification is 5 check(s) that the doubles were called. It pins how the code is wired, not what it does: it passes with a wrong result and fails when a call is harmlessly reordered or merged. Assert the outcome instead (the value returned, the state left behind), build collaborators and value objects for real or with a small hand-written fake, and keep doubles for the boundaries the test cannot own \u2014 the network, the clock, the file system."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewCompare.browser.test.tsx"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cef356b57bb72fd78ed89168bff867d6e29258e48dd94b49c6c6124c9cd37b3"}},{"ruleId":"D13","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":"2ec30789ad57a3ae74729c5809709dd9f8e406cddcbaeac38433026867595445"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","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":"6518b79c45e0ecd3dd9b75a801de5635eb70c011834d7c3b15cbada87678e478"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/workbenchState.ts: invokeai/frontend/webv2/src/workbench/workbenchState.ts changed 118 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 384 in workbenchState.__workbenchReducerInternal at line 3890. 51 of those changes were fix/bug commits, and the other 67 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/workbenchState.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":3890}}}],"partialFingerprints":{"codehealthFindingId/v1":"d186b34ce5619a96b67094f1e89543a2f6cc31dcfca0afec885112689e6afc1d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts changed 78 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 283 in engine.createCanvasEngine at line 333. 24 of those changes were fix/bug commits, and the other 54 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"17732d07005a4f1288d0447a34fd21b14376bb64ec9ea8b92cc39288823a75a0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/scripts/mock-backend.mjs: invokeai/frontend/webv2/scripts/mock-backend.mjs changed 35 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 523 in mock-backend.startMockBackend.server at line 937. 4 of those changes were fix/bug commits, and the other 31 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/scripts/mock-backend.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":"invokeai/frontend/webv2/scripts/mock-backend.mjs"},"region":{"startLine":937}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d7b1903c53851d997576119e6ea2350c9a699e9aea78848e9aa4404b320876b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/services/shared/graph.py: invokeai/app/services/shared/graph.py changed 110 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 155 in GraphExecutionState._validate_effects at line 2565. 28 of those changes were fix/bug commits, and the other 82 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/shared/graph.py\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":"invokeai/app/services/shared/graph.py"},"region":{"startLine":2565}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bd6169c789b8d0c594785117433b76aba500d4783303db9a7b050f9eeacad25"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.tsx: invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.tsx changed 49 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 322 in GalleryImageGrid.GalleryImageGrid at line 404. 22 of those changes were fix/bug commits, and the other 27 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.tsx\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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.tsx"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2ecfc40b408c77d830ed8cb6ed18f3ed892ba7c4239c138d9669b7175b19a87"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts: invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 568 in durableSyncedPersistence.createDurableSyncedWorkbenchPersistence at line 561. 6 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":561}}}],"partialFingerprints":{"codehealthFindingId/v1":"cae354cdca105171fc74644d3aa092d59fbcd73c98c96f211efd0ff44d17edc4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/LayersTree.tsx: invokeai/frontend/webv2/src/workbench/widgets/layers/LayersTree.tsx changed 22 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 227 in LayersTree.LayersTree at line 169. 1 of those changes was a fix/bug commit, and the other 21 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/LayersTree.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayersTree.tsx"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"234f1ffd8420f7dd6cba000111fc0e66ec73b6cbfde359bcbd962d82cc4617c1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx: invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx changed 48 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 94 in VideoWidgetView.VideoWidgetView at line 122. 24 of those changes were fix/bug commits, and the other 24 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx\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":"invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"79a7bda25d1c7b55a61fca286a5aa2ae7ebbf5fd96bed38376c21808c494fe39"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts: invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts changed 45 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 100 in videoPolicies.getVideoValidationReasons at line 2291. 19 of those changes were fix/bug commits, and the other 26 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":2291}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7c6e48221421351e94e88aa4908f2e6266c18af9c7944cd86e9921e917e6e9f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx: invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx changed 41 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 107 in LayerContextMenu.LayerMenu at line 217. 8 of those changes were fix/bug commits, and the other 33 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"71ce34df38be6a0ff6792d251cf4c557c28ec56bdda4cd44cc8993f3a1d7de91"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts: invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts changed 34 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 129 in useImageActions.useImageActions at line 194. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"30752db2ec042151e4325c56d6c9738d85bcd361556ed090923d1b62a89b8504"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewWidgetView.tsx: invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewWidgetView.tsx changed 49 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 69 in PreviewWidgetView.PreviewWidgetView 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewWidgetView.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewWidgetView.tsx"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"988c76089a195453771fa08d234baca3fc3ee1fe12da81a213ebe99f1f1119e5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/video/core/settings.ts: invokeai/frontend/webv2/src/features/video/core/settings.ts changed 49 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 61 in settings.isVideoSettings at line 446. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/video/core/settings.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/settings.ts"},"region":{"startLine":446}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8c42c9e8ae4c6f89032149fee8f30adebeefc2dccc4110160aa98b34d986059"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx: invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 139 in WorkflowEditorView.WorkflowFlow at line 305. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx\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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"869e8f475a418e8235a183e3d8d23a4a8449e7bae3ccf9d232eba5b4ccf491d5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts: invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts changed 25 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 113 in videoRecall.buildVideoRecallSettings at line 474. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"af46388a10180092610b873545b2fe2a105ae532f663b1554fc3df009997a7d2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx: invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx changed 31 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 80 in PreviewFrame.PreviewVideo at line 376. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bd0f7d403d0db051f613b38d06f491920706cba1472128ebdafb57ebb11979f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts: invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts changed 28 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 77 in canvasProjectMutations.applyCanvasProjectMutation at line 669. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts"},"region":{"startLine":669}}}],"partialFingerprints":{"codehealthFindingId/v1":"788be840625526365f36fbadd102c23623a67ac0bfcd9210f6289d6739c30e0f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/core/document.ts: invokeai/frontend/webv2/src/features/workflow/core/document.ts changed 24 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 89 in document.applyProjectGraphAction at line 907. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/core/document.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/document.ts"},"region":{"startLine":907}}}],"partialFingerprints":{"codehealthFindingId/v1":"2aaa90194a57231933d6222c8084ec1f346ed8694ec73debe8f9ef2850b4e7b0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/queue/store/readiness.ts: invokeai/frontend/webv1/src/features/queue/store/readiness.ts changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 150 in readiness.getReasonsWhyCannotEnqueueCanvasTab at line 773. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/queue/store/readiness.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":773}}}],"partialFingerprints":{"codehealthFindingId/v1":"b362afca4676c84d888174b22ac4dfbb366dbfa9ab46aeea6fc4abb06e566a93"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx: invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx changed 38 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 47 in UpscaleWidgetView.UpscaleWidgetView at line 352. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx\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":"invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"d491b00c1b8029b51953c0ed6781b2ebacee9631f7a4ca732f0daf7df6ff24cc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx: invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx changed 33 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 50 in VideoReferenceListField.VideoReferenceListField at line 363. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx\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":"invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx"},"region":{"startLine":363}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9a094089ffc6116ba227c0531d998e2ec0c87fabf6301aa663b3421e5e2ca44"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHotkeyCommands.ts: invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHotkeyCommands.ts changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 97 in canvasHotkeyCommands.executeCanvasHotkeyCommand at line 120. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHotkeyCommands.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHotkeyCommands.ts"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"f636cb119518a364e3f4c0c8c555332dd52a72db70fd8b30729165214f8ebd2e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts: invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 205 in modelSelected.addModelSelectedListener at line 97. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cf16586a2ffe1761e55a3ce791509de36f70d3bc32b7ae52737b5aff745bc94"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 198 in documentModel.createDocumentModel at line 463. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"15e37bd239ca7b07b112b634cf4672033e6dab2139640db6404e15ef55d173b1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapPlot.tsx: invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapPlot.tsx changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 74 in ImageMapPlot.ImageMapPlot at line 113. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapPlot.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapPlot.tsx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cb7beb686f52196077f371c98d1348383cdc389786c426e904bbc5e1532ffe9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/video/core/graph.ts: invokeai/frontend/webv2/src/features/video/core/graph.ts changed 25 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 61 in graph.buildLtx2VideoGraph at line 654. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/video/core/graph.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/graph.ts"},"region":{"startLine":654}}}],"partialFingerprints":{"codehealthFindingId/v1":"49408d5aae003d95a8317ab4f5286843d9367dc040854dea9b70e5ec2e913e1c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts: invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts changed 44 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in baseGenerationPolicies.getSettingsWithCompatibleModelSelections at line 1461. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts"},"region":{"startLine":1461}}}],"partialFingerprints":{"codehealthFindingId/v1":"f71ce99a844308f879e05e5ff784d775343169a9a2c3003edcaa78d73c511cb5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/models/ui/add-models/AddModelsView.tsx: invokeai/frontend/webv2/src/features/models/ui/add-models/AddModelsView.tsx changed 24 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 62 in AddModelsView.AddModelsView at line 71. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/models/ui/add-models/AddModelsView.tsx\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":"invokeai/frontend/webv2/src/features/models/ui/add-models/AddModelsView.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"557370fe24981eb7283213222a7d5af324547f517f8cd2fe7a0eac35acdfd58f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasWidgetView.tsx: invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasWidgetView.tsx changed 32 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 46 in CanvasWidgetView.CanvasWidgetView at line 110. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasWidgetView.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasWidgetView.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"576b0499e79691f353c3cc0fd67616fea5b93c0b2cee0d8b2a1689d505175250"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.tsx: invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.tsx changed 35 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 42 in InvocationFlowNode.ExpandedInvocationNode at line 961. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.tsx\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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.tsx"},"region":{"startLine":961}}}],"partialFingerprints":{"codehealthFindingId/v1":"92af99c1c4717b445f9b193cccbcf3c4722ae58d4b8b7994e9f91ab72f09691b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerView.tsx: invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerView.tsx changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 91 in GalleryPickerView.GalleryPickerView at line 65. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerView.tsx\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":"invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerView.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"06d21a6732d98a175a044e0e7a83e291dc465e9d1e5f5af6f89b18a38ed4de7e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx: invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx changed 47 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in WorkflowFieldInput.SavedWorkflowInput at line 1675. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx\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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":1675}}}],"partialFingerprints":{"codehealthFindingId/v1":"127a5d151ca6659b3cfbfe6cd77687cb23c67b7e013abfd4b2646841c0624813"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/core/settings.ts: invokeai/frontend/webv2/src/features/generation/core/settings.ts changed 30 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 45 in settings.normalizeGenerateSettings at line 743. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/core/settings.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/settings.ts"},"region":{"startLine":743}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc14aa0cc3a2169a6829814da58f65b080e3ae8b936a48a02a719dfce04e8753"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widget-frame/FloatingWidgetWindow.tsx: invokeai/frontend/webv2/src/workbench/widget-frame/FloatingWidgetWindow.tsx changed 20 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 66 in FloatingWidgetWindow.FloatingWidgetWindow at line 328. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widget-frame/FloatingWidgetWindow.tsx\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":"invokeai/frontend/webv2/src/workbench/widget-frame/FloatingWidgetWindow.tsx"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbfe46245ff59b9cedd8187c1bfe6c6d4763bd36df6054da1bfac4d6bd845366"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/queue/runtime.ts: invokeai/frontend/webv2/src/features/queue/runtime.ts changed 22 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 58 in runtime.createQueueRuntime.reconcile at line 2076. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/queue/runtime.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":2076}}}],"partialFingerprints":{"codehealthFindingId/v1":"55d9564101a6756f6d7652ae26927525c99fd647585b013fee9670c6393d289b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts: invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts changed 22 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 55 in imageRecall.buildImageRecallSettings at line 1115. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts"},"region":{"startLine":1115}}}],"partialFingerprints":{"codehealthFindingId/v1":"a724e4c7e23309aa81c0b7b0f6b245aa770071f56ac73929bc03da2bf204c16a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/useGalleryData.ts: invokeai/frontend/webv2/src/features/gallery/ui/useGalleryData.ts changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 75 in useGalleryData.useGalleryData at line 257. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/useGalleryData.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryData.ts"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"078b4e70712ff0ab98e509a5f2eb55830564f2aeed0f99d4ce7e0d88907e5e1b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/model_manager/load/model_loaders/z_image.py: invokeai/backend/model_manager/load/model_loaders/z_image.py changed 37 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 32 in Qwen3EncoderCheckpointLoader._load_from_singlefile at line 1189. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/model_manager/load/model_loaders/z_image.py\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":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":1189}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a8f7df3c9773653b9b1b01f319b1d4d03c33a1e13df0c857616361c7d2f2abd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.tsx: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.tsx changed 20 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 53 in WorkflowLibraryDetailPanel.WorkflowLibraryDetailPanel 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.tsx\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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.tsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"cafafd89510653f562bf25f6cc435811f300a23ba546d675afe2ccdade138340"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/shell/WorkbenchShell.tsx: invokeai/frontend/webv2/src/workbench/shell/WorkbenchShell.tsx changed 31 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in WorkbenchShell.WorkbenchShell at line 64. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/shell/WorkbenchShell.tsx\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":"invokeai/frontend/webv2/src/workbench/shell/WorkbenchShell.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3dd3f29c7ea2a0dafb40d55f2ef58bfe069a0f8491ac3e009e2b10541f8c2a3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/useGalleryActions.ts: invokeai/frontend/webv2/src/features/gallery/ui/useGalleryActions.ts changed 22 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 47 in useGalleryActions.useGalleryActions at line 35. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/useGalleryActions.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryActions.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"5173938c13cbfadf425f87dbf0239c495765fdd8b3d115b0edf00698a2a7043f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/platform/ui/ScrubberField.tsx: invokeai/frontend/webv2/src/platform/ui/ScrubberField.tsx changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 99 in ScrubberField.ScrubberField at line 228. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/platform/ui/ScrubberField.tsx\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":"invokeai/frontend/webv2/src/platform/ui/ScrubberField.tsx"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"40e13e5a4ad96198671c69a4de9c85f68294c9ac2879efab590b4b5e361b761d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/models/ui/components/ModelSelect.tsx: invokeai/frontend/webv2/src/features/models/ui/components/ModelSelect.tsx changed 23 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 42 in ModelSelect.ModelSelect at line 96. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/models/ui/components/ModelSelect.tsx\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":"invokeai/frontend/webv2/src/features/models/ui/components/ModelSelect.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"45aa245ec2c4b368cbf7a6573afe6127681fb9c6b765a8dd1166f3af57f8a5a6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/model_manager/load/model_loaders/krea2.py: invokeai/backend/model_manager/load/model_loaders/krea2.py changed 41 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in Krea2CheckpointModel._load_from_singlefile at line 402. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/model_manager/load/model_loaders/krea2.py\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":"invokeai/backend/model_manager/load/model_loaders/krea2.py"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"eab638bd7096209ee21578bf98e957654c9284c06c47dc3625568e542f80b716"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts: invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 72 in executeVideoRecall.applyVideoRecallMetadata at line 169. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"f19fcffc8c15147e38a02d5d1c8502863fc1d3ec27d11dfc6684c9b72ab4bf50"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/WorkflowWidgetChrome.tsx: invokeai/frontend/webv2/src/features/workflow/ui/WorkflowWidgetChrome.tsx changed 28 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 33 in WorkflowWidgetChrome.WorkflowDialogHost at line 298. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/WorkflowWidgetChrome.tsx\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":"invokeai/frontend/webv2/src/features/workflow/ui/WorkflowWidgetChrome.tsx"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"16032ac0736328ce58f6ce79358d97016e3026bb45c060b4012794d9c4bfebbc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewNavigation.ts: invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewNavigation.ts changed 20 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 46 in usePreviewNavigation.usePreviewNavigation.navigate at line 711. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewNavigation.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewNavigation.ts"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ccdce082b2c902ae68ed996696ae7e7b28a5efa93f0178a2759208947f32441"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRow.tsx: invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRow.tsx changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 65 in LayerRow.LayerRowComponent at line 78. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRow.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRow.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c0c3513b095ee400a137f0ebf674197f2f0c6b0bd99fa87229ca1e0be7cd970"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/galleryStateView.ts: invokeai/frontend/webv2/src/features/gallery/ui/galleryStateView.ts changed 37 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in galleryStateView.getGallerySelectedImageQuery at line 256. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/galleryStateView.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/galleryStateView.ts"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3281d3f35c90a97c2f4b8372f8b43e218a84c24d7324bbbd3fa012bcf2b3c5f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDialog.tsx: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDialog.tsx changed 24 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in WorkflowLibraryDialog.WorkflowLibraryDialog at line 89. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDialog.tsx\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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDialog.tsx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"0de73c253033ee018f6f951004d3b4ee907e68100b6211a97e586bd0845914f2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/projects/projectFile.ts: invokeai/frontend/webv2/src/workbench/projects/projectFile.ts changed 26 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in projectFile.importProjectFile at line 272. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/projects/projectFile.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/projectFile.ts"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"c68122b259294f6895006fa900f37abb9b5c30dec47c7696a10513f8d2f42d6d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/editor/AddNodeDialog.tsx: invokeai/frontend/webv2/src/features/workflow/ui/editor/AddNodeDialog.tsx changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 67 in AddNodeDialog.AddNodeDialogContent at line 375. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/editor/AddNodeDialog.tsx\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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/AddNodeDialog.tsx"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"b698970e3ca00ad3f4c7b658ff6fb31ad336937e7c11aabae6795b6956213539"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/model_manager/load/model_loaders/flux.py: invokeai/backend/model_manager/load/model_loaders/flux.py changed 31 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in Flux2CheckpointModel._load_from_singlefile at line 1261. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/model_manager/load/model_loaders/flux.py\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":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":1261}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bd0b433eccdfa384a96fc7d785c22e9395f2661b1e47370e2c415ad80078ff2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/workbenchStore.ts: invokeai/frontend/webv2/src/workbench/workbenchStore.ts changed 41 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in workbenchStore.recordDiagnosticForAction at line 744. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/workbenchStore.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/workbenchStore.ts"},"region":{"startLine":744}}}],"partialFingerprints":{"codehealthFindingId/v1":"a95347a56546a9a2557154afdae5ef5a9e85c5cc6d67b372de623f9944688df4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/upscale/core/settings.ts: invokeai/frontend/webv2/src/features/upscale/core/settings.ts changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 51 in settings.getUpscaleValidationReasons at line 948. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/upscale/core/settings.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/core/settings.ts"},"region":{"startLine":948}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9157fb53af6e02418de8b3a1512f43b7c00b13f9d2838c0f253b0e0af781f16"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx: invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 51 in ControlLayerSettings.ControlLayerSettings at line 69. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"45e1433e4ad3f3dc8e96f634599db8612eec13891927ca14063c1f342239adba"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx: invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx changed 31 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in PositivePromptActions.ExpandPromptButton at line 445. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffd196084a81a9933c1e633a587376af3dec04c1d08867883eb8ccf9fce3bacc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/video/core/widgetValues.ts: invokeai/frontend/webv2/src/features/video/core/widgetValues.ts changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 53 in widgetValues.syncVideoWidgetValuesWithModels 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/video/core/widgetValues.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/widgetValues.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"63b20a0bd77c147543a11b78de90ea008ef491d33a81e4abb7b2601e0d7c4664"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/data/backend.ts: invokeai/frontend/webv2/src/features/gallery/data/backend.ts changed 41 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in backend.moveGalleryVideoItemsToBoard at line 1415. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/data/backend.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/data/backend.ts"},"region":{"startLine":1415}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed7cfa88a6dad3ecdc2d52a7f0a76e1c7b650cd16a2e00d96426a8cf6e8a856f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/data/templates.ts: invokeai/frontend/webv2/src/features/workflow/data/templates.ts changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 46 in templates.parseInvocationSchema at line 331. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/data/templates.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/data/templates.ts"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"39f141490320283887e96f32e5279387b56ee583719a3abc1317771ee962e3c6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/editor/CallSavedWorkflowSyncRuntime.tsx: invokeai/frontend/webv2/src/features/workflow/ui/editor/CallSavedWorkflowSyncRuntime.tsx changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 60 in CallSavedWorkflowSyncRuntime.CallSavedWorkflowSyncRuntime at line 152. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/editor/CallSavedWorkflowSyncRuntime.tsx\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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/CallSavedWorkflowSyncRuntime.tsx"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"366ed775199ce2ea10a27e37235ad5bc49f50e0e8de35172cf8213fd07c5a026"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositor.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositor.ts changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 42 in compositor.compositeDocument at line 520. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositor.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositor.ts"},"region":{"startLine":520}}}],"partialFingerprints":{"codehealthFindingId/v1":"b626140aa28cc03b0e395ec81344e884638674e07147c150ecbcb8a012060261"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/tools/strokeSession.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/tools/strokeSession.ts changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 44 in strokeSession.createStrokeSession.paint at line 323. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/tools/strokeSession.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/strokeSession.ts"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbc3684a131f3ee95cceec16f5bf9a8840ff66724e25dbaf04f8c5e886fbe5e6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts: invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 176 in forLoops.validateForLoopGraph at line 268. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb9a18d252c12bf7f70858f391119915259fec4b94766fa3a8f3a91dc0c053ba"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx: invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx changed 20 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in GalleryBoardMenu.GalleryBoardMenu at line 35. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx\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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"121fa482e460c7c07d807a2b00e70934a7f34ced122d6932000de061b836e31d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/intermediates/ui/IntermediatesManager.tsx: invokeai/frontend/webv2/src/features/intermediates/ui/IntermediatesManager.tsx changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 69 in IntermediatesManager.IntermediatesManager at line 63. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/intermediates/ui/IntermediatesManager.tsx\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":"invokeai/frontend/webv2/src/features/intermediates/ui/IntermediatesManager.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"92f286869e872d3f8874d8e1987cc40af70f65c58d96ba1c2447e30f5e63a8ea"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryMediaSlot.tsx: invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryMediaSlot.tsx changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 62 in GalleryMediaSlot.GalleryMediaSlot at line 82. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryMediaSlot.tsx\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":"invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryMediaSlot.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef38c716b2985779107edb43b4d21fd8bce8c3cf89fc2a8a8108bb831c9c175b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/GenerateAdvancedFields.tsx: invokeai/frontend/webv2/src/features/generation/ui/GenerateAdvancedFields.tsx changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 52 in GenerateAdvancedFields.GenerateAdvancedFields at line 71. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/GenerateAdvancedFields.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/GenerateAdvancedFields.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa3c2b8a822636733727590417e730650f21adf7d3aee2dea7435d6d9d3fbab0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/settings/store.ts: invokeai/frontend/webv2/src/workbench/settings/store.ts changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 32 in store.normalizeWorkbenchPreferences at line 285. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/settings/store.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/store.ts"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c54d267328d33f6d321d4f3319a53d3456edcc8de4d79135f73d0bb5673218c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx: invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx changed 30 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in ImageContextMenu.SingleItemMenuItems at line 308. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx\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":"invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcd88e6b0221a1bac34de4358f9b5101d9d0bfd4ffe55b967ec1b29edad2cff6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/services/model_install/model_install_default.py: invokeai/app/services/model_install/model_install_default.py changed 20 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 33 in ModelInstallService._enqueue_remote_download at line 2185. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/model_install/model_install_default.py\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":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":2185}}}],"partialFingerprints":{"codehealthFindingId/v1":"6db3b439d9acf53cd2a76344a295491e5856e92cdbbf4ff153b1a5cf70c6494e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/model_manager/load/model_cache/model_cache.py: invokeai/backend/model_manager/load/model_cache/model_cache.py changed 24 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in ModelCache.put at line 928. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/model_manager/load/model_cache/model_cache.py\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":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":928}}}],"partialFingerprints":{"codehealthFindingId/v1":"26e0ee2a122a7d554b6b9a4bd550931241c146c099c059e80c377414b07c3821"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/core/fields.ts: invokeai/frontend/webv2/src/features/workflow/core/fields.ts changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 40 in fields.isWorkflowFieldValueValid at line 384. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/core/fields.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/fields.ts"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"086bc49827ada6b75691385a79241842297df181162a53297ecc36a3fad205a9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/GenerateDimensionFields.tsx: invokeai/frontend/webv2/src/features/generation/ui/GenerateDimensionFields.tsx changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 42 in GenerateDimensionFields.GenerateDimensionFields at line 255. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/GenerateDimensionFields.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/GenerateDimensionFields.tsx"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f673199201d0355c24a4389b917e74be44656e44f0257cb8274ac9e0101e524"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/services/image_index/image_index_default.py: invokeai/app/services/image_index/image_index_default.py changed 31 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in ImageIndexService._worker_loop at line 1125. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/image_index/image_index_default.py\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":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1125}}}],"partialFingerprints":{"codehealthFindingId/v1":"366e434dc36821ba33525fa2598b346af861309fc1664098b3b79d41110022fe"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardsPanel.tsx: invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardsPanel.tsx changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 41 in GalleryBoardsPanel.GalleryBoardsPanel at line 41. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardsPanel.tsx\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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardsPanel.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"56ae15caa295153e274dc312ea8fee49e0e1b2b282f29259dfb8207b85464f60"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/services/download/download_default.py: invokeai/app/services/download/download_default.py changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 68 in DownloadQueueService._do_download at line 423. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/download/download_default.py\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":"invokeai/app/services/download/download_default.py"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dc6f93e6e0ebf02447651db756562bcc0d371d134dfe0a5bb3288d02292c622"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/GalleryItemSearch.tsx: invokeai/frontend/webv2/src/features/gallery/ui/GalleryItemSearch.tsx changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 51 in GalleryItemSearch.GalleryItemSearch at line 66. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/GalleryItemSearch.tsx\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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryItemSearch.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"72c3a8fe16f1aedce8ab2a1d5e59561dd873011c22d86e67f88166c1935cbc7c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/services/shared/graph_validation.py: invokeai/app/services/shared/graph_validation.py changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in Graph._is_for_connection_valid at line 1353. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/shared/graph_validation.py\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":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":1353}}}],"partialFingerprints":{"codehealthFindingId/v1":"e44ba632c915f54e383fb3d5d6954bbf9510314c469c89a012df761f35ac616d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/invocations/z_image/z_image_denoise.py: invokeai/app/invocations/z_image/z_image_denoise.py changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 53 in ZImageDenoiseInvocation._run_diffusion at line 337. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/invocations/z_image/z_image_denoise.py\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":"invokeai/app/invocations/z_image/z_image_denoise.py"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"db96f0a30c36130567ca67d50446c1411d033e0e3c36645e1a21791fc60b3b95"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/GalleryThumbnail.tsx: invokeai/frontend/webv2/src/features/gallery/ui/GalleryThumbnail.tsx changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 41 in GalleryThumbnail.GalleryThumbnail at line 75. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/GalleryThumbnail.tsx\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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryThumbnail.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"e31e7d704cda87353e3e2d17b9b81fbb7af84e7b158398ec4363acd7c7ab8cd6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/core/graph.ts: invokeai/frontend/webv2/src/features/generation/core/graph.ts changed 27 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in graph.buildFlux2Graph at line 745. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/core/graph.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":745}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b52630943441139f42b19c721f431b8f4ae00c0da94d9cfd4e3f6872d64b861"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetStrip.tsx: invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetStrip.tsx changed 27 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in LayoutPresetStrip.PresetTab at line 310. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetStrip.tsx\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":"invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetStrip.tsx"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"7717a18da6affc100dd0b260260b24fe047e91676687405e3269da50dc93c2c4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/model_manager/configs/factory.py: invokeai/backend/model_manager/configs/factory.py changed 35 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in ModelConfigFactory.from_model_on_disk at line 865. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/model_manager/configs/factory.py\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":"invokeai/backend/model_manager/configs/factory.py"},"region":{"startLine":865}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a571fa873e7c54b10ce61ac7ff397d1d5fa2fb5402281cf481777b0f29ab10f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 40 in bitmapStore.createBitmapStore.flushLayer at line 382. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cdb2926092832d304de4764a6b194510696307efd66aca5afd958eb1c06e206"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapWidgetView.tsx: invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapWidgetView.tsx changed 23 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in ImageMapWidgetView.ImageMapWidgetView at line 71. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapWidgetView.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapWidgetView.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1e1c6161106b57d6b58d5ff2ff87378d0f0716c7258c6aab101698c1550fe89"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/services/shared/graph_materializer.py: invokeai/app/services/shared/graph_materializer.py changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 50 in _ExecutionNodeBuilder.prepare at line 2385. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/shared/graph_materializer.py\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":"invokeai/app/services/shared/graph_materializer.py"},"region":{"startLine":2385}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c086bf4048b5e6826f61b5f27f2234849eddaeb96ec9608f83146e0b974a2f0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/image-actions/recallParameters.ts: invokeai/frontend/webv2/src/workbench/image-actions/recallParameters.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 110 in recallParameters.buildRecallParametersSettings at line 185. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/image-actions/recallParameters.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/recallParameters.ts"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"907561af357c504d555cedc5cea990fb342d76a70f0ef56e3ae4a24e0b4a52c8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/model_manager/load/load_default.py: invokeai/backend/model_manager/load/load_default.py changed 34 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in ModelLoader._load_and_cache at line 354. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/model_manager/load/load_default.py\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":"invokeai/backend/model_manager/load/load_default.py"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4d0b3c27becbd31bb6a4dfe33bb17bd545cb5773739a2e0f66ef41b3fb80143"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/extractMaskedAreaController.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/extractMaskedAreaController.ts changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 45 in ExtractMaskedAreaController.extract at line 104. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/extractMaskedAreaController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/extractMaskedAreaController.ts"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b483584a9b0dbbf6196d9899bc98075f22cefc7f6c8ebdd7d0572adb78d37ed"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/layerChildRows.ts: invokeai/frontend/webv2/src/workbench/widgets/layers/layerChildRows.ts changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 49 in layerChildRows.layerChildRowCommand at line 507. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/layerChildRows.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerChildRows.ts"},"region":{"startLine":507}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcb042da641ea49abe04e93c9f747f58724ad9deff84bd535f32d8ce3aa5b3c2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/TextOptions.tsx: invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/TextOptions.tsx changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 33 in TextOptions.TextFontSettings at line 566. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/TextOptions.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/TextOptions.tsx"},"region":{"startLine":566}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2ddbb2de37659f9246a1d6ba30658fb12a55074ba3e2d5e7d33b74a4540faba"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/model_manager/configs/main.py: invokeai/backend/model_manager/configs/main.py changed 29 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in main._detect_wan_expert at line 2653. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/model_manager/configs/main.py\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":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":2653}}}],"partialFingerprints":{"codehealthFindingId/v1":"1014b1858ca7481f3afd745db501bc81f3c3c33b89fd0a8fcb656c19ace25d67"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/core/buildGraph.ts: invokeai/frontend/webv2/src/features/workflow/core/buildGraph.ts changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in buildGraph.getProjectGraphReadiness at line 125. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/core/buildGraph.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/buildGraph.ts"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"d62a80c9e690f50638aa187581c08ac42e420f58c4b19f5aad994c9752447462"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/GenerateRenderSection.tsx: invokeai/frontend/webv2/src/features/generation/ui/GenerateRenderSection.tsx changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in GenerateRenderSection.GenerateRenderSection at line 519. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/GenerateRenderSection.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/GenerateRenderSection.tsx"},"region":{"startLine":519}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d238fafd48ada86e757c6ccdb792c4f163172e2e5c7773c4fbffc3f685a88a8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/queue/runtime/coordinator.ts: invokeai/frontend/webv2/src/features/queue/runtime/coordinator.ts changed 18 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in coordinator.createQueueCoordinator.reconcile at line 1043. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/queue/runtime/coordinator.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime/coordinator.ts"},"region":{"startLine":1043}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe1592b9ddf4f37a905aeefdb70b891b1cd13dfacee7cbd3f454585b7912f8fa"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in MergeLayerController.mergeSelected at line 390. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"485594d4de9161dd9b3207eb77bd92e9d6df31c43b18ebadd0890fec27a0f112"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx: invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 55 in ReferenceImageCropDialog.ReferenceImageCropDialog at line 212. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d1aa4fcd946000dc283ccf9ef59cc9f5563784bb482080f1b76587ac2ed6001"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs: invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in measure-architecture-performance.runSample at line 328. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/scripts/measure-architecture-performance.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":"invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"45eedb2d095c3085ab31403e31fcee0bab34608dff4c5922013714f2776abbca"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/scripts/run-project-file-journey.mjs: invokeai/frontend/webv2/scripts/run-project-file-journey.mjs changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in run-project-file-journey.executeProjectFileJourney at line 902. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/scripts/run-project-file-journey.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":"invokeai/frontend/webv2/scripts/run-project-file-journey.mjs"},"region":{"startLine":902}}}],"partialFingerprints":{"codehealthFindingId/v1":"27fca419c9368f0898afd413aa9eff7aced87a6d77ade185797f314518729f3a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/graph-preview/GraphPreviewDialog.tsx: invokeai/frontend/webv2/src/features/workflow/ui/graph-preview/GraphPreviewDialog.tsx changed 20 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in GraphPreviewDialog.GraphPreviewDialog at line 87. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/graph-preview/GraphPreviewDialog.tsx\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":"invokeai/frontend/webv2/src/features/workflow/ui/graph-preview/GraphPreviewDialog.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb0ce7d066043fa05ea807011123c1d6d86704fd3fb7c737da8220fe12d7e827"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/tools/paintTool.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/tools/paintTool.ts changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in paintTool.resolveTarget at line 81. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/tools/paintTool.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/paintTool.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"30a244a153d802a1af2d706ff0eb95c9e8b407f381d0827fdab46f0f734e8eb1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/services/session_processor/session_processor_default.py: invokeai/app/services/session_processor/session_processor_default.py changed 24 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in DefaultSessionRunner.run_node at line 253. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/session_processor/session_processor_default.py\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":"invokeai/app/services/session_processor/session_processor_default.py"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"a70d8067645be144c43052f1037e7ea935baaf167145f5161761a868f1f626b7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py: invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py changed 19 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in MistralEncoderCheckpointLoader._load_text_encoder at line 1174. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py\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":"invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py"},"region":{"startLine":1174}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef303931bf3c2d790d22ba967d7499129949d6b3dca4fdb65815290096621173"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/image-map/imageMapStore.ts: invokeai/frontend/webv2/src/workbench/image-map/imageMapStore.ts changed 19 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in imageMapStore.refreshImageIndexStatus at line 424. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/image-map/imageMapStore.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-map/imageMapStore.ts"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b64376783b6bedd8588cc7b9f6209339d893326ff1754f98b1cd2a9d40103b2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/services/shared/graph_if_dependencies.py: invokeai/app/services/shared/graph_if_dependencies.py changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 45 in graph_if_dependencies._can_use_fresh_flat_if_activation at line 195. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/shared/graph_if_dependencies.py\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":"invokeai/app/services/shared/graph_if_dependencies.py"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c5f80d9b3d9cdf5e2c485f5629d0fc0571cf0ddcf2d22f383c4c19b25b851e9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 40 in LayerMutationController.commitDuplicate at line 174. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b6229a3a1fdc45afd68f8967081d8c002d8f509a2ec224299de29f08e518992"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/RunLayerWorkflowDialog.tsx: invokeai/frontend/webv2/src/workbench/widgets/layers/RunLayerWorkflowDialog.tsx changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 33 in RunLayerWorkflowDialog.RunLayerWorkflowDialog at line 193. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/RunLayerWorkflowDialog.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/RunLayerWorkflowDialog.tsx"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"53ef3faf345099a71222500836295a66a27e31beb022271a5e63945d9233fa2e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/services/shared/graph_scheduler.py: invokeai/app/services/shared/graph_scheduler.py changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in graph_scheduler._prepare_deferred_nested_for_body at line 28. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/shared/graph_scheduler.py\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":"invokeai/app/services/shared/graph_scheduler.py"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"443f4ae3d5354aadbb138dbbb6c387b1ec60334a0bdc754eed146fbba6db7669"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardRow.tsx: invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardRow.tsx changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in GalleryBoardRow.GalleryBoardRow at line 30. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardRow.tsx\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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardRow.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e4561e65eb3f41b3da0e4826d537a5d68d820a1b72d0ffd51af10bb63715f6e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 60 in GenerationSettingsAccordion.GenerationSettingsAccordion at line 62. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx\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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bfbac53d519448c031679811093bd67efc29f709e019ef988dd6373a8915da7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/GalleryWidgetView.tsx: invokeai/frontend/webv2/src/features/gallery/ui/GalleryWidgetView.tsx changed 26 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in GalleryWidgetView.GalleryWidgetView at line 92. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/GalleryWidgetView.tsx\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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryWidgetView.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"627863214c3f52eda95dca11f265c369272fe92e27e657e611a8f73d3788ff61"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/LayerChildRow.tsx: invokeai/frontend/webv2/src/workbench/widgets/layers/LayerChildRow.tsx changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 32 in LayerChildRow.LayerChildRowComponent at line 81. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/LayerChildRow.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerChildRow.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"237d65b68b9a5c90a8a7e175b71d0cedcfe467af0942f605df3720fa8286931e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widget-frame/WidgetFrames.tsx: invokeai/frontend/webv2/src/workbench/widget-frame/WidgetFrames.tsx changed 24 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in WidgetFrames.WidgetPanelFrame at line 34. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widget-frame/WidgetFrames.tsx\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":"invokeai/frontend/webv2/src/workbench/widget-frame/WidgetFrames.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7692923d99c79c2f409351023216d89c2021f1cf816c80514d9d38f834970f9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/linear/NodeFieldControl.tsx: invokeai/frontend/webv2/src/features/workflow/ui/linear/NodeFieldControl.tsx changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in NodeFieldControl.NodeFieldControl at line 57. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/linear/NodeFieldControl.tsx\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":"invokeai/frontend/webv2/src/features/workflow/ui/linear/NodeFieldControl.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"a96d008552f7b706312f93a13770af9bec8b6911096e553aa390b0d4b0ef15c8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.tsx: invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 50 in FontsPage.FontLibrary at line 305. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.tsx\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":"invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.tsx"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3588941231ad6dc590e760d183d7c393f32206626b9552733a3ff4e98a28959"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/settings/SettingsDialog.tsx: invokeai/frontend/webv2/src/workbench/settings/SettingsDialog.tsx changed 23 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in SettingsDialog.SettingsDialog at line 74. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/settings/SettingsDialog.tsx\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":"invokeai/frontend/webv2/src/workbench/settings/SettingsDialog.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"aded45b09d1e2642738d7fbee4e78cc78b14e1b84cb8e3a2ea18cdc5b6a86fe2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/booleanMergeController.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/booleanMergeController.ts changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 38 in BooleanMergeController.merge at line 61. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/booleanMergeController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/booleanMergeController.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9519ace1554d42b159e91ac339823f6bf4c6e5dbb9e5f5f9581896d8928b7cf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/api/routers/videos.py: invokeai/app/api/routers/videos.py changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in videos.ingest_uploaded_video at line 430. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/api/routers/videos.py\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":"invokeai/app/api/routers/videos.py"},"region":{"startLine":430}}}],"partialFingerprints":{"codehealthFindingId/v1":"805b017e44638abb91c4bf8a0dd42d82898d927ca1af990030a4e4c716514552"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/reference-images/GenerateReferenceImagesSection.tsx: invokeai/frontend/webv2/src/features/generation/ui/reference-images/GenerateReferenceImagesSection.tsx changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in GenerateReferenceImagesSection.GenerateReferenceImagesContent at line 45. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/reference-images/GenerateReferenceImagesSection.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/GenerateReferenceImagesSection.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbd65dde8d9ade0844cde693e51d16c41de7c8c7c1d6287d9914806a9bf8ecb4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFilmstrip.tsx: invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFilmstrip.tsx changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in PreviewFilmstrip.FilmstripLiveThumb at line 125. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFilmstrip.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFilmstrip.tsx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"0603aeaa21076d738a62dea84d03ddca874ce8e8ebeeadeb07dc0225943a8887"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts: invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in compileCanvasGraph.getCanvasValidationReasons at line 112. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"cef6f6587c1f9529c5ca616776db7f70d6fba51bf0876babecef5dc5b1fe73c8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 52 in AdvancedSettingsAccordion.AdvancedSettingsAccordion at line 69. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx\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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"15e968f3153e745ba9ca31ac259c4817815e767978aff2a10020640f663fb86d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/galleryBoardGroups.ts: invokeai/frontend/webv2/src/features/gallery/ui/galleryBoardGroups.ts changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 33 in galleryBoardGroups.getGalleryBoardGroups at line 61. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/galleryBoardGroups.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/galleryBoardGroups.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd2eb18709ec0f6220bfdd42ccabbbb696e9cba93d36f37444f40e31924063de"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/AdjustmentSettings.tsx: invokeai/frontend/webv2/src/workbench/widgets/layers/AdjustmentSettings.tsx changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in AdjustmentSettings.CurvesEditor at line 452. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/AdjustmentSettings.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/AdjustmentSettings.tsx"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"e78d4fc7da07a11da78650cf3eab12fdbfe084943657a8524c9a3959cb806d04"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/GeneratePresetsPopover.tsx: invokeai/frontend/webv2/src/features/generation/ui/GeneratePresetsPopover.tsx changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in GeneratePresetsPopover.GeneratePresetsPopover at line 130. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/GeneratePresetsPopover.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/GeneratePresetsPopover.tsx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"e299ac82459e611de2ff6759e253518612906e2b78d30a8fa7b3e2689d0e5ded"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/app/GenerationUiAdapter.tsx: invokeai/frontend/webv2/src/app/GenerationUiAdapter.tsx changed 23 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in GenerationUiAdapter.getQueueInsights at line 71. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/app/GenerationUiAdapter.tsx\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":"invokeai/frontend/webv2/src/app/GenerationUiAdapter.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b4ce5acbf2bb1b6e35126e5fc1a45ce1aea32ac9d757104f45c21576d3f36f5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/projects/projectAssets.ts: invokeai/frontend/webv2/src/workbench/projects/projectAssets.ts changed 18 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in projectAssets.createOpenProjectsHeldMediaReader at line 152. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/projects/projectAssets.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/projectAssets.ts"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e78a30769e8a08b77421210e535d3b009f7ac03d442656c14d91e7e20026340"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/panes/LayerSection.tsx: invokeai/frontend/webv2/src/workbench/widgets/layers/panes/LayerSection.tsx changed 20 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in LayerSection.resolveChildEditor at line 82. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/panes/LayerSection.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/LayerSection.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"7633399756a315732d054bd3bcb1c864376c81004079c858a0393bbea720e684"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvasMigration.ts: invokeai/frontend/webv2/src/workbench/canvasMigration.ts changed 22 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in canvasMigration.parseNode at line 529. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvasMigration.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvasMigration.ts"},"region":{"startLine":529}}}],"partialFingerprints":{"codehealthFindingId/v1":"4281a0f73307adc21b64c563c3f707eccd55660de565fc9a9ecabd1ed90fd2f5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/shell/CenterArea.tsx: invokeai/frontend/webv2/src/workbench/shell/CenterArea.tsx changed 19 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in CenterArea.CenterArea at line 52. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/shell/CenterArea.tsx\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":"invokeai/frontend/webv2/src/workbench/shell/CenterArea.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"192f0652f6d87a3e891fdc9a0f87fa0e7d0abd569fe796590d2f2d79e61feb92"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/services/events/setEventListeners.tsx: invokeai/frontend/webv1/src/services/events/setEventListeners.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 107 in setEventListeners.setEventListeners at line 81. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/services/events/setEventListeners.tsx\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":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"36c1e7165a1a22fc29a67dc99b84244a70a1a98e7485a68488279d01058a512e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/video/ui/videoComparators.ts: invokeai/frontend/webv2/src/features/video/ui/videoComparators.ts changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 40 in videoComparators.areVideoValuesEqual at line 23. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/video/ui/videoComparators.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/videoComparators.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9ea506dac0eec9021e30819dd0d99bca58ae0959370ed35d1bcc94be2672678"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/data/queryCache.ts: invokeai/frontend/webv2/src/features/gallery/data/queryCache.ts changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in queryCache.rebuildGalleryItemWindow at line 678. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/data/queryCache.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/data/queryCache.ts"},"region":{"startLine":678}}}],"partialFingerprints":{"codehealthFindingId/v1":"003b9039e073e452bf706bfd5f0b123d8e06ae7114d8854229f87e311b65fefd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/shell/topbar/ProjectSwitcher.tsx: invokeai/frontend/webv2/src/workbench/shell/topbar/ProjectSwitcher.tsx changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in ProjectSwitcher.ProjectSwitcher at line 62. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/shell/topbar/ProjectSwitcher.tsx\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":"invokeai/frontend/webv2/src/workbench/shell/topbar/ProjectSwitcher.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c1318dd7428c8d80e0fddf39eb64e8957c064242c22eefad1991fd4bba51269"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/hotkeys/firstPartyCommands.ts: invokeai/frontend/webv2/src/workbench/hotkeys/firstPartyCommands.ts changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in firstPartyCommands.useRegisterFirstPartyCommands at line 99. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/hotkeys/firstPartyCommands.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/hotkeys/firstPartyCommands.ts"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fb4e3c9230a3d1126c1ce3e94d07a4edff008060c17706edcad74784306dec1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/projects/invk/exportProject.ts: invokeai/frontend/webv2/src/workbench/projects/invk/exportProject.ts changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in exportProject.executeInvkExport at line 148. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/projects/invk/exportProject.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/exportProject.ts"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b7f60180f68f41e6b00ccbd48a52ecb10f3cca27bff8579e4afe29d2792dc71"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/core/workflowJson.ts: invokeai/frontend/webv2/src/features/workflow/core/workflowJson.ts changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in workflowJson.parseWorkflowJson at line 283. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/core/workflowJson.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/workflowJson.ts"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dcf4ae94f8cad59c4c0c397a8274c7bc18834ac9d8d44114697db4b2933cd83"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/shell/StatusBar.tsx: invokeai/frontend/webv2/src/workbench/shell/StatusBar.tsx changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in StatusBar.CompactBottomWidget at line 271. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/shell/StatusBar.tsx\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":"invokeai/frontend/webv2/src/workbench/shell/StatusBar.tsx"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"41c412e8b0aa63218566f71ba2c20ff2850a49faf830f3bdb833fcbf198dede7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/RegionalGuidanceSettings.tsx: invokeai/frontend/webv2/src/workbench/widgets/layers/RegionalGuidanceSettings.tsx changed 20 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in RegionalGuidanceSettings.RegionalGuidanceSettings at line 64. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/RegionalGuidanceSettings.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/RegionalGuidanceSettings.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"2164142e8ca23fc0a8e6f8a4d420965d8b58b3e99e08c8af3acbffa1e110131a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/core/selection.ts: invokeai/frontend/webv2/src/features/gallery/core/selection.ts changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in selection.getGalleryNavigationStep at line 311. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/core/selection.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/core/selection.ts"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef9220725b4707f7559c57a2cf127196c0af08572b8a0cb016034efbbdc0a94c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/canvas/StagingBar.tsx: invokeai/frontend/webv2/src/workbench/widgets/canvas/StagingBar.tsx changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in StagingBar.StagingBar at line 114. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/canvas/StagingBar.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/StagingBar.tsx"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"37a1763c8a9b735fcd39bb3cb76d847fe69f0b8bd1e82096c8117d850565a677"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/invocation.ts: invokeai/frontend/webv2/src/workbench/invocation.ts changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in invocation.resolveInvocationRouteInput at line 200. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/invocation.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/invocation.ts"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"acf69a40b8322a681d1c6c382d301ecf682cbf4cd099d80ab7213dfb4971cd84"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/services/shared/execution_engine/scheduler.py: invokeai/app/services/shared/execution_engine/scheduler.py changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in ExecutionPlan.from_snapshot at line 151. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/shared/execution_engine/scheduler.py\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":"invokeai/app/services/shared/execution_engine/scheduler.py"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f3d98010cff51226d5ba2eb26952ac6a8b3b3f9f2e10b2f97ce13b162a80f46"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/services/shared/graph_if_runtime.py: invokeai/app/services/shared/graph_if_runtime.py changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in graph_if_runtime._get_if_iteration_paths_with_ancestry at line 393. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/shared/graph_if_runtime.py\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":"invokeai/app/services/shared/graph_if_runtime.py"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"10aeb55c88177b790414b81e5fd57e57695caac913a8aa2153ea3d9f294a243b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/models/ui/credentials/ExternalProviderKeyCards.tsx: invokeai/frontend/webv2/src/features/models/ui/credentials/ExternalProviderKeyCards.tsx changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in ExternalProviderKeyCards.ExternalProviderKeyCard at line 103. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/models/ui/credentials/ExternalProviderKeyCards.tsx\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":"invokeai/frontend/webv2/src/features/models/ui/credentials/ExternalProviderKeyCards.tsx"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"380971b00bbb77bb1558fcfaeb85966c938069f563b0e1843eda996a5d9de0ec"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/shell/topbar/QueueCluster.tsx: invokeai/frontend/webv2/src/workbench/shell/topbar/QueueCluster.tsx changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in QueueCluster.QueueCluster at line 38. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/shell/topbar/QueueCluster.tsx\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":"invokeai/frontend/webv2/src/workbench/shell/topbar/QueueCluster.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"d913cc6f974b42f1b9717038901bee665fc13ac9e5067c215b97568261b3288d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/rasterExportController.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/rasterExportController.ts changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in RasterExportController.rasterize at line 110. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/rasterExportController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/rasterExportController.ts"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8bbdcaf5a1cf9c0eb0a9eaa0a77ad2e2b3a2735f9d67fb45c50caade343d911"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/useGalleryUploadAction.ts: invokeai/frontend/webv2/src/features/gallery/ui/useGalleryUploadAction.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 41 in useGalleryUploadAction.useGalleryUploadAction at line 44. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/useGalleryUploadAction.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryUploadAction.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb66c1e0cc42b8e798a389e72ea3542ece2e8b25ce29946353060e643bc10b96"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/shell/ProjectConflictBanner.tsx: invokeai/frontend/webv2/src/workbench/shell/ProjectConflictBanner.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 47 in ProjectConflictBanner.ProjectConflictBanner at line 27. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/shell/ProjectConflictBanner.tsx\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":"invokeai/frontend/webv2/src/workbench/shell/ProjectConflictBanner.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a091a1205f8f277f3d13d48f42cd0cefe81308730f3910a2bb2a84196a8f43e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/platform/ui/list/ListItem.tsx: invokeai/frontend/webv2/src/platform/ui/list/ListItem.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 47 in ListItem.ListItem at line 83. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/platform/ui/list/ListItem.tsx\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":"invokeai/frontend/webv2/src/platform/ui/list/ListItem.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"61d77dfe3fd1622fc1ffb149a987f408d86de84d6d12de2dc261aed75262d8e4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallJobRow.tsx: invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallJobRow.tsx changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in InstallJobRow.InstallJobRow at line 93. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallJobRow.tsx\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":"invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallJobRow.tsx"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"98fe6a4a92466cddbbbbc5619b2c690894fc5cf564f60075bbd8fa1a454e1060"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/nodes/util/workflow/validateWorkflow.ts: invokeai/frontend/webv1/src/features/nodes/util/workflow/validateWorkflow.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 70 in validateWorkflow.validateWorkflow at line 140. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/nodes/util/workflow/validateWorkflow.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/workflow/validateWorkflow.ts"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae426b46b27c631d5f3937816188acc9e8fd754761bb2fc67fd84c6f9de515f5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 46 in CurrentVideoPreview.CurrentVideoPreview at line 66. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx\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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"abe65201950bfd10e48f517aef4b99a24be79adfc773cde9b0b8d571afe6c252"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/invocationSubmit.ts: invokeai/frontend/webv2/src/workbench/invocationSubmit.ts changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in invocationSubmit.submitResolvedInvocation at line 178. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/invocationSubmit.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/invocationSubmit.ts"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"7324516cbced8953c2061ede0a2aa8d44d1f2eb1c70b8db77fa339cd42e43ec6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/tools/shapeTool.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/tools/shapeTool.ts changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in shapeTool.createShapeTool.commitPixels at line 154. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/tools/shapeTool.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/shapeTool.ts"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"d564ddde53c3c51b0603e5854cb25f87e4578b4e6c2212919d2cdb39173f88aa"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowPublicationHost.tsx: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowPublicationHost.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 67 in WorkflowPublicationHost.WorkflowPublicationHost at line 90. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowPublicationHost.tsx\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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowPublicationHost.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ac1dec2eec468aa755744e954eda8d37f2adccfa7da61ab29f6d0df1299ea43"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTextarea.tsx: invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTextarea.tsx changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in PromptTextarea.PromptTextarea at line 61. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTextarea.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTextarea.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a1543e08fbdf41a8126c2e9166a9df9dcfb069634071843c9710575f71148da"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/structuralLayerController.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/structuralLayerController.ts changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in StructuralLayerController.beginPreview at line 191. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/structuralLayerController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/structuralLayerController.ts"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d29e9beafa1ecaf9b4034f07ba3fc035f8caeab1e28d4cf128c533443bb6172"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/api/routers/session_queue.py: invokeai/app/api/routers/session_queue.py changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in session_queue.strip_missing_image_results at line 76. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/api/routers/session_queue.py\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":"invokeai/app/api/routers/session_queue.py"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"5be217d9b9ad2bc8c55a42275b7a4ce25a8060d394adf8b5553b7c92e5c5e279"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/core/validation.ts: invokeai/frontend/webv2/src/features/workflow/core/validation.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in validation.isValidLoopLinkageConnection at line 370. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/core/validation.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/validation.ts"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf83abbe318487f89138ad1928a9648f2a0988177d56ce5b7af7f4f2e5b93458"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/platform/ui/Picker.tsx: invokeai/frontend/webv2/src/platform/ui/Picker.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 32 in Picker.Picker at line 125. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/platform/ui/Picker.tsx\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":"invokeai/frontend/webv2/src/platform/ui/Picker.tsx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"e08e8caeba7f6daf46b4712a6612bb1d8c7b7af0825c3c9e092747ef1a72660b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/LayerGroupContextMenu.tsx: invokeai/frontend/webv2/src/workbench/widgets/layers/LayerGroupContextMenu.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 32 in LayerGroupContextMenu.LayerGroupContextMenu at line 73. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/LayerGroupContextMenu.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerGroupContextMenu.tsx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"64f1d81cd0f705fee5f58a9aa9039692ac301582ed122518ae652e446296b165"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/run_app.py: invokeai/app/run_app.py changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in run_app.run_app at line 45. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/run_app.py\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":"invokeai/app/run_app.py"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf3cb7261205d8902435064e039d1bd37667b64fd9048ebd3f39e9cb20b16a48"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/util/devices.py: invokeai/backend/util/devices.py changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in TorchDevice.get_generation_devices at line 336. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/util/devices.py\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":"invokeai/backend/util/devices.py"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"bea78afd2e6f13edfb3518dd0fe9fb65716512d54a18148f09ce6f6746a3034c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplatesPanel.tsx: invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplatesPanel.tsx changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in PromptTemplatesPanel.PromptTemplatesPanel at line 64. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplatesPanel.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplatesPanel.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"c23f12a2e9124c57132a1ab41499cd0ee1a9aa5d389d55c86f79bcb8db6db8d5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/app/QueueRuntimeAdapter.tsx: invokeai/frontend/webv2/src/app/QueueRuntimeAdapter.tsx changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in QueueRuntimeAdapter.QueueRuntimeAdapter at line 25. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/app/QueueRuntimeAdapter.tsx\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":"invokeai/frontend/webv2/src/app/QueueRuntimeAdapter.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"94dd4b10fa72f0ccc07daeff63f90574e993cd5a44d2c14cea3f29e6b751ecaa"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/invocations/video_frame_extract_range.py: invokeai/app/invocations/video_frame_extract_range.py changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in ExtractVideoRangeInvocation.invoke at line 187. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/invocations/video_frame_extract_range.py\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":"invokeai/app/invocations/video_frame_extract_range.py"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9dad5247d946a3b85d5b44320174292b6181e3fb30f7d3391fa4a50c5e8d7bf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/psdExportController.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/psdExportController.ts changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in PsdExportController.export at line 67. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/psdExportController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/psdExportController.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"37d9357657c58770d1157498c8ea746b1c7f8344f1574b6e8e8ac02a48e389d3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/stagedResultController.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/stagedResultController.ts changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in StagedResultController.commit at line 72. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/stagedResultController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/stagedResultController.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa798f1d53f48ed4a72cbfd106b74cf0318bf688c67f8f3c491a03ecdbce39a5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallQueueBar.tsx: invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallQueueBar.tsx changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in InstallQueueBar.InstallQueueBar at line 59. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallQueueBar.tsx\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":"invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallQueueBar.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"db97b5a9b80e53cf0f27836bedf75c3b7b1a799cb315d692dacfb7961730c844"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/invocations/flux/flux_denoise.py: invokeai/app/invocations/flux/flux_denoise.py changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 31 in FluxDenoiseInvocation._run_diffusion at line 220. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/invocations/flux/flux_denoise.py\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":"invokeai/app/invocations/flux/flux_denoise.py"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ad62a4a23d7e08b0a668d5095562448c483ecdca2a3e5d5911480907a9f9e9c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/projects/invk/assetTransport.ts: invokeai/frontend/webv2/src/workbench/projects/invk/assetTransport.ts changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in assetTransport.createAssetResponseReader at line 105. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/projects/invk/assetTransport.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/assetTransport.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5382680f0a08f690742e85a14cb6e1fe4f9bf3718b92c03732dad08acf37061"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 82 in buildFLUXGraph.buildFLUXGraph at line 55. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"4556eb8ef09cc1c1bc02bc4a676fa5e51a9dc72b3c495598449c0bb5c71b7773"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-operations/createCanvasEngine.ts: invokeai/frontend/webv2/src/workbench/canvas-operations/createCanvasEngine.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in createCanvasEngine.createCanvasEngine at line 65. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-operations/createCanvasEngine.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/createCanvasEngine.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"46bc3f7819d4c13e4995f13068b55e86afa81a8a2ec4405dfe65fd258f6dbdb4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/projects/invk/importProject.ts: invokeai/frontend/webv2/src/workbench/projects/invk/importProject.ts changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in importProject.readInvkArchive at line 104. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/projects/invk/importProject.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/importProject.ts"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d9f8b872d48a549dc98a809c18a7ad53dfa362a1b7a17b6f2f6cb9daea857fe"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/model_manager/load/model_loaders/ideogram4.py: invokeai/backend/model_manager/load/model_loaders/ideogram4.py changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in Ideogram4CheckpointModel._load_model at line 357. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/model_manager/load/model_loaders/ideogram4.py\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":"invokeai/backend/model_manager/load/model_loaders/ideogram4.py"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"b930b012a9d4e9dabd8222e0ed09de961de1e6f6d0d5b26a51df9dd2c88e162a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/core/settings.ts: invokeai/frontend/webv2/src/features/gallery/core/settings.ts changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in settings.getGallerySettings at line 146. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/core/settings.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/core/settings.ts"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"8021c3f68dd0432a3b7c05c3382958e3f42f7419fe6551ea10628610b90334d7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/models/ui/detail/DefaultSettingsSection.tsx: invokeai/frontend/webv2/src/features/models/ui/detail/DefaultSettingsSection.tsx changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in DefaultSettingsSection.FieldControl at line 60. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/models/ui/detail/DefaultSettingsSection.tsx\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":"invokeai/frontend/webv2/src/features/models/ui/detail/DefaultSettingsSection.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c2d7b066bac91cabbbf515fcb3a133959f811949ae232ef1ac1092afaf814cb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/image-actions/executeImageRecall.ts: invokeai/frontend/webv2/src/workbench/image-actions/executeImageRecall.ts changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in executeImageRecall.executeLoadMediaWorkflow at line 103. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/image-actions/executeImageRecall.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/executeImageRecall.ts"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"687b652661630695faaea489d822d5efc42f95cfee2be0091c804b42fa98cb45"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardsPanel.tsx: invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardsPanel.tsx changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in WildcardsPanel.WildcardsPanel at line 50. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardsPanel.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardsPanel.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"30907ee5cc251118c60379ffd3a4f16ffcce0e3c4644fc4b543cf8df7db14d70"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/persistenceRuntime.ts: invokeai/frontend/webv2/src/workbench/persistenceRuntime.ts changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in persistenceRuntime.createWorkbenchPersistenceRuntime.load at line 484. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/persistenceRuntime.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/persistenceRuntime.ts"},"region":{"startLine":484}}}],"partialFingerprints":{"codehealthFindingId/v1":"da3596a1b636a94d6a300a588c1dc882ce00767a8a388c1a20116142459f61ab"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/projects/api.ts: invokeai/frontend/webv2/src/workbench/projects/api.ts changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in api.settleProjectCreate at line 437. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/projects/api.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/api.ts"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8bfd78af6ecdf4ac2a3e86fbc9b6cf4c13d57dbf58df3f842d3bebd426532b9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/models/ui/detail/ModelEditForm.tsx: invokeai/frontend/webv2/src/features/models/ui/detail/ModelEditForm.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in ModelEditForm.ModelEditForm at line 72. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/models/ui/detail/ModelEditForm.tsx\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":"invokeai/frontend/webv2/src/features/models/ui/detail/ModelEditForm.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef848735a9e9b4f0feafdce1ec7ff3942983d3004a312d7296acb57112dd2fb9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/palette/entries.ts: invokeai/frontend/webv2/src/workbench/palette/entries.ts changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in entries.buildSettingsEntries at line 322. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/palette/entries.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/palette/entries.ts"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"10dc266dd673d1cd9126afe7e84afb25902902c1586ff29e64cc86891bc7d6fb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/filterResultController.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/filterResultController.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in FilterResultController.commit at line 72. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/filterResultController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/filterResultController.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"a79401f5eeaf8b55080ca26b715e4fb0bc504055ed3576c19cf3da8b1caf0500"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/layerRasterizer.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/layerRasterizer.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in layerRasterizer.createLayerRasterizer.getOrStartLayerRasterization at line 73. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/layerRasterizer.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/layerRasterizer.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d9d3b705c941b98c929a058232ba0387040284479fcf49cc9d2f5ea38454f31"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/palette/CommandPaletteDialog.tsx: invokeai/frontend/webv2/src/workbench/palette/CommandPaletteDialog.tsx changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in CommandPaletteDialog.CommandPaletteContent at line 98. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/palette/CommandPaletteDialog.tsx\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":"invokeai/frontend/webv2/src/workbench/palette/CommandPaletteDialog.tsx"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"e69ab31012020d3cfdc82914cfcfe086855f578d28989a06b91414d9269a5a3b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplateEditor.tsx: invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplateEditor.tsx changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in PromptTemplateEditor.PromptTemplateEditor at line 58. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplateEditor.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplateEditor.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"7602cd56bca7ee2e828a093963702649be2f8fd15889a388507ec6f8dc271f52"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/cropLayerController.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/cropLayerController.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 31 in CropLayerController.crop at line 68. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/cropLayerController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/cropLayerController.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1b4109e18c4c3c91d31b3df142f9d0f81900ab0721f56a2bc48edf3536165d8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/projects/invk/restoreProjectMedia.ts: invokeai/frontend/webv2/src/workbench/projects/invk/restoreProjectMedia.ts changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in restoreProjectMedia.restoreProjectMedia at line 204. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/projects/invk/restoreProjectMedia.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/restoreProjectMedia.ts"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1d5f5a737151b3850356c405e509a6f8762eacc34ec2640dbf41fed45bc77cd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/platform/ui/list/List.tsx: invokeai/frontend/webv2/src/platform/ui/list/List.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 54 in List.List at line 129. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/platform/ui/list/List.tsx\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":"invokeai/frontend/webv2/src/platform/ui/list/List.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"5169abf249f40ebd2eae43a63398e6c2a9b7f2e5b99f2c8ed1057a06aea2c530"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/input/pointerPipeline.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/input/pointerPipeline.ts changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in pointerPipeline.createPointerPipeline.onKeyDown at line 376. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/input/pointerPipeline.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/input/pointerPipeline.ts"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc3edf21b4a31bd410e37e33ad4de2cc6cf1b660322285d1660d53245b771c0a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/invocations/krea2/krea2_denoise.py: invokeai/app/invocations/krea2/krea2_denoise.py changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in Krea2DenoiseInvocation._run_diffusion at line 352. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/invocations/krea2/krea2_denoise.py\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":"invokeai/app/invocations/krea2/krea2_denoise.py"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"4526e0feede740861c7b84607e58779444c784a9e76f0209bf2b9ac69a9ce0f6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/projects/components/OpenProjectDialog.tsx: invokeai/frontend/webv2/src/workbench/projects/components/OpenProjectDialog.tsx changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in OpenProjectDialog.OpenProjectDialog at line 47. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/projects/components/OpenProjectDialog.tsx\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":"invokeai/frontend/webv2/src/workbench/projects/components/OpenProjectDialog.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"854a4886b50342061c8cc21b931fca2c0098cd1d8c4843c9b6b3cd365324cda2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/promptFields/NegativePromptField.tsx: invokeai/frontend/webv2/src/features/generation/ui/promptFields/NegativePromptField.tsx changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in NegativePromptField.NegativePromptField at line 47. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/promptFields/NegativePromptField.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/NegativePromptField.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"53030d90e60315b1ce55e3f4e02c3e315583e0d0479d3e8ccb400c84f852120a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/useGalleryGridHotkeys.ts: invokeai/frontend/webv2/src/features/gallery/ui/useGalleryGridHotkeys.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in useGalleryGridHotkeys.useGalleryGridHotkeys at line 73. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/useGalleryGridHotkeys.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryGridHotkeys.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c6127ff9c08f334cf2d47201ce99e18b10a4a22cad0f6ea4cab200c150e2397"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/core/callSavedWorkflow.ts: invokeai/frontend/webv2/src/features/workflow/core/callSavedWorkflow.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in callSavedWorkflow.syncCallSavedWorkflowFields at line 220. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/core/callSavedWorkflow.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/callSavedWorkflow.ts"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"814acbcf2e795030fc2ebdaf8d7f1c67b1a4c37e3939cbe1b9aad54ea85af890"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widget-frame/WidgetBar.tsx: invokeai/frontend/webv2/src/workbench/widget-frame/WidgetBar.tsx changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in WidgetBar.WidgetBar at line 50. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widget-frame/WidgetBar.tsx\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":"invokeai/frontend/webv2/src/workbench/widget-frame/WidgetBar.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"8985a59898230b3c839f511417007e076008e97710c0a7af51f28431b7ad6d1e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/library/ProjectWorkflowsView.tsx: invokeai/frontend/webv2/src/features/workflow/ui/library/ProjectWorkflowsView.tsx changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in ProjectWorkflowsView.ProjectWorkflowDetailPanel at line 224. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/library/ProjectWorkflowsView.tsx\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":"invokeai/frontend/webv2/src/features/workflow/ui/library/ProjectWorkflowsView.tsx"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"88e832de090654f76bb698fc8106fef0f5330e157f56e7f446f7c73b7e43c49b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/architecture/dependencyPolicy.ts: invokeai/frontend/webv2/src/architecture/dependencyPolicy.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in dependencyPolicy.checkDependency at line 196. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/architecture/dependencyPolicy.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/architecture/dependencyPolicy.ts"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"56e8ae4e51172b12e10b08365d8c7f23c71a436d1272d50dd17deae6386c9c7d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/intermediates/ui/ClearDialog.tsx: invokeai/frontend/webv2/src/features/intermediates/ui/ClearDialog.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in ClearDialog.ClearDialog at line 153. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/intermediates/ui/ClearDialog.tsx\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":"invokeai/frontend/webv2/src/features/intermediates/ui/ClearDialog.tsx"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"85ea1709c6d05d59f41b0852af7accb445a6367ce65e914151ff86cc80f3054d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/promptFields/SystemPromptsField.tsx: invokeai/frontend/webv2/src/features/generation/ui/promptFields/SystemPromptsField.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in SystemPromptsField.SystemPromptsField at line 101. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/promptFields/SystemPromptsField.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/SystemPromptsField.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"de97b51f8b7cc753ef5c6b884303c7c4aa19cb26a027d63dd5a6aef1141ec508"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/models/ui/detail/RelatedModelsSection.tsx: invokeai/frontend/webv2/src/features/models/ui/detail/RelatedModelsSection.tsx changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in RelatedModelsSection.RelatedModelsForModel at line 35. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/models/ui/detail/RelatedModelsSection.tsx\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":"invokeai/frontend/webv2/src/features/models/ui/detail/RelatedModelsSection.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"683ed78817cecd9d588927cab63c18391b062b61585aa5a2d37d8f9fb81c0d69"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx: invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 69 in onInvocationComplete.buildOnInvocationComplete at line 91. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx\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":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"2745dad6ed9dd0a73f0fd257184dc4b2f1bdd0e7355b77a44393ee84fc14a53c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositeFrame.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositeFrame.ts changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in compositeFrame.createCompositeFrame.draw at line 183. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositeFrame.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositeFrame.ts"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccda8f78325d9448d71b55c14f634832e8575b3f36639112fce9e1eb502c695b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts: invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in paramsSlice.applyParamsVersionMigrations at line 1080. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":1080}}}],"partialFingerprints":{"codehealthFindingId/v1":"43a712fc94583d199654619027a033b81e693d91afae7998c2babb3bc7f99b10"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/layerPanelRows.ts: invokeai/frontend/webv2/src/workbench/widgets/layers/layerPanelRows.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in layerPanelRows.navigateTree at line 147. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/layerPanelRows.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerPanelRows.ts"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7715e913e32a2739fef4133532be782ed34d0b689585942e0138b5c4fe43967"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/ReferenceImageSettings.tsx: invokeai/frontend/webv2/src/workbench/widgets/layers/ReferenceImageSettings.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in ReferenceImageSettings.ReferenceImageEditor at line 225. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/ReferenceImageSettings.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/ReferenceImageSettings.tsx"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"9278aa7c4caa94f9f0c537455cf17b71da2b6dd70017eb49329ba367d46e10f0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx: invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in ReferenceImageCard.ReferenceImageCardBase at line 66. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3d8e5e44d06b58968e2892493a6a0d464cab40b6ba12f7192343385eff676dc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/invocations/ltx2/ltx2_denoise.py: invokeai/app/invocations/ltx2/ltx2_denoise.py changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in LTX2DenoiseInvocation.invoke at line 398. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/invocations/ltx2/ltx2_denoise.py\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":"invokeai/app/invocations/ltx2/ltx2_denoise.py"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"c39a7d53133755d4c7881c0f70058e7bc1aac4f2b6b2cd016cd0a8a057f6b55f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/generatedResultController.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/generatedResultController.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 32 in GeneratedResultController.commit at line 56. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/generatedResultController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/generatedResultController.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"c29926c15950df2d60ad48d0b64ff41ed0e800e26406c7f8bc85a44b3c2d0452"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentMirror.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentMirror.ts changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in documentMirror.diffValueEdit at line 171. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentMirror.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentMirror.ts"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0084db6fbaa80616c79b72278de09a581442f2a3c042e42baf59528124c42b9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/services/shared/execution_effects.py: invokeai/app/services/shared/execution_effects.py changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in ExecutionRef._accept_token_fields at line 146. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/shared/execution_effects.py\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":"invokeai/app/services/shared/execution_effects.py"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"f86b175ad75f89aeec270098c2846ee0047bc44521ac112570a46cc66188ff97"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/services/shared/graph_nested_iterate_planner.py: invokeai/app/services/shared/graph_nested_iterate_planner.py changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in graph_nested_iterate_planner._prepare_serial_nested_iterate_chain_for_outer at line 207. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/shared/graph_nested_iterate_planner.py\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":"invokeai/app/services/shared/graph_nested_iterate_planner.py"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb13c69b9893288b5c1c69a161edf93392ba961387d2341fd3f5959e8f27d13e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/canvas/ToolStripFlyout.tsx: invokeai/frontend/webv2/src/workbench/widgets/canvas/ToolStripFlyout.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 31 in ToolStripFlyout.ToolFamilyButton at line 46. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/canvas/ToolStripFlyout.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/ToolStripFlyout.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c897868b0bef2570af002bd8caf7b69811d71a4a85a2d14c4dc9dffb0ae35f7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/panes/TransformPane.tsx: invokeai/frontend/webv2/src/workbench/widgets/layers/panes/TransformPane.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in TransformPane.ConnectedTransform at line 56. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/panes/TransformPane.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/TransformPane.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"97458c05503873501e70fb6e70c4a73ed6b190270e72120f1882744e1a8b441c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/layerPanelState.ts: invokeai/frontend/webv2/src/workbench/layerPanelState.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in layerPanelState.reconcileLayerPanelState at line 201. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/layerPanelState.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/layerPanelState.ts"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"58364788156cba70f131c16f5c454fa0c3b53d6d888faf75d2dce8dc803a7636"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/core/canvas/addRegionalGuidance.ts: invokeai/frontend/webv2/src/features/generation/core/canvas/addRegionalGuidance.ts changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in addRegionalGuidance.addRegionalGuidance at line 227. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/core/canvas/addRegionalGuidance.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/canvas/addRegionalGuidance.ts"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"63ebdab7b2bd52ec5d9fb61fd1ec63baca8128e004c586d69c0ac44b8fcfd731"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/GenerateConditioningRebalanceField.tsx: invokeai/frontend/webv2/src/features/generation/ui/GenerateConditioningRebalanceField.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in GenerateConditioningRebalanceField.GenerateConditioningRebalanceField at line 61. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/GenerateConditioningRebalanceField.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/GenerateConditioningRebalanceField.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"939744dddc791c70e9fa56938546a2a4d4fa0073243df5c4555f6756fc9bc8da"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/queue-integration/queueRunRestoration.ts: invokeai/frontend/webv2/src/workbench/queue-integration/queueRunRestoration.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 90 in queueRunRestoration.normalizeRestoredQueueItem at line 17. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/queue-integration/queueRunRestoration.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRunRestoration.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b492f621e8b1bd331731b4988c7398353843b5c081607fc3ab515732b2bb750"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-operations/generationComposite.ts: invokeai/frontend/webv2/src/workbench/canvas-operations/generationComposite.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in generationComposite.composeForGeneration at line 131. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-operations/generationComposite.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/generationComposite.ts"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a0deec288d0a2d090173f0eb4ecf7bff88c0f5b05a8959272898c74379bd3fd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-operations/importGalleryImages.ts: invokeai/frontend/webv2/src/workbench/canvas-operations/importGalleryImages.ts changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in importGalleryImages.importGalleryImagesToCanvas at line 236. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-operations/importGalleryImages.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/importGalleryImages.ts"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"268fa7db23567d5e0a61b72c309ce399e06d955012c8bffeca60513e59268258"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts: invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in indexedDbDraftStore.createIndexedDbProjectDraftStore.retargetAcknowledgedCopy at line 991. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":991}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac82ae3dcae163d01d527be5ddf1f2ffa6ed0a6b4c9371eb9e8cde1937ee1948"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgetDnd.ts: invokeai/frontend/webv2/src/workbench/widgetDnd.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in widgetDnd.resolveWidgetDragEnd at line 224. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgetDnd.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgetDnd.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea5d56694cf8997c96cd3b181506bfad1bfafc86a6352a0b26bd65f3fb14f06e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardTransferActions.tsx: invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardTransferActions.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in WildcardTransferActions.WildcardTransferActions 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardTransferActions.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardTransferActions.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7827c0c2ee0031d19cbdef6f2631d72951c0f926488a109f9935262fb15d74f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/render/groupSurfaceCache.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/render/groupSurfaceCache.ts changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in groupSurfaceCache.createGroupSurfaceCache.resolve at line 331. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/render/groupSurfaceCache.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/groupSurfaceCache.ts"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"33e5ac1b9f773f51f5b00d37ac1dc0361d3e502d97efd418e58928f05c4c765e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/queue-integration/queueRecall.ts: invokeai/frontend/webv2/src/workbench/queue-integration/queueRecall.ts changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in queueRecall.buildQueueRecallValues at line 52. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/queue-integration/queueRecall.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRecall.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d0fff3be65a909bee4bb54b4359f2cf0e96b8847d2eade2c31427eeca14cdef"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/core/modelRequirements.ts: invokeai/frontend/webv2/src/features/workflow/core/modelRequirements.ts changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in modelRequirements.extractWorkflowModelRequirements at line 191. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/core/modelRequirements.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/modelRequirements.ts"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"653e2eafbd9b3ebf3cd1cf631d46dcff4c3fd4094cd87d4b9a58367af0324814"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/model_manager/load/model_loaders/lora.py: invokeai/backend/model_manager/load/model_loaders/lora.py changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in LoRALoader._load_model at line 96. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/model_manager/load/model_loaders/lora.py\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":"invokeai/backend/model_manager/load/model_loaders/lora.py"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"b59ff59243176b00377094a639f5024fdaa0e9df301301f8aa6dac0234fd361e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/panes/ColorPane.tsx: invokeai/frontend/webv2/src/workbench/widgets/layers/panes/ColorPane.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in ColorPane.ColorPane at line 44. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/panes/ColorPane.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/ColorPane.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b4ffe68fc1fe29b8c07e7d6d1bfcb33473ec552b968208e90560ae396dcae2e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/transformEditingController.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/transformEditingController.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in TransformEditingController.apply at line 125. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/transformEditingController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/transformEditingController.ts"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbfbcf94714bd5febfe8593f4bb13f3d3b7dfdbb6019a19910c2dfa80d5c927c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/rasterSnapshotCapture.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/rasterSnapshotCapture.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in rasterSnapshotCapture.createRasterSnapshotCapture.captureRasterSnapshot at line 93. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/rasterSnapshotCapture.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/rasterSnapshotCapture.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"66c92b5d8a0b29da8bfa63a1f98314257220d3919f0e2f923c383b3ab2e960dd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/image-actions/revealGalleryItem.ts: invokeai/frontend/webv2/src/workbench/image-actions/revealGalleryItem.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 33 in revealGalleryItem.revealGalleryItem at line 53. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/image-actions/revealGalleryItem.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/revealGalleryItem.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"7da0090503f802175ebed41dd264f9390ff0f14427b041eaaf8b6bb44e12e1cd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/flux/denoise.py: invokeai/backend/flux/denoise.py changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 33 in denoise.denoise at line 22. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/flux/denoise.py\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":"invokeai/backend/flux/denoise.py"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6ff2ca1d48e00709b8541598ce572a235eed12e4320fd54fea55f7eebdec68c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/model_manager/load/model_loaders/qwen_image.py: invokeai/backend/model_manager/load/model_loaders/qwen_image.py changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in QwenVLEncoderCheckpointLoader._load_text_encoder_from_singlefile at line 433. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/model_manager/load/model_loaders/qwen_image.py\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":"invokeai/backend/model_manager/load/model_loaders/qwen_image.py"},"region":{"startLine":433}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecd1b5f36da69bbdbcff046bd5180945a647828ab27be0c334702a07ec10301d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/nodes/ui/add-nodes/AddNodesView.tsx: invokeai/frontend/webv2/src/features/nodes/ui/add-nodes/AddNodesView.tsx changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in AddNodesView.AddNodesView at line 25. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/nodes/ui/add-nodes/AddNodesView.tsx\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":"invokeai/frontend/webv2/src/features/nodes/ui/add-nodes/AddNodesView.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"92d4d14c4b2abf60e30ee032a3e01b61a54a352f618f7ca63ab46d4dadcc6661"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/queue-integration/QueueRecoveryNotice.tsx: invokeai/frontend/webv2/src/workbench/queue-integration/QueueRecoveryNotice.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 41 in QueueRecoveryNotice.QueueRecoveryNotice at line 33. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/queue-integration/QueueRecoveryNotice.tsx\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":"invokeai/frontend/webv2/src/workbench/queue-integration/QueueRecoveryNotice.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6afe8156b7e7764a5b54b6adac8c0ebb42d6f26429b331976968a3fce444ae2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/preview/useCompareLoupe.ts: invokeai/frontend/webv2/src/workbench/widgets/preview/useCompareLoupe.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 41 in useCompareLoupe.useCompareLoupe at line 57. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/preview/useCompareLoupe.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/useCompareLoupe.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"48ef7681eff09156832b3fb5e10ab301384dd90387ac2edfc83975af20cd37a7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/editor/flowAdapters.ts: invokeai/frontend/webv2/src/features/workflow/ui/editor/flowAdapters.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in flowAdapters.toFlowNodes at line 197. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/editor/flowAdapters.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/flowAdapters.ts"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c8ed2ed6204c1594869ce38440884b3126f14931c7e68e22fb2f362a630909c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvasDimsSync.ts: invokeai/frontend/webv2/src/workbench/canvasDimsSync.ts changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in canvasDimsSync.reconcileCanvasDims at line 83. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvasDimsSync.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvasDimsSync.ts"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"14cf4d88abf68594ad909abaa7ec1b142454a58c9932c5ac98f8155ef1b6fc3c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts: invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 32 in validators.getRegionalGuidanceWarnings at line 37. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d1fa8b866e676a9f86af83253b8ce52fc78e236fc76f57684a47ed3444be311"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/invocations/video_concat.py: invokeai/app/invocations/video_concat.py changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in VideoConcatInvocation._build_audio_track at line 699. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/invocations/video_concat.py\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":"invokeai/app/invocations/video_concat.py"},"region":{"startLine":699}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fb8d78dfd6e87969f09e456f3e9ecbb4725e51b50d4248a534af8a3fb87ed55"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/core/layerWorkflow.ts: invokeai/frontend/webv2/src/features/workflow/core/layerWorkflow.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in layerWorkflow.buildLayerWorkflowGraph at line 203. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/core/layerWorkflow.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/layerWorkflow.ts"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe6001ae35d432bf2f2313a302f7c7d5df51e2cd775e65d1db884b62bc796e9f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/GalleryProgressSection.tsx: invokeai/frontend/webv2/src/features/gallery/ui/GalleryProgressSection.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in GalleryProgressSection.GalleryProgressTile at line 183. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/GalleryProgressSection.tsx\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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryProgressSection.tsx"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"b104f7c7b08aa53d31ab968818f560843de2f57f1173c86f5bd3f8842a7201c5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/LayerSurfaceHost.tsx: invokeai/frontend/webv2/src/workbench/widgets/layers/LayerSurfaceHost.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in LayerSurfaceHost.LayerSurfaceHost at line 42. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/LayerSurfaceHost.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerSurfaceHost.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"b39f91dee411bb688925fc05463b9c0a0a4f26d43b8d933fe11131eb83926aaa"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryCard.tsx: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryCard.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in WorkflowLibraryCard.WorkflowLibraryCard at line 83. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryCard.tsx\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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryCard.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"68a5db0ac2a49c9c8f8d0dca9dca0b826f551a08131a9cded54e5b8a1cf37fbf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageControls.tsx: invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageControls.tsx changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in ReferenceImageControls.IPAdapterControls at line 109. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageControls.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageControls.tsx"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"062129887258acb53bcb362359466edc121c8141d5f51a0270e11a3c0a61c63e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/services/videos/videos_default.py: invokeai/app/services/videos/videos_default.py changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in VideoService.create at line 51. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/videos/videos_default.py\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":"invokeai/app/services/videos/videos_default.py"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4c3fe25ca7bacb23cb2bf9b8a1822d7be6f5c925f3617ae0307a5b9a8b86a8a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerCache.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerCache.ts changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in layerCache.createLayerCacheStore.growToRect at line 306. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerCache.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerCache.ts"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"218ce9721a6d01c52ddacac82f5fbaa1119cdb55c943b9d0443e06ba71f913ac"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/invocations/flux2/flux2_denoise.py: invokeai/app/invocations/flux2/flux2_denoise.py changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in Flux2DenoiseInvocation._run_diffusion at line 311. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/invocations/flux2/flux2_denoise.py\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":"invokeai/app/invocations/flux2/flux2_denoise.py"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"198d4ad3e7727405a9ed2c9620ddae6f08ea217f30ae486af88fe8c0cc8616e1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/projects/draftStore.ts: invokeai/frontend/webv2/src/workbench/projects/draftStore.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 48 in draftStore.isProjectDraftCandidate at line 452. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/projects/draftStore.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"e29566e238f3c71f74865925921d31267d4fd1242ada02acc666116690987ae7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/flux2/denoise.py: invokeai/backend/flux2/denoise.py changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in denoise.denoise at line 20. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/flux2/denoise.py\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":"invokeai/backend/flux2/denoise.py"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef5e98d825316c72659f041cef99c95f73662a3c81b77454f939f18233ff9c37"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/platform/ui/Combobox.tsx: invokeai/frontend/webv2/src/platform/ui/Combobox.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in Combobox.Combobox at line 53. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/platform/ui/Combobox.tsx\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":"invokeai/frontend/webv2/src/platform/ui/Combobox.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc8a64961cbf2e6a323b469447e2afa487ee367658e3079a0dc2a8157600a6ae"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryGrid.tsx: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryGrid.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in WorkflowLibraryGrid.WorkflowLibraryGrid at line 52. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryGrid.tsx\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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryGrid.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"c88616364302b0109071d6dfa175569fd22c0bd3db57e8e89147fbc9a5502b2a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewHeaderActions.tsx: invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewHeaderActions.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in PreviewHeaderActions.PreviewHeaderActions at line 21. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewHeaderActions.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewHeaderActions.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"8027d1b23339408789b0f14dc76e12333427958ac76a762c59a01f9b1115a7d2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/core/prompt/dynamicPromptSyntax.ts: invokeai/frontend/webv2/src/features/generation/core/prompt/dynamicPromptSyntax.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in dynamicPromptSyntax.scanDynamicPromptSyntax at line 57. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/core/prompt/dynamicPromptSyntax.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/prompt/dynamicPromptSyntax.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b6ca1d27e64261fa2bb2a1e990b05bec96e1e606de17d1f2779b0d2a0c68e5d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentIndex.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentIndex.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in documentIndex.deriveIndexForValueEdit at line 292. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentIndex.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentIndex.ts"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"af1108693ad85d18d32b762b56069e0b647a48b1d6ba5a3f5663f34c294038c5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/nodes/util/graph/buildNodesGraph.ts: invokeai/frontend/webv1/src/features/nodes/util/graph/buildNodesGraph.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in buildNodesGraph.buildNodesGraph at line 48. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/nodes/util/graph/buildNodesGraph.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildNodesGraph.ts"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b3b2e7188b809e0633adcb5e3ceaab79676d28248ebb6a41ed95fbc8b081eec"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/queue/ui/QueueItemRow.tsx: invokeai/frontend/webv2/src/features/queue/ui/QueueItemRow.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in QueueItemRow.QueueItemRow at line 29. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/queue/ui/QueueItemRow.tsx\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":"invokeai/frontend/webv2/src/features/queue/ui/QueueItemRow.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"813360a146f2f31eb6b3b278cbb1c4c5949da516e18a5b0831c3d70d25fe0b2f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/identity/ui/UserFormDialog.tsx: invokeai/frontend/webv2/src/features/identity/ui/UserFormDialog.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in UserFormDialog.UserForm at line 76. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/identity/ui/UserFormDialog.tsx\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":"invokeai/frontend/webv2/src/features/identity/ui/UserFormDialog.tsx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d73a4267419fde470fa5b30f4faf0c57957eca7939fcedd5cfaeb76410b26e2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx: invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 69 in CanvasTextOverlay.TextEditor at line 95. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx\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":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"193638f4cf4d0e141c29b74783e941e236ee1096d6c85f42d02a2a4de7bc73d9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/services/shared/workflow_graph_builder.py: invokeai/app/services/shared/workflow_graph_builder.py changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 46 in workflow_graph_builder.build_graph_from_workflow at line 367. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/shared/workflow_graph_builder.py\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":"invokeai/app/services/shared/workflow_graph_builder.py"},"region":{"startLine":367}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f7c09a59aad88902fa02b48284b420c7201096dcba241a354958d75e12bc2e0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/panes/OverviewPane.tsx: invokeai/frontend/webv2/src/workbench/widgets/layers/panes/OverviewPane.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in OverviewPane.ConnectedOverview at line 50. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/panes/OverviewPane.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/OverviewPane.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"8767c3cc6125b39878b3bd2340c0c97b731bc157b6d011255228f6b9e697a790"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/invocations/qwen_image/qwen_image_denoise.py: invokeai/app/invocations/qwen_image/qwen_image_denoise.py changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in QwenImageDenoiseInvocation._run_diffusion at line 285. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/invocations/qwen_image/qwen_image_denoise.py\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":"invokeai/app/invocations/qwen_image/qwen_image_denoise.py"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2f74eab8988c812b1d5f48b28f2452cabf3fa95648d10f62d4cf390908f8369"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/shared/ConceptRow.tsx: invokeai/frontend/webv2/src/features/generation/ui/shared/ConceptRow.tsx changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in ConceptRow.ConceptRowContent at line 164. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/shared/ConceptRow.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/shared/ConceptRow.tsx"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbe21a1ca1126932bc91d6784accf88e1026ba233c370bc18110065aacdb479c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/LayerFilterControls.tsx: invokeai/frontend/webv2/src/workbench/widgets/layers/LayerFilterControls.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in LayerFilterControls.FilterParamField at line 133. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/LayerFilterControls.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerFilterControls.tsx"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"18168db284d65d8b3fd400571101e7aa1f9d4f2e704f0886bfca5ce7dbe3d033"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in CurrentImagePreview.CurrentImagePreview at line 30. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx\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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"de2a75a15dde0931a88b30af8e3cab9a5a28ac3f119a984e849c2f079e7bf5bd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/controlPixelController.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/controlPixelController.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in PixelEditController.begin at line 123. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/controlPixelController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/controlPixelController.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e1051ab42e446bcf17092a045febf7709a1dddc71650f1e6c9c6977b611b73d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/canvas/MissingFontsDialog.tsx: invokeai/frontend/webv2/src/workbench/widgets/canvas/MissingFontsDialog.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in MissingFontsDialog.RecoveryRow at line 139. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/canvas/MissingFontsDialog.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/MissingFontsDialog.tsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ae1d0cb664f95cc6bbbac643f7cc901d0d7ab8480306393de656b2d06a58732"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/services/api/index.ts: invokeai/frontend/webv1/src/services/api/index.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in index.dynamicBaseQuery at line 97. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/services/api/index.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/index.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"d435f733ad6bfe1e928e830935e61c1f16c3ae77c3315046d1ab7c9725698845"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/floatingSelectionController.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/floatingSelectionController.ts changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in FloatingSelectionController.lift at line 116. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/floatingSelectionController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/floatingSelectionController.ts"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"437ed158c6c42a6a57455eda57285f0b1666dae816ea20945a2e8d8bf0baa815"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 64 in addRegions.addRegions at line 84. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"24ea8cd4cd75fc768490994b4093b8edfa56b0c94af97d40adbdcfdf81ac2f74"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 64 in InputFieldRenderer.InputFieldRenderer at line 93. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx\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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"87dd7a055a2daa35eaeed1f0fc3d39048f855d842e1abd06e916834e42e28609"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/promptFields/promptFocus.ts: invokeai/frontend/webv2/src/features/generation/ui/promptFields/promptFocus.ts changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in promptFocus.getActiveTriggerQuery at line 108. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/promptFields/promptFocus.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/promptFocus.ts"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"94cbabfe82e8a2c84d2878acc8b0e2bde40cc2cc2b9811980fa9adb16f03cb9f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/settings/HotkeysSettingsSection.tsx: invokeai/frontend/webv2/src/workbench/settings/HotkeysSettingsSection.tsx changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in HotkeysSettingsSection.HotkeyListRow at line 281. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/settings/HotkeysSettingsSection.tsx\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":"invokeai/frontend/webv2/src/workbench/settings/HotkeysSettingsSection.tsx"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"967099b3f4998c5b5893042dfbd21f21346d8028b6d91b0a0be6c5319c641be4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/platform/ui/ColorPicker.tsx: invokeai/frontend/webv2/src/platform/ui/ColorPicker.tsx changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in ColorPicker.ColorPicker at line 151. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/platform/ui/ColorPicker.tsx\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":"invokeai/frontend/webv2/src/platform/ui/ColorPicker.tsx"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b431149f69ec9506357fae3ebb24278829ad9d47374fb923ccd3fd33724a34b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/settings/ImageMapVocabularySettings.tsx: invokeai/frontend/webv2/src/workbench/settings/ImageMapVocabularySettings.tsx changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in ImageMapVocabularySettings.ImageMapVocabularySettings at line 46. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/settings/ImageMapVocabularySettings.tsx\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":"invokeai/frontend/webv2/src/workbench/settings/ImageMapVocabularySettings.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"299c37149cb0a2959ecbcf3d9bdfcf5158771267340d8ec88ef6982c7722e5a8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/services/session_processor/workflow_call_runtime.py: invokeai/app/services/session_processor/workflow_call_runtime.py changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in WorkflowCallQueueLifecycle.apply_execution_effects at line 150. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/session_processor/workflow_call_runtime.py\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":"invokeai/app/services/session_processor/workflow_call_runtime.py"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"08d7968d3ef981f483d8160fd853ed1678ae1995fad10348b0bd6481a6e6153a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/models/ui/library/OrphanedModelsDialog.tsx: invokeai/frontend/webv2/src/features/models/ui/library/OrphanedModelsDialog.tsx changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in OrphanedModelsDialog.OrphanedModelsDialog at line 25. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/models/ui/library/OrphanedModelsDialog.tsx\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":"invokeai/frontend/webv2/src/features/models/ui/library/OrphanedModelsDialog.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccf1a4ec825114dcddc83d921a9ed6ea6c1f83302ff6689150179fb509e3571b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/invocations/anima/anima_denoise.py: invokeai/app/invocations/anima/anima_denoise.py changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 40 in AnimaDenoiseInvocation._run_diffusion at line 592. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/invocations/anima/anima_denoise.py\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":"invokeai/app/invocations/anima/anima_denoise.py"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"3aa5cebbe6eb1881c3ebdd6655e286ebf0e91917938be8f9167066d5c5de0d72"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/export/psdExport.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/export/psdExport.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in psdExport.planPsdExport at line 178. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/export/psdExport.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/export/psdExport.ts"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"d439edf13582b2f8281a6ef091dfccab2294a56f9b0a2141a3ea35c2ffa59ce6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/parameters/util/optimalDimension.ts: invokeai/frontend/webv1/src/features/parameters/util/optimalDimension.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in optimalDimension.getGridSize at line 110. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/parameters/util/optimalDimension.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/util/optimalDimension.ts"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"894e198f85803ef0c78b70c6903467f3fad11e5701e2ba38f7f4de146f7f97d3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/settings/SettingsEntryView.tsx: invokeai/frontend/webv2/src/workbench/settings/SettingsEntryView.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in SettingsEntryView.SettingsEntryView at line 59. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/settings/SettingsEntryView.tsx\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":"invokeai/frontend/webv2/src/workbench/settings/SettingsEntryView.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"4423676cda0224f317dd8f7f67d4cef0c81a4467bec0292b58fb39e8bfd09f54"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskLayerController.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskLayerController.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in MaskLayerController.clear at line 41. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskLayerController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskLayerController.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef35f182bda047dd84a92ca496631dafaa6be896bc37268786ff0816e3f115ae"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapDataRuntime.tsx: invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapDataRuntime.tsx changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in ImageMapDataRuntime.attachImageMapDataRuntime at line 42. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapDataRuntime.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapDataRuntime.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"4740a8499e7339a87922601cdc5419beffdc109414b3bf326e94197436a457d6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerGrid.tsx: invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerGrid.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in GalleryPickerGrid.GalleryPickerGrid at line 192. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerGrid.tsx\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":"invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerGrid.tsx"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"40b871d60345742cdc1d2573f1b558b38d61ddb61ea45bc3e769d40a7ac06c90"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/util/aac_splice.py: invokeai/app/util/aac_splice.py changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in aac_splice._read_audio_track 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/util/aac_splice.py\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":"invokeai/app/util/aac_splice.py"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c839582199c1b99245c20f6c295a7ed155c422f55a3aca908f36c5dfe0639f8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in useEnqueueCanvas.enqueueCanvas at line 41. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee2fefd77390a92141241006e43374dd0a82a322571b83abace5bfe6b6edd0bb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in useEnqueueGenerate.enqueueGenerate at line 38. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"53d8b956fee391b5262f5f2848ed9682b6dc58c9ff55130244806f93e8d1f86b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx: invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in GeneratorFieldInput.GeneratorFieldInput at line 396. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx\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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1d9d41f724ed5bf5c31e6d54e497457415d8c596fd4f633f7c82694088ba9c2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/selectionPixelController.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/selectionPixelController.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in SelectionPixelController.run at line 79. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/selectionPixelController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/selectionPixelController.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"69eab98147605754094d7c6391196f0cb03a34de0f0cf92c38cd688fe808cee0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/palette/useCommandPaletteController.ts: invokeai/frontend/webv2/src/workbench/palette/useCommandPaletteController.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in useCommandPaletteController.useCommandPaletteController at line 61. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/palette/useCommandPaletteController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/palette/useCommandPaletteController.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9907345c35e4a2a3c716375981c44ca7522eafd6453ffce6a6fed0a52e0c945"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/settings/GenerationDevicesSettings.tsx: invokeai/frontend/webv2/src/workbench/settings/GenerationDevicesSettings.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in GenerationDevicesSettings.GenerationDevicesSettings at line 16. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/settings/GenerationDevicesSettings.tsx\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":"invokeai/frontend/webv2/src/workbench/settings/GenerationDevicesSettings.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"968ab57fb4b7adc6a46faa223b2052ea153b44307b4beeddeaa838a9d489051c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskResultController.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskResultController.ts changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in MaskResultController.commit at line 45. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskResultController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskResultController.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba2acf45bb6d60e80085abd62681bd543142eeb0ee41c62310b5a603a8bec22a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionState.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionState.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in selectionState.createSelectionState.commit at line 264. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionState.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionState.ts"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b2c1a903a89a4dfd8b9d2b005e18f47a727f5fea0348dfbf23c37e58b330575"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/text_llm_pipeline.py: invokeai/backend/text_llm_pipeline.py changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in TextLLMPipeline.run at line 144. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/text_llm_pipeline.py\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":"invokeai/backend/text_llm_pipeline.py"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"f10d80d2d861d1d148be9386a0d30ff41958f7c6fdfbd0563562d1af1f5bd1f8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryThumbnail.tsx: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryThumbnail.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in WorkflowLibraryThumbnail.WorkflowLibraryThumbnail at line 47. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryThumbnail.tsx\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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryThumbnail.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"9355906cc2cc2b2026a88025fb71b5fee4204621f1665480e0c58385fc18ea5b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in MainModelDefaultSettings.MainModelDefaultSettings at line 50. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx\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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"b10d535b0316870f9e2220c2e1cbaf141c1ffeef3fdb0fb0609956beeba8308a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/platform/core/outputImages.ts: invokeai/frontend/webv2/src/platform/core/outputImages.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 33 in outputImages.visitOutputImageNames at line 10. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/platform/core/outputImages.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/core/outputImages.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"15a47626b94b88209efa008a744eeb1354b54e33acd8b2228d0cf6751ba29a20"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/util/user_management.py: invokeai/app/util/user_management.py changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in user_management._modify_user_interactive at line 449. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/util/user_management.py\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":"invokeai/app/util/user_management.py"},"region":{"startLine":449}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fc716d3aa8f058065ef8cc9d3fa69302163d9193e130b05909bb9ebd3c7822e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/floatingWindows.ts: invokeai/frontend/webv2/src/workbench/floatingWindows.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in floatingWindows.validateFloatingWidgets at line 258. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/floatingWindows.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/floatingWindows.ts"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"35421a8a8389058472fc26a034631879749b2c2bce9f935b76701a1eb212185b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/api/routers/board_images.py: invokeai/app/api/routers/board_images.py changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in board_images.remove_images_from_board at line 303. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/api/routers/board_images.py\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":"invokeai/app/api/routers/board_images.py"},"region":{"startLine":303}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d53d83cf1537acc0cce7c50685541bbe310384445310b6774590e046c7b1614"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/services/shared/execution_engine/primitives.py: invokeai/app/services/shared/execution_engine/primitives.py changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in StreamBuffer._coerce_event at line 322. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/shared/execution_engine/primitives.py\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":"invokeai/app/services/shared/execution_engine/primitives.py"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"c62390a2552138f85a4b43ee7ac29dbf293df89a6bc0ede2ec1ff370cbf970f1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/util/h264_splice.py: invokeai/app/util/h264_splice.py changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 31 in h264_splice._read_video_stbl at line 344. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/util/h264_splice.py\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":"invokeai/app/util/h264_splice.py"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"31ae64060cfd44ff7bd343adea3e141ad5c58d056079569abb540106cc20f474"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/layerTreeDrop.ts: invokeai/frontend/webv2/src/workbench/widgets/layers/layerTreeDrop.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 31 in layerTreeDrop.projectLayerDrop at line 52. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/layerTreeDrop.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerTreeDrop.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"dccbae8e1c4f4bd228fcf7b512b7461d32e80019746a90463cb8264b152d564e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/image-actions/videoRecallRuntime.ts: invokeai/frontend/webv2/src/workbench/image-actions/videoRecallRuntime.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in videoRecallRuntime.createVideoRecallRuntime at line 127. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/image-actions/videoRecallRuntime.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/videoRecallRuntime.ts"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3c99e52d3e7670323704785c3196a5a23e08be98095007738bd406bdbef1834"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/platform/ui/settings/SettingControl.tsx: invokeai/frontend/webv2/src/platform/ui/settings/SettingControl.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in SettingControl.SettingControl at line 24. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/platform/ui/settings/SettingControl.tsx\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":"invokeai/frontend/webv2/src/platform/ui/settings/SettingControl.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"db954888c8b746fe8b5705246d6804b65fa8eddadf8ec9d23236ba4b700a16eb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.ts: invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in controlValidation.getControlValidationReason at line 92. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.ts"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddfe6ebaa8efd9fc14b434389771ecf5f893341a6d9ec71d3d2151105fedfa61"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/patches/layer_patcher.py: invokeai/backend/patches/layer_patcher.py changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in LayerPatcher.apply_smart_model_patch at line 113. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/patches/layer_patcher.py\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":"invokeai/backend/patches/layer_patcher.py"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c30009bd55a156f4cd4fb5dfe221a97ffd79bd60fd7a272b33d47c29329c482"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/editor/workflowImageExport.ts: invokeai/frontend/webv2/src/features/workflow/ui/editor/workflowImageExport.ts changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in workflowImageExport.getWorkflowContentBounds at line 170. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/editor/workflowImageExport.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/workflowImageExport.ts"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"62764e1b8c0ead246f165ebfc76ff13a27f4f82d2e8f7b350794c6f736b9d328"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/model_manager/load/model_cache/cached_model/cached_model_with_partial_load.py: invokeai/backend/model_manager/load/model_cache/cached_model/cached_model_with_partial_load.py changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in CachedModelWithPartialLoad.partial_load_to_vram_chunk at line 384. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/model_manager/load/model_cache/cached_model/cached_model_with_partial_load.py\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":"invokeai/backend/model_manager/load/model_cache/cached_model/cached_model_with_partial_load.py"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"d98ea2855c30d7fb809c699664dd983bd12e873575102d1a5dfbadb8264dc23f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/pid/_src/networks/pid_net.py: invokeai/backend/pid/_src/networks/pid_net.py changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 43 in PidNet.forward at line 274. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/pid/_src/networks/pid_net.py\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":"invokeai/backend/pid/_src/networks/pid_net.py"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"038cc1003a1f30dee0ce56031165355fe49073ad36ef538442795f8d348356ed"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/core/graphToDocument.ts: invokeai/frontend/webv2/src/features/workflow/core/graphToDocument.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in graphToDocument.previewGraphToDocument at line 36. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/core/graphToDocument.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/graphToDocument.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"51615ea4925a1ac0019bdc2fa12989bfec7075e57a7ed23253c6a2b3297b6bce"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in buildSDXLGraph.buildSDXLGraph at line 41. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"833beb8f5da23c005292e551add8b1aa7cd0c2d6f16a5401a6b4d336a224eb20"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/useGalleryGridSelection.ts: invokeai/frontend/webv2/src/features/gallery/ui/useGalleryGridSelection.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in useGalleryGridSelection.useGalleryGridSelection.selectItemRange at line 98. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/useGalleryGridSelection.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryGridSelection.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0c95a6206911b7320ae3ec4b531da7003f084e6201b7afd917aa979dffdf244"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/invocations/qwen_image_2_1/qwen_image_2_1_denoise.py: invokeai/app/invocations/qwen_image_2_1/qwen_image_2_1_denoise.py changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in QwenImage21DenoiseInvocation._run_diffusion at line 166. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/invocations/qwen_image_2_1/qwen_image_2_1_denoise.py\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":"invokeai/app/invocations/qwen_image_2_1/qwen_image_2_1_denoise.py"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"54b091e1662d7805f16453bb9db8cd6082070b0748c2edcae1ad7d4e45e92c09"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/platform/ui/ResizeHandle.tsx: invokeai/frontend/webv2/src/platform/ui/ResizeHandle.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 38 in ResizeHandle.ResizeHandle at line 197. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/platform/ui/ResizeHandle.tsx\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":"invokeai/frontend/webv2/src/platform/ui/ResizeHandle.tsx"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba7aab905e4431ea2010972f317ce2d43bf90fba96a19ac1648264b38ec43848"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/image-map/ClusterStrengthField.tsx: invokeai/frontend/webv2/src/workbench/widgets/image-map/ClusterStrengthField.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in ClusterStrengthField.ClusterStrengthField at line 40. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/image-map/ClusterStrengthField.tsx\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":"invokeai/frontend/webv2/src/workbench/widgets/image-map/ClusterStrengthField.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"0936d273ca55f128fe874cd65e36f99ac4fea0bba658f68eb2fa05c2d9d6c798"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/components/WorkbenchUnavailableScreen.tsx: invokeai/frontend/webv2/src/workbench/components/WorkbenchUnavailableScreen.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in WorkbenchUnavailableScreen.WorkbenchUnavailableScreen at line 18. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/components/WorkbenchUnavailableScreen.tsx\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":"invokeai/frontend/webv2/src/workbench/components/WorkbenchUnavailableScreen.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"40799c6dce962d878b0f689c81cde6cf7e7a5a9eb8315dc23e409dd9aa0bf031"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/platform/ui/DropZone.tsx: invokeai/frontend/webv2/src/platform/ui/DropZone.tsx changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in DropZone.DropZone at line 25. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/platform/ui/DropZone.tsx\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":"invokeai/frontend/webv2/src/platform/ui/DropZone.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"31913aa45e36f038bcd8c43d691e32f14d905091566c200f24d2de21f74edb67"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/nodes/util/workflow/graphToWorkflow.ts: invokeai/frontend/webv1/src/features/nodes/util/workflow/graphToWorkflow.ts changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in graphToWorkflow.graphToWorkflow at line 42. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/nodes/util/workflow/graphToWorkflow.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/workflow/graphToWorkflow.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"a70340c33e37f6406cb5ef9f6bdf036f30dd77596b4d1f761700004c2809a84c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in addOutpaint.addOutpaint 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2f2d96d6377698c3911eb89561d969c460f40b420ff94fdd54965e4a3b5d4ad"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/services/shared/graph_if_activation.py: invokeai/app/services/shared/graph_if_activation.py changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in _IfActivationController._branch_sources at line 26. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/shared/graph_if_activation.py\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":"invokeai/app/services/shared/graph_if_activation.py"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe824feacdd4a541192e4f188954c11dd563b2b413a3447e241727211e99d822"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/models/ui/detail/ModelSettingsMenuItems.tsx: invokeai/frontend/webv2/src/features/models/ui/detail/ModelSettingsMenuItems.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in ModelSettingsMenuItems.ModelSettingsMenuItems at line 21. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/models/ui/detail/ModelSettingsMenuItems.tsx\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":"invokeai/frontend/webv2/src/features/models/ui/detail/ModelSettingsMenuItems.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"73bad66a7e656e9cf637b0d58648c91fee50059c2385a1603d2495e47a7f52f5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widget-frame/WidgetInstanceContextMenu.tsx: invokeai/frontend/webv2/src/workbench/widget-frame/WidgetInstanceContextMenu.tsx changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in WidgetInstanceContextMenu.WidgetInstanceContextMenu at line 34. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widget-frame/WidgetInstanceContextMenu.tsx\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":"invokeai/frontend/webv2/src/workbench/widget-frame/WidgetInstanceContextMenu.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"59becfb72f2eb539ef8df2f99ce90182cf6aed8ecea1c6033057c1601810f44d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/auth/components/ProtectedRoute.tsx: invokeai/frontend/webv1/src/features/auth/components/ProtectedRoute.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in ProtectedRoute.ProtectedRoute at line 21. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/auth/components/ProtectedRoute.tsx\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":"invokeai/frontend/webv1/src/features/auth/components/ProtectedRoute.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bd20c8defd090c9fb029bce99b2ad033d674d26021074ffc9b56f585682a731"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in addInpaint.addInpaint at line 47. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1e3903ecc6c188b4eb3d152c025fdbfeea9fb3090869fb3b30191c664fee832"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/gallery/ui/GallerySettingField.tsx: invokeai/frontend/webv2/src/features/gallery/ui/GallerySettingField.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in GallerySettingField.GallerySettingField at line 10. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/ui/GallerySettingField.tsx\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":"invokeai/frontend/webv2/src/features/gallery/ui/GallerySettingField.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"753fa880ed951b60435d1e0046d567940e9d1240ae41d58156f22c2d8aca4e77"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/ltx2/denoise.py: invokeai/backend/ltx2/denoise.py changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in denoise.denoise at line 621. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/ltx2/denoise.py\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":"invokeai/backend/ltx2/denoise.py"},"region":{"startLine":621}}}],"partialFingerprints":{"codehealthFindingId/v1":"b532669f87e1113eeb68351d4e3cff64943b8f870b3f696f1ad4f4c239b2582a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/image-map/imageLabelCache.ts: invokeai/frontend/webv2/src/workbench/image-map/imageLabelCache.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in imageLabelCache.getImageLabels at line 73. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/image-map/imageLabelCache.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-map/imageLabelCache.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"6036b364cc111f9b04e7bb1ff54a6f81d125f389ef401485d3108735420185ca"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/invocations/vae/wan_latents_to_video.py: invokeai/app/invocations/vae/wan_latents_to_video.py changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in WanLatentsToVideoInvocation.invoke at line 98. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/invocations/vae/wan_latents_to_video.py\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":"invokeai/app/invocations/vae/wan_latents_to_video.py"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"f204d09fd0d375daa5b9cf8001344cad345da6dbc48f6ca2b55bb2c3eea6ab19"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/intermediates/holdLease.ts: invokeai/frontend/webv2/src/features/intermediates/holdLease.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in holdLease.startIntermediatesHoldLease at line 32. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/intermediates/holdLease.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/intermediates/holdLease.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcf8b47fa3c3a614e9fe2128f81655658a9be2a1e35b47981850cccf524cc98f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/generation/ui/shared/ConditioningRebalanceBars.tsx: invokeai/frontend/webv2/src/features/generation/ui/shared/ConditioningRebalanceBars.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in ConditioningRebalanceBars.ConditioningRebalanceBars at line 100. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/shared/ConditioningRebalanceBars.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/shared/ConditioningRebalanceBars.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0550eaa823b3d234a37fca51ea871e003f12f61f73c879ac961273e1dbfe09f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/render/adjustments.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/render/adjustments.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in adjustments.isIdentityAdjustmentEntry at line 119. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/render/adjustments.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/adjustments.ts"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"31a370d593262fa59e18fbf776c1a444445d8fbe258c14dfe5d02c8be1948f51"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in buildMiniMaxH3Graph.buildMiniMaxH3Graph at line 67. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c85ab3adfd482ba86833c0691f0842580797c46ef8ec2ca309298aadcc91452"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in RefImageSettings.RefImageSettingsContent at line 68. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx\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":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"959e6f6ef4daba5eb787ac9a62d42ad9a36fa7cf9e107af236af796c3fe6000d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/palette/paletteQueryModel.ts: invokeai/frontend/webv2/src/workbench/palette/paletteQueryModel.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in paletteQueryModel.derivePaletteQueryModel at line 31. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/palette/paletteQueryModel.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/palette/paletteQueryModel.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"823de9e49d09ffd8abab864947ec3e4b582f8d06aed47b4c746e6096e797b4d7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/app/invocations/wan/wan_denoise.py: invokeai/app/invocations/wan/wan_denoise.py changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in _ExpertSwapper.get at line 214. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/invocations/wan/wan_denoise.py\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":"invokeai/app/invocations/wan/wan_denoise.py"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ae977db7eeeca7118eadbea23c712a8f5a1c87fee05d5c39d7886d5d0ee5227"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/canvas/color-system/useMaskTintEditor.ts: invokeai/frontend/webv2/src/workbench/widgets/canvas/color-system/useMaskTintEditor.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in useMaskTintEditor.useMaskTintEditor at line 50. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/canvas/color-system/useMaskTintEditor.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/color-system/useMaskTintEditor.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7d000d3910e57c6c5eaaf4f8f8a2ab161b9cf80326a1a2a8c05731985aab640"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in buildZImageGraph.buildZImageGraph at line 49. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"f44e42a878797f7b23fa36e5fa3883b4cb195c4bc332f89a8dd0a279d13da009"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts: invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in graphBuilderUtils.getDenoisingStartAndEnd at line 228. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"735ad7fb81e433d9410e57cce1eda225bdb8d4ca77147dd716db65c5559b5b75"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/model_manager/metadata/fetch/huggingface.py: invokeai/backend/model_manager/metadata/fetch/huggingface.py changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in HuggingFaceMetadataFetch.from_id at line 94. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/model_manager/metadata/fetch/huggingface.py\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":"invokeai/backend/model_manager/metadata/fetch/huggingface.py"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"685d2bc7ea76c3a69d673feec98541e900e420b439db5be84920e6e430254778"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/quantization/gguf/loaders.py: invokeai/backend/quantization/gguf/loaders.py changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in loaders.gguf_sd_loader at line 147. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/quantization/gguf/loaders.py\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":"invokeai/backend/quantization/gguf/loaders.py"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d5faebdb9a1cbbb648274b4eabe99d1f1975632d4191b37d498797375ff3eb6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowSelectionRequestRuntime.tsx: invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowSelectionRequestRuntime.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in WorkflowSelectionRequestRuntime.WorkflowSelectionRequestRuntime at line 95. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowSelectionRequestRuntime.tsx\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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowSelectionRequestRuntime.tsx"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"2aa9b3c12cbfeac176c45777a5237486a9326adcb9a3bb65b6a3d08a8b49dfcd"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/model_manager/search.py: invokeai/backend/model_manager/search.py changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in ModelSearch._walk_directory 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/model_manager/search.py\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":"invokeai/backend/model_manager/search.py"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"e43b104dfaded465a2622c5cd6451af729a34bf66eef11b4f9e922d53356c4fa"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in buildKrea2Graph.buildKrea2Graph at line 29. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbddd3637239ecaa10277800e7be5cc346346aa629330f69c4333ba7d5845cd5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-operations/filterGraphs.ts: invokeai/frontend/webv2/src/workbench/canvas-operations/filterGraphs.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in filterGraphs.buildFilterGraph at line 325. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-operations/filterGraphs.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/filterGraphs.ts"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d86559940add78284d0e0436d380ec32a85fa73a5947558b70bf57479998ccc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in GalleryImage.buildOnClick at line 42. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx\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":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"22dcd3e95607adf0f65d3a59c1ddf6a7d073ae48365f73873ef7aceae99a6288"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/intermediates/ui/useCleanupDialog.ts: invokeai/frontend/webv2/src/features/intermediates/ui/useCleanupDialog.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in useCleanupDialog.useCleanupDialog.confirm 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/intermediates/ui/useCleanupDialog.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/intermediates/ui/useCleanupDialog.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"98681c478f1a8718beac93a0b0e2a32959eeef79e7689dc0e9a06291430c5494"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx: invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in ChangeBoardModal.ChangeBoardModal at line 40. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx\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":"invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"6262ebfd9e7e96ab45fe26135e127cde85e149f4c7af511f8e7fb4d71c6f90db"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/hotkeys/resolve.ts: invokeai/frontend/webv2/src/workbench/hotkeys/resolve.ts changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in resolve.getScopePriority at line 18. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/hotkeys/resolve.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/hotkeys/resolve.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb3acc1c78e3d9cb60a48c5c125d02234cfc8e801c483a62847a028bdb83e7d1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/video/ui/PlayClipSpanButton.tsx: invokeai/frontend/webv2/src/features/video/ui/PlayClipSpanButton.tsx changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in PlayClipSpanButton.PlayClipSpanButton at line 18. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/video/ui/PlayClipSpanButton.tsx\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":"invokeai/frontend/webv2/src/features/video/ui/PlayClipSpanButton.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"899b15375d7165aa35b0ee9d3f0606eb5440a6f9393857a1b73bb38a05d44b30"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-operations/FilterOperationCoordinator.ts: invokeai/frontend/webv2/src/workbench/canvas-operations/FilterOperationCoordinator.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in FilterOperationCoordinator.createFilterOperationCoordinator.start at line 93. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-operations/FilterOperationCoordinator.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/FilterOperationCoordinator.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5154a3fef81c94a159b530492b5d216571fcf33f2f33ca2a23f27d165574232"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/runLayerWorkflow.ts: invokeai/frontend/webv2/src/workbench/widgets/layers/runLayerWorkflow.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in runLayerWorkflow.runLayerWorkflow at line 116. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/runLayerWorkflow.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/runLayerWorkflow.ts"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad3702d36f063b352f48322e1426adb61110696d6ec8a63b0b0aba7dc1716507"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/selectionImageController.ts: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/selectionImageController.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in SelectionImageController.replace at line 30. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/selectionImageController.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/selectionImageController.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3e3d3435cc002a7b33d08c4bbcb78835b9ad592ddb87d9b93c76c20659f52b0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/backend/util/sage_attention.py: invokeai/backend/util/sage_attention.py changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in sage_attention.install_sage_attention at line 296. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/util/sage_attention.py\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":"invokeai/backend/util/sage_attention.py"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"08f3518bb09cd6beab7a3c8f6557084bcd14bd231db7625f09761701a2b18d60"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImagePreview.tsx: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImagePreview.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in RefImagePreview.RefImagePreview at line 79. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImagePreview.tsx\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":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImagePreview.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd3a033ea3ba9193aa2314d21624072c8eb9cdd3e1511d1ce73ec1556cecf33b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/features/queue/core/generationMeta.ts: invokeai/frontend/webv2/src/features/queue/core/generationMeta.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in generationMeta.extractGenerationMeta at line 19. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/queue/core/generationMeta.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/core/generationMeta.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"0972f7f60d732169bcce154f39e4ed132ee877de72a17ad4cbffd144edbbfd77"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv2/src/workbench/widgets/layers/useLayerStackActions.ts: invokeai/frontend/webv2/src/workbench/widgets/layers/useLayerStackActions.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in useLayerStackActions.useLayerStackActions at line 38. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/widgets/layers/useLayerStackActions.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/useLayerStackActions.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d312369de972f0272aaddb01e569e6dad55895556083de061c11d6b371dcabf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in buildSD1Graph.buildSD1Graph at line 30. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef6e6a8dcdeb4153dfe9cd46e0cdd0fc12e6e0c6e7f73fd0d269e50dc42187e9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx: invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in ExpandPromptButton.ExpandPromptButton at line 48. 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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx\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":"invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"82776eb40c0bb6907ad685a6088a099f669f4618106cb2afd2591de5db62da9f"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/backend/util/vae_working_memory.py: invokeai/backend/util/vae_working_memory.py changed 29 times in last 90 days and 15 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is vae_working_memory.estimate_vae_working_memory_sd15_sdxl at line 207), 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(wan): calibrate the VAE under the app\u0027s ROCm runtime\u201D; \u201Cfix(wan): budget the video VAE decode against reserved memory\u201D; \u201Cfix(vae): bound the pre-tiling ceiling by residency, not by usage Windows has paged out\u201D; \u201Cfix(vae): tile on the budget and our own residency, not on an adapter counter\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/util/vae_working_memory.py\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":"invokeai/backend/util/vae_working_memory.py"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b4193f6fd5dd2de4427d3798415e36de97937426a48916fcb9fd7e45681494d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/backend/quantization/fp8_scaled.py: invokeai/backend/quantization/fp8_scaled.py changed 20 times in last 90 days and 14 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 14 (its worst body is fp8_scaled.extract_fp8_scaled_layers at line 581), 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(fp8): keep the matmul probe off the forward path, probe CUDA for storage\u201D; \u201Cfix(fp8): decide keep_fp8 once, derive the compute dtype from a float param\u201D; \u201Cfix(loaders): refuse quantization payloads a plain scale fold cannot decode\u201D; \u201Cfix(loaders): refuse a quantized checkpoint where no loader handles its scales\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/quantization/fp8_scaled.py\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":"invokeai/backend/quantization/fp8_scaled.py"},"region":{"startLine":581}}}],"partialFingerprints":{"codehealthFindingId/v1":"add0b6e2317d569238076ff406303269f7d0292bb6e798cabd9c9961de36f91d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/backend/model_manager/load/model_loaders/anima.py: invokeai/backend/model_manager/load/model_loaders/anima.py changed 18 times in last 90 days and 10 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 13 (its worst body is AnimaCheckpointModel._load_from_singlefile at line 189), 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(fp8): reserve cache room before the scale fold, not after it\u201D; \u201Cfix(loaders): refuse a quantized checkpoint where no loader handles its scales\u201D; \u201Cfix(models): never cast a model that already holds fp8 weights\u201D; \u201Cfix(models): keep scaled fp8 weights packed when FP8 Storage is on\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/model_manager/load/model_loaders/anima.py\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":"invokeai/backend/model_manager/load/model_loaders/anima.py"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"b953df467436412812b912584d8c66fd74ff07fae491300bf19c184f761e73ab"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/workbench/WorkbenchContext.tsx: invokeai/frontend/webv2/src/workbench/WorkbenchContext.tsx changed 17 times in last 90 days and 9 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is WorkbenchContext.WorkbenchProvider at line 64), 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(canvas): scope the paint barrier to document writes and never wait on open edits\u201D; \u201Cfix(canvas): close raster-ownership review gaps\u201D; \u201Cfix(intermediates): close review findings across queue privacy, deletion safety and UI\u201D; \u201Cfix(webv2): release intermediate holds and require undo media refs\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/WorkbenchContext.tsx\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":"invokeai/frontend/webv2/src/workbench/WorkbenchContext.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4fa15e2ddf05f94fb01facb9488d2914e3376d0dd4a00789c806bf92c1d0e8a"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/gallery/index.ts: invokeai/frontend/webv2/src/features/gallery/index.ts changed 15 times in last 90 days and 8 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 6 (its worst body is index.addConfirmedPartition at line 141), 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(gallery): send results to the project board by default\u201D; \u201Cfix(gallery): keep the upload format table out of the eager chunk graph\u201D; \u201Cfix(gallery): accept every media format the upload routes ingest\u201D; \u201Cfix(webv2): don\u0027t error-toast video board attach for virtual destinations\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/gallery/index.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/index.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"1658f58fcf412eaa021cd93634b2d240700915bcc6dee8273f957361777335f7"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/app/services/shared/execution_state_migration.py: invokeai/app/services/shared/execution_state_migration.py changed 13 times in last 90 days and 8 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 13 (its worst body is execution_state_migration._compact_effects at line 42), 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(execution): harden queue and workflow state recovery\u201D; \u201Cfix(execution): preserve loop state across rehydration\u201D; \u201Cfix(execution): hide runtime ledgers from API schemas\u201D; \u201Cfix(execution): preserve nullable Iterate checkpoints\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/shared/execution_state_migration.py\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":"invokeai/app/services/shared/execution_state_migration.py"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"903c25ff21ef2d1c61394c7a37313d24c0e7b4c096f3795a2ac04bf95a2773ec"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/backend/architectures/capabilities.py: invokeai/backend/architectures/capabilities.py changed 8 times in last 90 days and 8 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 capabilities.architecture_capabilities at line 163), 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: floor guidance and CFG at 1 everywhere\u201D; \u201Cfix(architectures): backend owns VAE and scheduler policy; clear capability outage states\u201D; \u201Cfix(architectures): serve only what webv2 reads, and per-variant Wan VAEs\u201D; \u201Cfix(architectures): pin the latent space per base, and bound guidance from the node\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/architectures/capabilities.py\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":"invokeai/backend/architectures/capabilities.py"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"2341ef094bad8ae6f929274773aecc66ef5a03941ea5be77dca0b22d37754e23"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/generation/core/dynamicPrompts.ts: invokeai/frontend/webv2/src/features/generation/core/dynamicPrompts.ts changed 13 times in last 90 days and 7 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 13 (its worst body is dynamicPrompts.getWildcardLookupPath at line 33), 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: normalize prompt template view state\u201D; \u201Cfix: align wildcard handling with backend syntax\u201D; \u201Cfix(webv2): treat a wildcard comment the same in every format\u201D; \u201Cfix(webv2): make a wildcard round-trip an identity\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/core/dynamicPrompts.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/dynamicPrompts.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"737b65a3c9f0398e6933c491e3c852543909289eebb0916322e06c2cffc84c1d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplatesButton.tsx: invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplatesButton.tsx changed 12 times in last 90 days and 7 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 PromptTemplatesButton.PromptTemplatesButton at line 30), 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(webv2): square the icon-only prompt action buttons\u201D; \u201Cfix(webv2): strengthen row hover contrast\u201D; \u201Cfix(webv2): restore prompt row hover contrast\u201D; \u201Cfix(webv2): gate the template catalog fetch, and say when one is gone\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplatesButton.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplatesButton.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"473c57b0a28af083b253259515f7efb727beb3f586f6918e84f94b9e52c14ec0"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/models/data/installsStore.ts: invokeai/frontend/webv2/src/features/models/data/installsStore.ts changed 12 times in last 90 days and 7 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 12 (its worst body is installsStore.handleModelInstallSocketEvent at line 301), 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(ui): coalesce library refreshes from install completions\u201D; \u201Cfix(ui): unwrap backend error details in model manager notifications\u201D; \u201Cfix(ui): retry starter and install-queue loads after a failed first fetch\u201D; \u201Cfix(ui): prune finished install progress entries\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/models/data/installsStore.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/data/installsStore.ts"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2b0b203d08ab4bff361165eb98afffcb04db6e0ece8d597767fa84bad7d54d9"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/generation/ui/promptFields/usePromptTriggerAutocomplete.tsx: invokeai/frontend/webv2/src/features/generation/ui/promptFields/usePromptTriggerAutocomplete.tsx changed 10 times in last 90 days and 7 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is usePromptTriggerAutocomplete.usePromptTriggerAutocomplete.handleKeyDown at line 106), 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: preserve prompt behavior during template flattening\u201D; \u201Cfix(webv2): correct three prompt affordances\u201D; \u201Cfix(webv2): reach embeddings whose names contain spaces\u201D; \u201Cfix(webv2): dismiss the trigger pickers when the page moves\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/promptFields/usePromptTriggerAutocomplete.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/usePromptTriggerAutocomplete.tsx"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"72d0485ea1afc575863e9fe9ae2de567223828ab062e7429f56a1396e5dd4f61"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/app/services/model_load/model_load_default.py: invokeai/app/services/model_load/model_load_default.py changed 9 times in last 90 days and 7 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 8 (its worst body is ModelLoadService.load_model at line 149), 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(model-manager): refuse model loaders that bypass the stale-config check\u201D; \u201Cfix(model-manager): retire per-model edit tracking once no edit or load needs it\u201D; \u201Cfix(model-manager): keep the stale-load check off the database under MODEL_LOAD_LOCK\u201D; \u201Cfix(model-manager): read the model record outside MODEL_LOAD_LOCK\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/model_load/model_load_default.py\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":"invokeai/app/services/model_load/model_load_default.py"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d227a7e652b3628b8866a4ac5600dd55f73cc646dc8d74ff1a3fefd477a656f"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/app/api/routers/_access.py: invokeai/app/api/routers/_access.py changed 11 times in last 90 days and 6 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 6 (its worst body is _access.redact_project_ids at line 174), 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(gallery): refresh the gallery when media is uploaded elsewhere\u201D; \u201Cfix: align upstream authorization contracts\u201D; \u201Cfix(api): report partial failures and bound batch bodies on image routes (#9394)\u201D; \u201Cfix(api): grant board owners read access to board images\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/api/routers/_access.py\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":"invokeai/app/api/routers/_access.py"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fe873e473861c3155ede7361e5b45a029d64987554d7b8f9c371257b254efa5"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/app/WorkbenchApp.tsx: invokeai/frontend/webv2/src/app/WorkbenchApp.tsx changed 11 times in last 90 days and 6 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 1 (its worst body is WorkbenchApp.WorkbenchApp at line 29), 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(webv2): release intermediate holds and require undo media refs\u201D; \u201Cfix(intermediates): protect active and undo media during cleanup\u201D; \u201Cfix(gallery): refresh the gallery when media is uploaded elsewhere\u201D; \u201Cfix(webv2): apply recall API updates to the Generate panel\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/app/WorkbenchApp.tsx\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":"invokeai/frontend/webv2/src/app/WorkbenchApp.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"02f2a800f72e8bbb4020aff5414af2306dea23341b2976044911113e7f93e539"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/models/ui/detail/useModelActions.ts: invokeai/frontend/webv2/src/features/models/ui/detail/useModelActions.ts changed 9 times in last 90 days and 6 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 1 (its worst body is useModelActions.useModelActions at line 16), 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(ui): single-path relationship pruning on model deletes\u201D; \u201Cfix(ui): refresh starter install flags after model deletes\u201D; \u201Cfix(ui): make scoped actions report success and block re-entry\u201D; \u201Cfix(ui): translate remaining model manager strings\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/models/ui/detail/useModelActions.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/detail/useModelActions.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f9c5866c6b7c5a5afe0f84c16dc276af2e5503140dc5c4277493e413dab058d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/app/services/intermediates/intermediates_default.py: invokeai/app/services/intermediates/intermediates_default.py changed 8 times in last 90 days and 6 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 14 (its worst body is IntermediatesService._resolve_scope at line 330), 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(intermediates): close review findings across queue privacy, deletion safety and UI\u201D; \u201Cfix(intermediates): protect every saved reference and isolate force clears\u201D; \u201Cfix(intermediates): protect child media and serialize video deletion\u201D; \u201Cfix(intermediates): protect active and undo media during cleanup\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/intermediates/intermediates_default.py\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":"invokeai/app/services/intermediates/intermediates_default.py"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"c85887fc60b9698bc316f7e36cf327dce6349fd80be919f58da4f1bd26455253"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/models/data/relationshipsStore.ts: invokeai/frontend/webv2/src/features/models/data/relationshipsStore.ts changed 8 times in last 90 days and 6 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 8 (its worst body is relationshipsStore.fetchRelatedKeys at line 96), 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(ui): single-path relationship pruning on model deletes\u201D; \u201Cfix(ui): drop relationship entries for models gone after a refresh\u201D; \u201Cfix(ui): restore the relationships store to text\u201D; \u201Cfix(ui): load the relationships store on first picker open\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/models/data/relationshipsStore.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/data/relationshipsStore.ts"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"23f2679f4e6fc92dc40a2ad4013cd9debbfff00366b856b472f47001992f73bc"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/backend/util/wddm.py: invokeai/backend/util/wddm.py changed 7 times in last 90 days and 6 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 wddm._resolve_adapter at line 211), 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(vae): bound the pre-tiling ceiling by residency, not by usage Windows has paged out\u201D; \u201Cfix(vae): tile on the budget and our own residency, not on an adapter counter\u201D; \u201Cfix(vae): decide tiling on what other processes hold, not on the budget\u201D; \u201Cfix(vae): price up-front tiling from the measured peak and a stable ceiling\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/util/wddm.py\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":"invokeai/backend/util/wddm.py"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"63fa35956a0c24ede18b55d79d91c032c62cdad8093eb90d0bcfba6280c1faf3"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/backend/minimax_h3/rocm_causal_conv3d.py: invokeai/backend/minimax_h3/rocm_causal_conv3d.py changed 7 times in last 90 days and 6 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 5 (its worst body is rocm_causal_conv3d._decomposed_forward at line 72), 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(minimax-h3): hand MIOpen contiguous tensors in the conv3d decomposition\u201D; \u201Cfix(wan): keep the ROCm conv3d decomposition on HIP 7.2 and hand MIOpen contiguous tensors\u201D; \u201Cfix(rocm): keep the MiniMax H3 encoder conv3d decomposition on HIP \u003E= 7.2\u201D; \u201Cfix: retire the ROCm conv3d decompositions on HIP \u003E= 7.2\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/minimax_h3/rocm_causal_conv3d.py\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":"invokeai/backend/minimax_h3/rocm_causal_conv3d.py"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"458c95f4e1dcb023a710555c95f44a82392b067f79d5dd5c5bbb49ba4e7fffcf"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.ts: invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.ts changed 8 times in last 90 days and 5 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 architectureCapabilities.toBaseGenerationConfig at line 77), 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: floor guidance and CFG at 1 everywhere\u201D; \u201Cfix(architectures): backend owns VAE and scheduler policy; clear capability outage states\u201D; \u201Cfix(architectures): serve only what webv2 reads, and per-variant Wan VAEs\u201D; \u201Cfix(webv2): fail closed everywhere, and give the VAE facet a reader\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.ts"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"264d5985900e8fe1bc78df9ca861aebc27321c5f4fed28caa37eafe6a4667b21"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/app/util/video_audio.py: invokeai/app/util/video_audio.py changed 7 times in last 90 days and 5 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 video_audio.extract_audio_pcm at line 89), 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(video): bound splice reads and walks, cancel audio decodes\u201D; \u201Cfix(video): stop re-encoding the soundtrack kept by a trim\u201D; \u201Cfix(video): stop re-encoding earlier segments when extending videos\u201D; \u201Cfix(audio): select first stream for int16 extraction\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/util/video_audio.py\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":"invokeai/app/util/video_audio.py"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"c344b71258f54ca9057fb8bdf647f0611eb15c61f482b5d638eca89dd8a28782"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/workbench/canvas-operations/engineRegistry.ts: invokeai/frontend/webv2/src/workbench/canvas-operations/engineRegistry.ts changed 7 times in last 90 days and 5 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 7 (its worst body is engineRegistry.createEngineRegistry.getOrCreateEngine at line 121), 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(canvas): scope the paint barrier to document writes and never wait on open edits\u201D; \u201Cfix(canvas): close raster-ownership review gaps\u201D; \u201Cfix(intermediates): close review findings across queue privacy, deletion safety and UI\u201D; \u201Cfix(intermediates): protect active and undo media during cleanup\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/canvas-operations/engineRegistry.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/engineRegistry.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"b89c72631ea5a700debc2876b131896d16dd6412903ab50e91c79d749c1e30cd"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/backend/wan/rocm_causal_conv3d.py: invokeai/backend/wan/rocm_causal_conv3d.py changed 6 times in last 90 days and 5 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 7 (its worst body is rocm_causal_conv3d._verified_forward at line 96), 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(rocm): make the offload, the budget lookup and the ROCm checks hold up\u201D; \u201Cfix(wan): keep the ROCm conv3d decomposition on HIP 7.2 and hand MIOpen contiguous tensors\u201D; \u201Cfix: retire the ROCm conv3d decompositions on HIP \u003E= 7.2\u201D; \u201Cfix: make ALL strided surfaces of the conv3d decompositions contiguous\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/wan/rocm_causal_conv3d.py\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":"invokeai/backend/wan/rocm_causal_conv3d.py"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"995c6bbd3858e6f1dd159c51bb4d1eb87388bbf8225c9fed64549f18ddba8d50"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/app/services/model_install/model_install_common.py: invokeai/app/services/model_install/model_install_common.py changed 5 times in last 90 days and 5 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 6 (its worst body is model_install_common.active_install_claim_scan_lock at line 40), 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(model-manager): preserve recovery state (#9915)\u201D; \u201Cfix(model-manager): harden install lifecycle retries\u201D; \u201Cfix(model-manager): harden recovery and cache invalidation\u201D; \u201Cfix(model-manager): preserve recovery data across failures\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/model_install/model_install_common.py\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":"invokeai/app/services/model_install/model_install_common.py"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"913e87ea26be4395a7a9dd9bf6ac2f3964e7b1eb5c8412a057b027d7abebfcc5"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/workflow/data/savedWorkflowQueries.ts: invokeai/frontend/webv2/src/features/workflow/data/savedWorkflowQueries.ts changed 5 times in last 90 days and 5 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is savedWorkflowQueries.getSavedWorkflowDetailQueryStatus at line 54), 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(webv2): refresh saved workflow picker after library changes\u201D; \u201Cfix(webv2): repair saved workflow regressions\u201D; \u201Cfix(webv2): harden saved workflow synchronization\u201D; \u201Cfix(webv2): repair saved workflow integration\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/data/savedWorkflowQueries.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/data/savedWorkflowQueries.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5fb89dee4d23825bb564d1f8194803d06fc02c3e6b01f6006b978cc6e01e1ea"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/app/invocations/ideal_size.py: invokeai/app/invocations/ideal_size.py changed 5 times in last 90 days and 5 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 IdealSizeInvocation.invoke at line 51), 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(architectures): pin the latent space per base, and bound guidance from the node\u201D; \u201Cfix(invocations): size Ideal Size from the declared canvas, not a squared width\u201D; \u201Cfix(architectures): close the review findings on the facet registry\u201D; \u201Cfix(architectures): resolve review findings in the architecture registry\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/invocations/ideal_size.py\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":"invokeai/app/invocations/ideal_size.py"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9e193605279a26e9de0d23a5ea685190efd93a5c12dffd55f4d26db4f747e5d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/app/services/videos/videos_base.py: invokeai/app/services/videos/videos_base.py changed 7 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 2 (its worst body is VideoServiceABC._on_changed at line 37), 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(intermediates): close review findings across queue privacy, deletion safety and UI\u201D; \u201Cfix(videos): pick gallery thumbnails from a scored seek ladder\u201D; \u201Cfix(media): centralize copy and deletion\u201D; \u201Cfix(images,videos): make the media copy routes safe and non-blocking\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/videos/videos_base.py\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":"invokeai/app/services/videos/videos_base.py"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"e303ee71bd7b9a45cac902d6c79f2c929dfdba702065a7adc393c413ad4bbdff"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/workbench/projects/openProjectBroker.ts: invokeai/frontend/webv2/src/workbench/projects/openProjectBroker.ts changed 7 times in last 90 days and 4 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 openProjectBroker.createOpenProjectBroker.sync at line 51), 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(canvas): scope the paint barrier to document writes and never wait on open edits\u201D; \u201Cfix(webv2): report the real outcome of a push and a create\u201D; \u201Cfix(webv2): remove the project-board dead ends left by the server owning boards\u201D; \u201Cfix(webv2): hold every project-file surface to the rules it already documents\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/projects/openProjectBroker.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/openProjectBroker.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"607d910c1d3a863bbd9418ea3533f3451a7e68df900a5bfba1477b6dd8daf922"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/backend/util/attention.py: invokeai/backend/util/attention.py changed 7 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 14 (its worst body is attention._chunked_sdpa at line 220), 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(rocm): make the offload, the budget lookup and the ROCm checks hold up\u201D; \u201Cfix(rocm): harden allocator default, paging warning and SDPA chunking\u201D; \u201Cfix(rocm): route wide-head attention to the math SDPA kernel\u201D; \u201Cfix(flux2): estimate working memory for denoise and both VAE directions (#9519)\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/util/attention.py\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":"invokeai/backend/util/attention.py"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"f43523f2a01e24850f00bf6eb3bf1e9cd84d84319ade655ba4afa478f948e10b"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/app/services/video_files/video_files_disk.py: invokeai/app/services/video_files/video_files_disk.py changed 7 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 12 (its worst body is DiskVideoFileStorage.save at line 65), 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(intermediates): close review findings across queue privacy, deletion safety and UI\u201D; \u201Cfix(intermediates): make cleanup durable and scope-safe\u201D; \u201Cfix(videos): pick gallery thumbnails from a scored seek ladder\u201D; \u201Cfix(images,videos): make the media copy routes safe and non-blocking\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/video_files/video_files_disk.py\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":"invokeai/app/services/video_files/video_files_disk.py"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"abf834d7c16e9ac5f3daec95a3fc13a39914383dde4c1de848e41c1a00c461eb"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/models/data/startersStore.ts: invokeai/frontend/webv2/src/features/models/data/startersStore.ts changed 7 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 5 (its worst body is startersStore.refreshStarters at line 35), 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(ui): unwrap backend error details in model manager notifications\u201D; \u201Cfix(ui): retry starter and install-queue loads after a failed first fetch\u201D; \u201Cfix(ui): rerun store refreshes requested mid-flight\u201D; \u201Cfix(identity): isolate account-lived state\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/models/data/startersStore.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/data/startersStore.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7b5336ee10fec1f60b678330c29a5d38492f39e796c5c49a73dc1d6050ed17c"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/generation/ui/usePromptTemplates.ts: invokeai/frontend/webv2/src/features/generation/ui/usePromptTemplates.ts changed 7 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 3 (its worst body is usePromptTemplates.isPromptTemplateMissing at line 99), 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(webv2): harden account-scoped prompt transfers\u201D; \u201Cfix: restore prompt template catalog search\u201D; \u201Cfix: respect prompt template ownership\u201D; \u201Cfix(webv2): gate the template catalog fetch, and say when one is gone\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/usePromptTemplates.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/usePromptTemplates.ts"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfc3df1e4353a3f682bc44de2957add9f9feb447140a3aeba13a42c7894444ed"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/backend/architectures/facets/features.py: invokeai/backend/architectures/facets/features.py changed 6 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 5 (its worst body is FeaturesFacet.__post_init__ at line 128), 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: floor guidance and CFG at 1 everywhere\u201D; \u201Cfix(architectures): backend owns VAE and scheduler policy; clear capability outage states\u201D; \u201Cfix(architectures): pin the latent space per base, and bound guidance from the node\u201D; \u201Cfix(architectures): close the review findings on the facet registry\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/architectures/facets/features.py\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":"invokeai/backend/architectures/facets/features.py"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b2ef940b738c811473ec8c5fe9b237be16f3e847167d435c6ad241b2b9de6e3"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/workbench/projects/covers.ts: invokeai/frontend/webv2/src/workbench/projects/covers.ts changed 6 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 9 (its worst body is covers.enqueuePersist at line 74), 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(webv2): close project file safety gaps\u201D; \u201Cfix(webv2): discard stale project cover writes\u201D; \u201Cfix(webv2): serialize project cover index writes\u201D; \u201Cfix(webv2): stop the project cover index from clobbering itself\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/projects/covers.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/covers.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0a94eac789e7341a061643cefb32d7fd8d57f43c77cb729d68dbd7526cd88ab"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/workbench/projects/invk/archive.ts: invokeai/frontend/webv2/src/workbench/projects/invk/archive.ts changed 6 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 8 (its worst body is archive.writeArchive at line 35), 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(webv2): report every unreadable archive the same way\u201D; \u201Cfix(webv2): close project file safety gaps\u201D; \u201Cfix(webv2): bound .invk archives at both allocation boundaries\u201D; \u201Cfix(webv2): bound .invk expansion before it happens, not after\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/projects/invk/archive.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/archive.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"41cbf3bcba9cf40de25d81050c9fb31b4babeab1627626a5d78e3ca1ba271a4c"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/app/util/video_encoding.py: invokeai/app/util/video_encoding.py changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 5 (its worst body is video_encoding.make_mp4_writer at line 45), 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(video): stop re-encoding the soundtrack kept by a trim\u201D; \u201Cfix(video): bound splice parsing, compare whole sample entries, cancel splices\u201D; \u201Cfix(video): stop re-encoding earlier segments when extending videos\u201D; \u201Cfix(video): adversarial-review findings for audio muxing\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/util/video_encoding.py\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":"invokeai/app/util/video_encoding.py"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"57773b8f81709603aef5ea10fd5c97b11959188c8378af8b64ed64150fe89238"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/backend/patches/lora_conversions/krea2_lora_conversion_utils.py: invokeai/backend/patches/lora_conversions/krea2_lora_conversion_utils.py changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 11 (its worst body is krea2_lora_conversion_utils._get_lora_layer_values at line 242), 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(krea2-lora): require complete LoKr modules, pin the factor mapping in tests\u201D; \u201Cfix(krea2-lora): validate kohya keys by un-flattening, not by prefix (#9518)\u201D; \u201Cfix(lora): support ai-toolkit DoRA magnitudes for Krea-2 LoRAs (#9517)\u201D; \u201Cfix(model-manager): apply Krea-2 LoRAs in kohya key layout (#9449)\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/patches/lora_conversions/krea2_lora_conversion_utils.py\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":"invokeai/backend/patches/lora_conversions/krea2_lora_conversion_utils.py"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"e09246f922f59945278a693d47604a24f647e25d253e88b76b182918b7876a2f"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/intermediates/core/selection.ts: invokeai/frontend/webv2/src/features/intermediates/core/selection.ts changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 7 (its worst body is selection.resolveScope at line 115), 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(intermediates): close review findings across queue privacy, deletion safety and UI\u201D; \u201Cfix(intermediates): protect active and undo media during cleanup\u201D; \u201Cfix(intermediates): preserve selection across pages and refreshes\u201D; \u201Cfix(intermediates): make cleanup durable and scope-safe\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/intermediates/core/selection.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/intermediates/core/selection.ts"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"fac3b133814158273623fbc7bc7906caf45fc8a1d0ec945e78395910801ac802"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/models/ui/add-models/useInstallActions.ts: invokeai/frontend/webv2/src/features/models/ui/add-models/useInstallActions.ts changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 5 (its worst body is useInstallActions.useInstallActions.install at line 24), 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(ui): unwrap backend error details in model manager notifications\u201D; \u201Cfix(ui): queue install-all silently with one summary toast\u201D; \u201Cfix(ui): translate remaining model manager strings\u201D; \u201Cfix(identity): isolate account-lived state\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/models/ui/add-models/useInstallActions.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/add-models/useInstallActions.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e6b7f253e1ea2520aefd9b3ffb22d40f9bca9a19cfe4e214b2a464ec2ea88e7"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/queue/data/progressImageStore.ts: invokeai/frontend/webv2/src/features/queue/data/progressImageStore.ts changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 3 (its worst body is progressImageStore.evictOldest at line 51), 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(queue): track progress through preparation and completion\u201D; \u201Cfix(preview): follow the slot\u0027s own frame, not the store-wide latest\u201D; \u201Cfix(preview): keep the last denoise frame through completion, reconnect and tab hiding\u201D; \u201Cfix(identity): isolate account-lived state\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/queue/data/progressImageStore.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/data/progressImageStore.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"f107aa11c421b0460a94fda8a0897c9069bdd55c4e0b1f846177a31183c47e65"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/generation/core/wildcardTransfer.ts: invokeai/frontend/webv2/src/features/generation/core/wildcardTransfer.ts changed 5 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 8 (its worst body is wildcardTransfer.getWildcardImportActions at line 180), 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(webv2): treat a wildcard comment the same in every format\u201D; \u201Cfix(webv2): make a wildcard round-trip an identity\u201D; \u201Cfix(webv2): correct wildcard import name resolution\u201D; \u201Cfix(webv2): stop wildcard export walking the prototype chain\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/core/wildcardTransfer.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/wildcardTransfer.ts"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7f0216e74516d19009e0f93a6b83e550be6e29a334f149333bcee9eeec4772a"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/app/util/mp4_metadata.py: invokeai/app/util/mp4_metadata.py changed 4 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 12 (its worst body is mp4_metadata.read_mp4_movie_duration at line 97), 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(video): guard whole-range copy with movie duration\u201D; \u201Cfix(video): keep whole-range copies to the video\u0027s duration\u201D; \u201Cfix(video): bound splice reads and walks, cancel audio decodes\u201D; \u201Cfix(video): stop re-encoding earlier segments when extending videos\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/util/mp4_metadata.py\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":"invokeai/app/util/mp4_metadata.py"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa66565a3986a61ad330addd3bfb25fd0660bd94bc4616263cd314473a23b633"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/backend/util/module_discovery.py: invokeai/backend/util/module_discovery.py changed 4 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 6 (its worst body is module_discovery._orphan_directories at line 27), 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(invocations): preserve legacy module imports\u201D; \u201Cfix(architectures): discover modules without importing excluded packages\u201D; \u201Cfix(architectures): close the review findings on the facet registry\u201D; \u201Cfix(architectures): resolve review findings in the architecture registry\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/util/module_discovery.py\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":"invokeai/backend/util/module_discovery.py"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ac260d882692f427543d80815f6f2acc4637971700b4213b8f3a6fb44879cc4"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/app/services/intermediates/intermediates_common.py: invokeai/app/services/intermediates/intermediates_common.py changed 5 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 1 (its worst body is IntermediatesKindCounts.total at line 98), 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(intermediates): close review findings across queue privacy, deletion safety and UI\u201D; \u201Cfix(intermediates): protect every saved reference and isolate force clears\u201D; \u201Cfix(intermediates): make cleanup durable and scope-safe\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/intermediates/intermediates_common.py\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":"invokeai/app/services/intermediates/intermediates_common.py"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0f38c4a013f8649421ad36067da2dfca1e39b32246e08d2a961d619bd2bcd64"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/intermediates/core/types.ts: invokeai/frontend/webv2/src/features/intermediates/core/types.ts changed 5 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 3 (its worst body is types.canRunOperationAgain at line 186), 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(intermediates): close review findings across queue privacy, deletion safety and UI\u201D; \u201Cfix(intermediates): stop cancelled starts from replaying and keep stale rows inert\u201D; \u201Cfix(intermediates): make cleanup durable and scope-safe\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/intermediates/core/types.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/intermediates/core/types.ts"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"a68c68efb07442ca812acda01fc94ccf19a08ef689d8b05f533c77b78b9ddef5"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/generation/ui/shared/GenerateFieldContextMenu.tsx: invokeai/frontend/webv2/src/features/generation/ui/shared/GenerateFieldContextMenu.tsx changed 5 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 GenerateFieldContextMenu.GenerateFieldContextMenu at line 19), 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(ui): animate the concept row menu out instead of unmounting it on close\u201D; \u201Cfix(ui): preserve concept edits and recover missing encoders\u201D; \u201Cfix(ui): keep one generate field context menu open at a time\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/shared/GenerateFieldContextMenu.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/shared/GenerateFieldContextMenu.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"a577abacde687fffb17ed711c1c94e8a4dd8644296a09ff4275b2c040340031d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/intermediates/ui/IntermediatesList.tsx: invokeai/frontend/webv2/src/features/intermediates/ui/IntermediatesList.tsx changed 5 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 5 (its worst body is IntermediatesList.getOwnerAccessibleLabel at line 28), 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(intermediates): close review findings across queue privacy, deletion safety and UI\u201D; \u201Cfix(intermediates): stop cancelled starts from replaying and keep stale rows inert\u201D; \u201Cfix(intermediates): protect active and undo media during cleanup\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/intermediates/ui/IntermediatesList.tsx\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":"invokeai/frontend/webv2/src/features/intermediates/ui/IntermediatesList.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba9d8d4651f297f44a8fb466118f45d72e8d62bf3f9e99275c7b9f7f5e31164d"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/nodes/ui/manager/ReloadNodesButton.tsx: invokeai/frontend/webv2/src/features/nodes/ui/manager/ReloadNodesButton.tsx changed 5 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 ReloadNodesButton.ReloadNodesButton at line 13), 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(ui): consolidate reload and refresh into one action\u201D; \u201Cfix(ui): honest reload status for custom nodes\u201D; \u201Cfix(identity): isolate account-lived state\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/nodes/ui/manager/ReloadNodesButton.tsx\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":"invokeai/frontend/webv2/src/features/nodes/ui/manager/ReloadNodesButton.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"78cc827f7b8b3d619ef21e63f941cc9264c070388d889d4a5d054cefb08c83e2"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/workflow/ui/editor/ConnectorFlowNode.tsx: invokeai/frontend/webv2/src/features/workflow/ui/editor/ConnectorFlowNode.tsx changed 5 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 2 (its worst body is ConnectorFlowNode.getConnectorHandleStyle at line 27), 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(workflow): export pristine workflow snapshots\u201D; \u201Cfix(workflows): localize snapshot metadata\u201D; \u201Cfix(workflows): include hover metadata in snapshot exports\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/workflow/ui/editor/ConnectorFlowNode.tsx\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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/ConnectorFlowNode.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bc70c43c03616eac42b9c6d5bc651e86d56c7c477ee29fdeac6a27c2b74bbc7"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/app/invocations/vae/qwen_image_latents_to_image.py: invokeai/app/invocations/vae/qwen_image_latents_to_image.py changed 5 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 5 (its worst body is QwenImageLatentsToImageInvocation.invoke at line 56), 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(vae): price up-front tiling from the measured peak and a stable ceiling\u201D; \u201Cfix(vae): tile on what the GPU keeps resident, not on reservation headroom\u201D; \u201Cfix(vae): budget diffusers FLUX.1 decodes and quiet up-front tiling\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/invocations/vae/qwen_image_latents_to_image.py\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":"invokeai/app/invocations/vae/qwen_image_latents_to_image.py"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"d52023eff3e65a79eb256ac0562abc87d8b27e2d397cfd0ce661af9788a62214"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/app/invocations/vae/anima_latents_to_image.py: invokeai/app/invocations/vae/anima_latents_to_image.py changed 5 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 9 (its worst body is AnimaLatentsToImageInvocation.invoke at line 81), 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(vae): keep Anima tiling and price the AutoencoderKL nodes per backend\u201D; \u201Cfix(architectures): backend owns VAE and scheduler policy; clear capability outage states\u201D; \u201Cfix(anima): refuse a foreign VAE instead of decoding it into noise\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/invocations/vae/anima_latents_to_image.py\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":"invokeai/app/invocations/vae/anima_latents_to_image.py"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"232f30ebab89d236236ec7d2309b2fa433af7a522bce0fe4d5eb9809e859b18b"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/models/ui/add-models/sourceClassifier.ts: invokeai/frontend/webv2/src/features/models/ui/add-models/sourceClassifier.ts changed 5 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 13 (its worst body is sourceClassifier.classifySource at line 44), 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(ui): stop classifying relative paths as HF repos\u201D; \u201Cfix(ui): translate provider load errors and source kind labels\u201D; \u201Cfix(ui): recognize .safetensors paths as files\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/models/ui/add-models/sourceClassifier.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/add-models/sourceClassifier.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"e58694a4a1bb2471a3d6d105fdb46bbfffb17b1f8d33d2d331171961333da2d9"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/backend/model_manager/load/model_loaders/comfyui_state_dict_utils.py: invokeai/backend/model_manager/load/model_loaders/comfyui_state_dict_utils.py changed 5 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 7 (its worst body is comfyui_state_dict_utils._dequantize_comfyui_fp8 at line 24), 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(loaders): refuse quantization payloads a plain scale fold cannot decode\u201D; \u201Cfix(loaders): refuse a rotated int8 layer where only the scale would be folded\u201D; \u201Cfix(quantization): fold per-output-channel scales down the rows, not across them\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/backend/model_manager/load/model_loaders/comfyui_state_dict_utils.py\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":"invokeai/backend/model_manager/load/model_loaders/comfyui_state_dict_utils.py"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"52002888ef182fe41ef3ee0ef95285dab40cbce04d08d0e7c930baa429693237"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_08_06_add_project_boards.py: invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_08_06_add_project_boards.py changed 5 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 migration_2026_08_06_add_project_boards._collect_board_candidates at line 347), 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(migrations): keep an unmigrated shared root openable\u201D; \u201Cfix(migrations): quarantine orphaned projects\u201D; \u201Cfix(projects): un-archive a board when a project claims it\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_08_06_add_project_boards.py\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":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_08_06_add_project_boards.py"},"region":{"startLine":347}}}],"partialFingerprints":{"codehealthFindingId/v1":"d285d09170d3ccdb5f03431478b969a2873238af13b993d63db8fd4493d4cae0"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/generation/core/promptTemplates.ts: invokeai/frontend/webv2/src/features/generation/core/promptTemplates.ts changed 5 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 7 (its worst body is promptTemplates.sanitizePromptTemplateSnapshot at line 88), 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: preserve prompt behavior during template flattening\u201D; \u201Cfix(webv2): store a template snapshot, not a catalog record\u201D; \u201Cfix(webv2): treat the prompt as literal when merging a template\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/core/promptTemplates.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/promptTemplates.ts"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"1516d8962a092eebe3e0fb9fdd53fef571ed534e5bd8620aaad669d2f2ac4e1f"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/generation/ui/promptFields/promptAttentionHotkeys.ts: invokeai/frontend/webv2/src/features/generation/ui/promptFields/promptAttentionHotkeys.ts 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 3 (its worst body is promptAttentionHotkeys.isPromptAttentionTarget at line 10), 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(ui): canvas filter and render size, recall shortcuts, prompt syntax, and hint popovers (#9881)\u201D; \u201Cfix(webv2): make prompt weight adjustments reliable\u201D; \u201Cfix(webv2): respect view mode in the prompt fields\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/promptFields/promptAttentionHotkeys.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/promptAttentionHotkeys.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d80271b8fca1cf2126a5d788530d4d2bf0040da3abc541d082a68a9e650a6b8"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/workbench/hotkeys/keys.ts: invokeai/frontend/webv2/src/workbench/hotkeys/keys.ts 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 11 (its worst body is keys.eventToHotkeyString at line 69), 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(ui): canvas filter and render size, recall shortcuts, prompt syntax, and hint popovers (#9881)\u201D; \u201Cfix(webv2): show the modifier keycap in command palette hints\u201D; \u201Cfix(workflow): make node value edits undoable\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/workbench/hotkeys/keys.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/hotkeys/keys.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"3117021cd20ab3908fef99978dc1494fcdbb213601797768aa5fc026bf47c50f"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/app/services/orphaned_models/orphaned_models_service.py: invokeai/app/services/orphaned_models/orphaned_models_service.py 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 12 (its worst body is OrphanedModelsService.find_orphaned_models at line 77), 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(model-manager): harden install lifecycle retries\u201D; \u201Cfix(model-manager): harden recovery and cache invalidation\u201D; \u201Cfix(api): stop synchronous route work from stalling the whole server (#9436)\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/orphaned_models/orphaned_models_service.py\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":"invokeai/app/services/orphaned_models/orphaned_models_service.py"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bcdb971d9729d3952d85d2fd19a38fc8320d5fd97436e034c06b06b96cd8faf"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/intermediates/data/api.ts: invokeai/frontend/webv2/src/features/intermediates/data/api.ts 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 11 (its worst body is api.isOperationDTO at line 309), 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(intermediates): close review findings across queue privacy, deletion safety and UI\u201D; \u201Cfix(intermediates): stop cancelled starts from replaying and keep stale rows inert\u201D; \u201Cfix(intermediates): make cleanup durable and scope-safe\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/intermediates/data/api.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/intermediates/data/api.ts"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"253a13a3b0b8947d630de11e49339da346f301867b20f7bd097b53e6ec13832f"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/intermediates/data/operationStore.ts: invokeai/frontend/webv2/src/features/intermediates/data/operationStore.ts 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 7 (its worst body is operationStore.reconcileIntermediatesOperations at line 65), 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(intermediates): close review findings across queue privacy, deletion safety and UI\u201D; \u201Cfix(intermediates): stop cancelled starts from replaying and keep stale rows inert\u201D; \u201Cfix(intermediates): make cleanup durable and scope-safe\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/intermediates/data/operationStore.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/intermediates/data/operationStore.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb12745314ac245f8386a4edbb4d63bb5e8c50edc60f39a90316e636b211a47c"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/app/services/intermediates/intermediates_base.py: invokeai/app/services/intermediates/intermediates_base.py 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 1 (its worst body is IntermediatesServiceBase.hold_cached_media at line 29), 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(intermediates): protect every saved reference and isolate force clears\u201D; \u201Cfix(intermediates): protect cached media during active sessions\u201D; \u201Cfix(intermediates): make cleanup durable and scope-safe\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/intermediates/intermediates_base.py\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":"invokeai/app/services/intermediates/intermediates_base.py"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"67d70dba3b636113491b78865f82acadd378379c2afc4b3050ec05421a7548f6"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/models/data/externalProvidersStore.ts: invokeai/frontend/webv2/src/features/models/data/externalProvidersStore.ts 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 6 (its worst body is externalProvidersStore.refreshExternalProviders at line 41), 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(ui): unwrap backend error details in model manager notifications\u201D; \u201Cfix(ui): rerun store refreshes requested mid-flight\u201D; \u201Cfix(ui): translate provider load errors and source kind labels\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/models/data/externalProvidersStore.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/data/externalProvidersStore.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"460184f827abe879e44a80bf8fdda64fc17a35ccffb7718469f304897ff3ca7c"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/nodes/data/api.ts: invokeai/frontend/webv2/src/features/nodes/data/api.ts 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 1 (its worst body is api.listCustomNodePacks at line 25), 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(ui): honest uninstall confirmations with workflow counts\u201D; \u201Cfix(ui): honest reload status for custom nodes\u201D; \u201Cfix(identity): isolate account-lived state\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/nodes/data/api.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/nodes/data/api.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"472192cb60628ead93aeb78a07ce7c308b2d577d241e0f3efe927b7c44acdde4"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/generation/data/promptTemplates.ts: invokeai/frontend/webv2/src/features/generation/data/promptTemplates.ts 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 3 (its worst body is promptTemplates.updatePromptTemplate at line 116), 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(webv2): harden account-scoped prompt transfers\u201D; \u201Cfix: make prompt template image updates lossless\u201D; \u201Cfix(webv2): store a template snapshot, not a catalog record\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/data/promptTemplates.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/data/promptTemplates.ts"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"33fe855a6018d14694fc52c2bbcdf6bf46104a6de20ac15a9051629710398387"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/app/services/shared/graph_runtime_records.py: invokeai/app/services/shared/graph_runtime_records.py 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 7 (its worst body is _PreparedExecRegistry.get_prepared_id_at_path at line 128), 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 graph execution edge cases (#9843)\u201D; \u201Cfix(execution): harden queue and workflow state recovery\u201D; \u201Cfix(execution): resolve CI scheduler regressions\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/app/services/shared/graph_runtime_records.py\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":"invokeai/app/services/shared/graph_runtime_records.py"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee812cf83ba5ac6725cd720d09dcb3752c8b044504552da7877ae785c7cc5aaf"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplateImage.tsx: invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplateImage.tsx 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 6 (its worst body is PromptTemplateImage.PromptTemplateImage at line 38), 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(webv2): harden account-scoped prompt transfers\u201D; \u201Cfix(webv2): keep template image URLs live\u201D; \u201Cfix(webv2): centralize image outlines\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-22..2026-10-20, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-22 04:45:43 -06:00\u0027 --until=\u00272026-10-20 04:45:43 -06:00\u0027 --full-history --no-merges -- invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplateImage.tsx\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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplateImage.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2954ff2f199ba8e71d25ea0b2fe0563b50aa1dbc43e3f2d5626b08131fe77ed"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 577 significant file(s) lose their only recent owner: invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts, invokeai/frontend/webv2/src/workbench/projects/draftStore.ts, invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts, invokeai/frontend/webv2/src/workbench/widgets/layers/LayersTree.tsx, invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx, invokeai/frontend/webv2/src/platform/ui/theme/recipes.ts, invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts, invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts (\u002B569 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"590f39ac61886c9c1acd957a4caf15ddccbefbe5c359c8e9e83f0811bf8e682c"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #2: If anonymized user #2 becomes unavailable, 103 significant file(s) lose their only recent owner: invokeai/backend/model_manager/load/model_loaders/z_image.py, invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py, invokeai/backend/quantization/fp8_scaled.py, invokeai/app/invocations/anima/anima_denoise.py, invokeai/app/invocations/krea2/krea2_denoise.py, invokeai/backend/anima/anima_transformer.py, invokeai/backend/quantization/int8_convrot.py, invokeai/app/invocations/wan/wan_denoise.py (\u002B95 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ad5487c95de805316a426726ec7e70e10daec8ffc96fc6dada779df1a22a86ee"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #3: If anonymized user #3 becomes unavailable, 79 significant file(s) lose their only recent owner: invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts, invokeai/frontend/webv2/src/features/video/core/graph.ts, invokeai/frontend/webv2/src/features/video/core/settings.ts, invokeai/backend/ltx2/denoise.py, invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts, invokeai/app/util/video_thumbnails.py, invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts, invokeai/app/services/image_index/projection.py (\u002B71 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7640858177ca3242ca373a0afdc20fa8ff4885ff60bf222464dfe9caf25dc388"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #4: If anonymized user #4 becomes unavailable, 61 significant file(s) lose their only recent owner: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts, invokeai/frontend/webv1/src/features/cropper/lib/editor.ts, invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts, invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts, invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts, invokeai/frontend/webv1/src/services/api/run-graph.ts, invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasManager.ts, invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElement.tsx (\u002B53 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7edbf52a4c23ba55536dfe6f5be3fa36b6fbe3d17a4ec82dab28e5030a68f519"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #5: If anonymized user #5 becomes unavailable, 23 significant file(s) lose their only recent owner: invokeai/app/services/shared/graph.py, invokeai/app/services/shared/execution_engine/child.py, invokeai/app/services/shared/graph_scheduler.py, invokeai/app/services/shared/execution_effects.py, invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts, invokeai/app/services/shared/graph_iterate_planner.py, invokeai/app/services/shared/graph_nested_iterate_planner.py, invokeai/app/services/shared/execution_engine/scheduler.py (\u002B15 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"484abc808c93139fedbe321bea8e665e872c8a20f78c203893ff6132a17258ed"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #6: If anonymized user #6 becomes unavailable, 14 significant file(s) lose their only recent owner: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts, invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasTextToolModule.ts, invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasGradientToolModule.ts, invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsExtractMaskedArea.tsx, invokeai/frontend/webv1/src/features/ui/layouts/canvasToolModifierHints.ts, invokeai/backend/stable_diffusion/hidiffusion_utils.py, invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGridPaged.tsx, invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectGradient.ts (\u002B6 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"bac2b4d81138a9fe60f4b62d5b77aada7072bc8cf52735fe66fd2d126082abe1"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #7: If anonymized user #7 becomes unavailable, 9 significant file(s) lose their only recent owner: invokeai/backend/flux/extensions/regional_prompting_extension.py, invokeai/backend/flux/controlnet/state_dict_utils.py, invokeai/backend/stable_diffusion/multi_diffusion_pipeline.py, invokeai/backend/flux/extensions/instantx_controlnet_extension.py, invokeai/backend/flux/controlnet/instantx_controlnet_flux.py, invokeai/backend/flux/controlnet/xlabs_controlnet_flux.py, invokeai/backend/flux/custom_block_processor.py, invokeai/backend/flux/extensions/xlabs_controlnet_extension.py (\u002B1 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"51c58d91b3d90531741671020adb1d3252844c7ce7b51aacb0c49bc595cbff0a"}},{"ruleId":"D16","level":"note","message":{"text":"Further sole-owners (lower concentration): 3 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 (870 single-owned of 2366 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; 2366 of the 4522 production source files in this repository met that bar). They are anonymized user #8 (2 file(s)), anonymized user #9 (1 file(s)), anonymized user #10 (1 file(s)) \u2014 spread or document their files in the same way, at lower priority than the named off-boarding risks above. The files folded here: invokeai/backend/stable_diffusion/diffusion_backend.py, invokeai/backend/stable_diffusion/denoise_context.py, invokeai/app/services/external_generation/providers/openai.py, invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsBooleanSubMenu.tsx."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6eac528f2429e724e1a97ed868f79eefbcf1888dab4af9a9e673429369bb5b2f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: create this all in a method so configuration/etc. can be passed in? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api_app.py"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"370bbe5aaf3a317c91c420730466be41cff0d29e109d14971836742e81f7ac42"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: consider doing this in services to support different configurations \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api_app.py"},"region":{"startLine":765}}}],"partialFingerprints":{"codehealthFindingId/v1":"09ef50ce54c497f684298591b00936cb27d0a884e0444cfba6d04528be602b4a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): Due to pydantic\u0027s handling of None values, it is possible for the graph to fail validation, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/extract_metadata.py"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"42da869d9cccf973f335a73382eeac43363681acbaa210e9bde895c123d063ba"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: is there a better way to achieve this? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/dependencies.py"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"824c58e75444c8a43689ff3fd4c524d40f669b7cc8433b7121235467e61b3f02"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(MM2): Core models should be handled by the model manager so we can determine if they are installed \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/model_manager.py"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"d160eaa65bdab7567b158d581d6e1e2847db6bb64450baf8a8925521c5ce34b1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Implement token invalidation when server-side session management is added \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/auth.py"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4a463aea3d6118adc467bad1d8fbe2b65bd9341ed7b537496b643527c99bbf7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Populate this from disk? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/upscale.py"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"de10a972ffc4af3b304fa1a977bfbf1332516368b4f6f3cd5a321bb8a235e98d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Use model manager to load? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/upscale.py"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"93cc0a7032a148c74d810859926c03d410e3656f6969305a9e01c4e9763cb65d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: This strips the alpha... is that okay? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/upscale.py"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"a62e9450a007523a6f11c5d73f83eb60202c93e852cf9205037d44b6c58ad51e"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK: The width and height fields are \u0027meta\u0027 fields that can easily be calculated from the other fields on this \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/tiles.py"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"2afac4792477d504c33bb871244849565b6b0cef7bad44bea08dd66efee9f422"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): The only reason that PairTileImage is needed is because the iterate/collect nodes don\u0027t preserve \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/tiles.py"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"e17f8016a139267f8a58cf849302b8a19a9e42c916e473d7707316d641df0318"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): It pains me that we spend time PNG decoding each tile from disk when they almost certainly \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/tiles.py"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"fea13d3e7cdf527177e03a74d36520215a32b1b6a9952fa0b5ef908b790c3c72"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Setting the torch_dtype here doesn\u0027t work. Investigate whether fp16 is supported by the \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/segment_anything.py"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"f200d210655dee33f2b1702bc42db5b1c687c9ed45bb5ee6f971eb6c4e8f2902"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Setting the torch_dtype here doesn\u0027t work. Investigate whether fp16 is supported by the \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/grounding_dino.py"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"53eb303c677900357ab2cd8d6d8df67acca66fe24bda589a0a6d9b25b4e4d755"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: precision? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/model.py"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"a73c33f6f3cd92b0f03728ce37ba3b813bc2acac21286ed1aa9b5f8dd8d21fb0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: precision? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/sdxl.py"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c5b767064c2880a559685a0bfad7e3addeae759b4918893b4393649748e5254"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: precision? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/sdxl.py"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c30fcd8bde2937760ea5a1f6c60d6ef7b5405c8423b3c4c7c93f5aeadb3b3c9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: not found exceptions \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/model.py"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"45a8efd2dbd22ea5ab604ea9601b5ddf810b0630ffd75fce25374231305ad9c3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: not found exceptions \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/sdxl.py"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cb8afd667e27cc6bcf202961d825eb808a4e89801d78ea717a4fc1dc89e32aa"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: not found exceptions \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/sdxl.py"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"792a1197231df0be5742ff770434159612d201205ab204ee648a638d5f0cd2b8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: should this be stricter or do we just let the UI handle it? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/metadata.py"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a46f8728ca164ad1c522e24a33965b652ef1fbe01d236cdeb2e0a97613b805b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: add mosaic back \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/infill.py"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8f5e6fc8811d5d1a375a47300653040e1ef8072297de132b60f2ff43fb143c4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: add mosaic back \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/infill.py"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"b29e08a19f8e69f77735969fc2c249069ca165f65feb26670421a1e93015f8af"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: how to handle failure? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/image.py"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"4085c221578f8af65536381d4594ec6699b4ffbb52dea93627076178cc0e26be"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: probably shouldn\u0027t invert mask here... should user be required to do it? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/image.py"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"91d9c8c2b54b80f9ca53b61c6924a70730c04669b7a94725128b5c163a57222c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): I copied this \u0022.\u0022-handling logic from the transformers example code. Test it and see if it \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/grounding_dino.py"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"8578e9e30ab0a1634bdef83467789af25d818029c2b0e543731689e6540299fa"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Can we support default_factory? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/fields.py"},"region":{"startLine":918}}}],"partialFingerprints":{"codehealthFindingId/v1":"c54ba618516349a9c00c10b7626212d6c50ec1c3d653e45d4c74192bf27d26a6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: consider making these utility functions \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/cv.py"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff85bbd729bb3e03965f68128bad563e41ad8676f6f3117eb567fdd0dff5368c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: consider making a utility function \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/cv.py"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"87af80231ded09f5bb3e149725a5b42591c3a48b7b297e1a804142011cd6268f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Named \u0060CropLatentsCoreInvocation\u0060 to prevent a conflict with custom node \u0060CropLatentsInvocation\u0060. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/crop_latents.py"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"91f132e8f2caac8e49d4ff9d3f60ef51f6bae4efb487efa9ca663a72310a0133"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Currently blending only the lightness channel, not really ideal. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/composition-nodes.py"},"region":{"startLine":875}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ce4f32ef1391969ddf2bdc4886755f7015d5cbbfd01d0dd1f58e9b7cd0e6341"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): We do not record the node pack of the output, so we cannot log it here \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/baseinvocation.py"},"region":{"startLine":491}}}],"partialFingerprints":{"codehealthFindingId/v1":"521ebf4dabcf86d2f9c3dd2537162edb3f79443a09bc142d613df67ad825f3b3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: ensure unique? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/baseinvocation.py"},"region":{"startLine":749}}}],"partialFingerprints":{"codehealthFindingId/v1":"68fe33eb01a5a0c0a54cefcbacd142e2600e3602c99fa2283e359760d6596373"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: ensure unique? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/baseinvocation.py"},"region":{"startLine":882}}}],"partialFingerprints":{"codehealthFindingId/v1":"f42bcba327f577de346dbe0b1e3e470aea534c30364df53a068b55fca92d261e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): If \u0060invoke()\u0060 is not defined, \u0060return_annotation\u0060 ends up as the string \u0022BaseInvocationOutput\u0022 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/baseinvocation.py"},"region":{"startLine":842}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7822cfe85cf90cb6ab233dff624494c49cb20583806c553e1d1e0f4a243aaf5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Make CFG optional. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/cogview4/cogview4_denoise.py"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"402cb449b1b127d693edfd4093ba58235c6c59913ab68a7da05478987915d546"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Make CFG optional. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd3/sd3_denoise.py"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5917a44e398faae23922bd7b3257dfe33d59e2fad1d35f0e4d8ee49377d6f8f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): We could expose these as params (like with SDXL). But, we should experiment to see if they are \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/cogview4/cogview4_denoise.py"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9d541bf90f8c4ca8e4050b3c2309ee3264c5a0c8c3628db13bca5f36f729417"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Support both sequential and batched CFG inference. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/cogview4/cogview4_denoise.py"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8edbb0c3157e2c0186afaa2bbaf01d8dacd8b791531b2440618315c532f93bf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Support both sequential and batched CFG inference. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd3/sd3_denoise.py"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"63da7c010474530ce1930601efc60262173b71b2a5255a6b359fdfd142ee0c02"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Is casting to float32 necessary for precision/stability? I copied this from SD3. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/cogview4/cogview4_denoise.py"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"370944e75f8179686a23493d5887569d31eeedc1748415b015cd01c76fd4af7a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): Can the probe reliably determine the type of the model? Just hardcoding it bc I don\u0027t want to experiment now \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux/flux_redux.py"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"73ed23db6c9d9d762dc83abb8f9ea0fb73a1486b444983e143fffd26b4302fc5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): We should really do this in a separate invocation to benefit from caching. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux/flux_denoise.py"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"16e4c1030a99f19915ce5b03331aa4c78e8be85a6520b292a0a8b14fcc364074"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Add a field to the model config so that we can distinguish between XLabs and InstantX ControlNets \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux/flux_denoise.py"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea12b5f16f541451195a41b88012cc039e03a4771ea9835b4fc6335bf85de7b1"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): We have to load the ControlNet model to determine whether the VAE needs to be run. We really \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux/flux_denoise.py"},"region":{"startLine":768}}}],"partialFingerprints":{"codehealthFindingId/v1":"bea6c0f09b2d293a330b8c968a71033219dffad26212e4207db6a67a243c344e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): We should probable rename controlnet_vae. It\u0027s used for more than just ControlNets. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux/flux_denoise.py"},"region":{"startLine":872}}}],"partialFingerprints":{"codehealthFindingId/v1":"29171fa154c57589793f96cff30ebd08693c96a12d2d5ff6fad608862ba68e47"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Get rid of this FakeVae hack. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/tiled_multi_diffusion_denoise_latents.py"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"05bb1e3f49fefa0c9dfdaad9c564b56202abf2c4530f9533bf952700c5804ca0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): In the future, we may want to revisit the tile overlap strategy. Things to consider: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/tiled_multi_diffusion_denoise_latents.py"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6d41c3f6f2225698402dce3f41d60ef98fc24f3f2d4597c27b4f67c6b115eab"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): I copied this from DenoiseLatentsInvocation. I\u0027m not sure if it\u0027s actually important. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/tiled_multi_diffusion_denoise_latents.py"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b97a874e367daa378a25fda2a93195353bdabec2ec8718dcd3151462bc8d37d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Silently falling back to ddim seems like a bad idea. Look into why this was added and remove if \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/denoise_latents.py"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"6803d60fff053295ec6441f628f1b8cae5b26ee1c849205dc120267aafabb346"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: # FIXME \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/denoise_latents.py"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"19e3ea6729ea3c0c0b2631074c09d75d6516fa2680b962673f5819438357e9d4"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: # FIXME \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/denoise_latents.py"},"region":{"startLine":1115}}}],"partialFingerprints":{"codehealthFindingId/v1":"a69b83f16e64d12116b44e2a4934f8ef322a3b1e6a7ce501e08a2b0d67444482"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # hack copied over from generate.py \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/denoise_latents.py"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c1e0f4183724f52d3613938cd2944abba4896bc7c9fba89e3b30507ad1e56e2"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): The fact that we have to choose a single pooled_embedding and add_time_ids here is a \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/denoise_latents.py"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d9faf6de60e20831aa73f2571991e5dde62caa5fd385859c6fc11e353d09577"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: oh... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/denoise_latents.py"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"87bf3ede5d1999f4058e8328971d6065fba1ab905c265e0fe5ccf0d1a6690ff0"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: # FIXME: still need to test with different widths, heights, devices, dtypes \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/denoise_latents.py"},"region":{"startLine":491}}}],"partialFingerprints":{"codehealthFindingId/v1":"7427b11744e4f54955aa14bd7ce593883cf0d12607c798620fbc6e699e8119a7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: research more for second order schedulers timesteps \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/denoise_latents.py"},"region":{"startLine":775}}}],"partialFingerprints":{"codehealthFindingId/v1":"a521f22bbd534e1d25807190762aaca46869b6ea6b78098c26fcb0292de87254"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: old backend, remove \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/denoise_latents.py"},"region":{"startLine":920}}}],"partialFingerprints":{"codehealthFindingId/v1":"95c9232bcb22755d0d519ed210f022610ab746f2e9898150b4d2c75cc2f0065d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: old backend, remove \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusion/conditioning_data.py"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"edbb51dac04b95edde92629202553e30a3d16148a3a938fa6083e95a457de247"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: old backend, remove \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusion/conditioning_data.py"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"518313b60a6386eae9d31150da557f28dedb38857e8f8947971859afb636477d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): I have hard-coded \u0060do_classifier_free_guidance=True\u0060 to mirror the behaviour of ControlNets, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/denoise_latents.py"},"region":{"startLine":1073}}}],"partialFingerprints":{"codehealthFindingId/v1":"02c20bba8671f4fa4ca460ab4b007cc1e6f701b3dbd88c19c511e67b6810d678"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/create_denoise_mask.py"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"08423cde164807a5a43eda9ab3609e3aa4e6eedfef0a2c83c03a6384936578d7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/compel.py"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb0a5c11c25c428cf808f39e5055f4a5cbfd2533dfb50d456e938994b40609f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/textual_inversion.py"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"539d7c64bd24ae4e2b8240fd5589a3972c494a7612ba82b57a99ca3a5fa6ebcf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: clip skip \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/compel.py"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"c65c8dde1ae6aecfa496ad0fa7439c3c5c8dbb516aa2b3cd2a4e5785a9707bb9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: better logging for and syntax \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/compel.py"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3e04eae0b844b552da08b4ca81ee8b8686a4db1b58e38b5a41c2bd5209fe4fc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: ask for optimizations? to not run text_encoder twice \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/compel.py"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e356e1ca8328cf1c8ca45a49c7a3c936a964d618307bf511d836e2c59f9464b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: ? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/compel.py"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"db16061fb5e6e0342d77ed264e8cd4f7b0a773963c1e0e21165f0d4673d33364"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: if there will appear lora for refiner - write proper prefix \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/compel.py"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"0039a80b61acae86dfdb355b6eaba60108188aa10940f857c4a671adee85bfe8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Add model inputs to the invocation rather than hard-coding. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/cogview4_text_encoder.py"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"fab74e932a8b5ab00024b91842d6377bcee1aeb4971a5bc2876c403fa9a965f4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Use seed to make sampling reproducible. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/sd3_image_to_latents.py"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba80e2871a7340e403205ab3065768f61b6d3f686b893681ebdf99038f5e2df5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Use seed to make sampling reproducible. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/cogview4_image_to_latents.py"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"c555b6f8a2951f670721a5d6b22151f66edd769c08b8001bd74f76284891e9ca"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: # FIXME: uses torch.randn. make reproducible! \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/image_to_latents.py"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"12ee2f7b4c58fb9e7d1036a8b761f9492d6584186fdbc80e0f00c1660a0c6781"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: # FIXME: uses torch.randn. make reproducible! \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/generate_vae_linear_approximation.py"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8e69fead5392dcdcc1dac5422d920af7eb090620b1728a8eae30f40bde61b88"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Expose seed parameter at the invocation level. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/flux_vae_encode.py"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fa4aa9359650925a5fe751b6199aa4c1e87d023311c57659ddad5fab703d671"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Write a util function for generating random tensors that is consistent across devices / dtypes. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/flux_vae_encode.py"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c9d5f4e1f8bfbcbe5cb5cbd6245cdedc2b1df2793a634068e6cc1a5bcb8286d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): This is effectively a copy of SD3LatentsToImageInvocation and a subset of LatentsToImageInvocation. We \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/cogview4_latents_to_image.py"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a9fb9f8ddda42deaf3032378b53c5d9c2199aaa0d8969f56c8add2ad982bc02"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): This is effectively a copy of SD3ImageToLatentsInvocation and a subset of ImageToLatentsInvocation. We \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/cogview4_image_to_latents.py"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"c755e9e9931e9d2509b6c8af6cf64e7f83403f6cd5c649167b915b589ca3ca43"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): pydantic-settings supports YAML settings sources. If we can figure out a way to integrate the YAML \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/config/config_default.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"830ddf8f2f3b838c6662ae6fd9a55f072740a4879c4b10b6e270d8013fa7b141"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: get this from config \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_files/image_files_disk.py"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"8233e388b32167d30a9dae9a10354c8d05d40df32ef840b592d9f930b058af11"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: this should refresh position for LRU cache \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_files/image_files_disk.py"},"region":{"startLine":773}}}],"partialFingerprints":{"codehealthFindingId/v1":"de30353eb5373f4a414f7aeba1d5fda4478657514d0cc95f8aeeb6a81a153629"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Should these excpetions subclass existing python exceptions? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_files/image_files_common.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"02a2ccee4bdf4ab6ce002192238bf6c95076f2a40fcb29a290fb6f57bbd8b181"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Should these excpetions subclass existing python exceptions? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_records/image_records_common.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"291823d545c9b8be0c6e381fc796e07e728591deea573cca06629b91d34853dd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: We need to validate paths before starlette makes the FileResponse, else we get a \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_files/image_files_base.py"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"59d8f138875f5d3e22c16bdf03f4b00538945f1a3543a80477bbbf6e61455a65"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: do we really need to handle default values here? ideally the data is the correct shape... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_records/image_records_common.py"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5f7caab091ff3e13cc1aadc5738b6c49c81688fc4206ac5aff5ff6d9793f0df"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Implement an \u0060update()\u0060 method \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_records/image_records_base.py"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"939fae0fa84c7f53c74419fc94a7a0a39eb3983c39be4b9f694c3821a4ffa2b6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: The database has a nullable \u0060deleted_at\u0060 column, currently unused. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_records/image_records_base.py"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"23f8ce1f28b8a27d97335ad7969e834503dfc23cd92a911db66d14f6a0950c65"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Consider using a transaction here to ensure consistency between storage and database \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/images/images_default.py"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"81c37d30d85900a0db3a9260ff58204c3127a6ef2ae23c9bbcbff60595266cfb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Should these exceptions subclass existing python exceptions? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/model_images/model_images_common.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1811a59f0fe08723d4af3427212b8e76309e57b834bcdf7e8e913e126c4e3aa"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Replace this with a proper fix for underlying problem of Windows holding open \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":879}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0c57e11b6b3313a7f87cdac973073234d188fe0882cc607a353e0b23e5845a8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): Mock this method on the invoker in the tests \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/model_load/model_load_default.py"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"009e535889eec9d46c5425d64d6ceb26adb7f68080d6863a88d8f83b6f8dd1de"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(MM2): Should we expose these? Feels footgun-y... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/model_records/model_records_base.py"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"38e902e6e8da57a69380fe165ec6b5d75db2838c3cbe397da2915d9de6592af7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Add customizable naming schemes \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/names/names_default.py"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ae1da682125e17ffda3ee03c623eed6ea0637160c1a1626f4e565cd275c027b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Add customizable naming schemes \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/names/names_base.py"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb5e2e7973ad83df05e0b437971bbd2baf7710922f1214b35006c8b0e335cbaf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): Update BatchDatum to have a \u0060type\u0060 field to specify the type of the items, then we can have strict float and int fields \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/session_queue/session_queue_common.py"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb225f04154f0ff2582e875d7ee91638551f8ed7a6c8a32b57e49d042b3bebbb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Should this be a class method on Batch? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/session_queue/session_queue_common.py"},"region":{"startLine":680}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fd0f55b9ceea7bc7ab59e17edb8fa51d4b951b973d6daf549c19b3da062e690"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Should this be a class method on Batch? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/session_queue/session_queue_common.py"},"region":{"startLine":790}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb2f579868a2fbda7009427ad4716a563d3f5147dcc2a78594dc9bcfb54333f4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): Is the a more efficient way to do this? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/session_queue/session_queue_common.py"},"region":{"startLine":754}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9ece595abf5dbfa9b6ff8c359fbf78c7f32ca9552bbbd479ab7fd7d716ada3c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): This is awkward - if field_info is None, it means the field is not defined in the output, which \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"776d6eca6b6bd2febfafe5a0cab6737989548edb2cdda109b95e20b73bed665b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): This is awkward - if field_info is None, it means the field is not defined in the output, which \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"5596d254af33b5aac5d7f3d039a67730f1e5ef7eb679d1ba42571f6f21c3b47d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: handle iterators and collectors \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"980a627729ba13d80c72bc3229e9e423a0af32b5798181b2f419811bc0af4f5e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Fill this out and move to invocations \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"711bb37e47e22309bd8b9dd4fbcc575e77404437e4a8033ed7a1eb6569937ada"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: use a list (and never use dict in a BaseModel) because pydantic/fastapi hates me \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":600}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba1fa83b8d5028892d83c235248be9239ef7e8a00ef4d2a9ac56a5ef62bb5bdd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: may need to validate all iterators \u0026 collectors in subgraphs so edge connections in parent graphs will be available \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":946}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a640fb9195d6cadc6067fc6e4997174ef10c000503b6458d51a37a4f124d72c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Cache this? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":1897}}}],"partialFingerprints":{"codehealthFindingId/v1":"d177339be3616fd9aee5f107dbc3b758ddd732be92c738877f1ea591012f7ddc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Store a reference to the graph instead of the actual graph? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":318}}}],"partialFingerprints":{"codehealthFindingId/v1":"eadc74933dbe0bcd73e52e72be0b6d0b0da2f22765a4f651bf2d3be96b9c57c3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: enable multiple nodes to execute simultaneously by tracking currently executing nodes \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":3966}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e18381160a8faa5f4fa9793fe401cad228f092798dd3c1ba8524e3753279a9b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): nodes, edges and form are very loosely typed - they are strictly modeled and checked on the frontend. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/workflow_records/workflow_records_common.py"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"2be9001eb2b8a55aa85a955ebdbd89f44988d2d4f34ce6a6a5b34fea4be6bba5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): We have a crapload of workflows that have no form, bc it was added after we introduced workflows. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/workflow_records/workflow_records_common.py"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6e0d0cdfa0a53645bcde17200ec079600783b1c94c576d125b361172011f915"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: # FIXME: not using yet, if used in the future will most likely require modification of preprocessors \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/controlnet_utils.py"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e7d6520c881232b52b6156908141366d33f9de0ae1c52bbb5f314fee8493de3"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK: If TI token expansion causes us to exceed the max text encoder input length, we silently discard \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/textual_inversion.py"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccdb47d10ac04a6b179c7f813758cfded0601318a9020d6f7b501cbbfde0eb0f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): spandrel.ImageModelDescriptor.to(...) does not support non_blocking. We will have to access the \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/spandrel_image_to_image_model.py"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"adee04e357fe62870df7b23e38bf65238e7e43d18cb04862dd45eeb90b4e4734"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): Fix this issue with circular imports. \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/spandrel_image_to_image_model.py"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d9374e7b5e4a7894bc9e73f1fc5a3cda0c599d1d09c3a0bcd92347ced2ed35b"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): Fix this issue with circular imports. \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/ip_adapter/ip_adapter.py"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9ea9cb4f7096d1e0d52a9e55bf7afe63ec990f462f5f955eda4e1fd2ee4a16b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: This is required since Transformers 4.32 see \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_patcher.py"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4e6c1718cb52ca68f6e3720ce1a0a6f81455af462cc5eef104adc9368c96023"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK: The CLIPTokenizer API does not include a way to remove tokens after calling add_tokens(...). As a \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_patcher.py"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c39d48d0d35a96158c695668b53da03e7eaaa2d71e3c1bfc894bc6c5782ba9a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Tune the max number of images that are useful for the model. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/llava_onevision_pipeline.py"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"583dfec6b2581cd72a4644deb2da41d8b429c6816c167d26550d73bef78e0d89"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Double check dim=0 is correct. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/controlnet/state_dict_utils.py"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6adc3bc6c6e2c581c173d86dfed02d287be65d2c72e58f9ef19b0d4c1235926"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: summing residuals materializes tensors that may otherwise share references, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/controlnet/controlnet_flux_output.py"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"c56aeb71ce0477c9de7b836eb22676ccd23d586d727aae1623f4eb16d3d3eaf4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Pass in these params if a new base transformer / XLabs ControlNet pair get released. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/extensions/xlabs_controlnet_extension.py"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"816d2342f776f217729064809ff8c6e66143976c25c9f1b6f3ea55bb74161444"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): We could restrict txt-txt attention across multiple global prompts, but this would \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/extensions/regional_prompting_extension.py"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f043885b94f8acfb87a40e0448664938181b43adf7f721f5a817f17d3ec6a52"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Should we define an enum for the instantx_control_mode? Is it likely to change for future models? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/extensions/instantx_controlnet_extension.py"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac82bcacf8847c555b5c97edc5eebcde71c6db258b95677a67032568f6f28e75"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Pass in these params if a new base transformer / InstantX ControlNet pair get released. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/extensions/instantx_controlnet_extension.py"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"586af53889dcf398840f78bd23e268afbe1fb3fbc16e887c005d8f468ecbe1a9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # 7. Prepare extra step kwargs. TODO: Logic should ideally just be moved out of the pipeline \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/hidiffusion/hidiffusion.py"},"region":{"startLine":646}}}],"partialFingerprints":{"codehealthFindingId/v1":"734acdd20d3af034915a00743a08d7b00c892a5febe5fd19875a2ebb5c2a6bb2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: this requires sync between CPU and GPU. So try to pass timesteps as tensors if you can \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/hidiffusion/hidiffusion.py"},"region":{"startLine":1031}}}],"partialFingerprints":{"codehealthFindingId/v1":"395bf593283726b1766910ace5c53f52978f336a2b35d7cfa6d3981acaaf9e4f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: this requires sync between CPU and GPU. So try to pass timesteps as tensors if you can \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/hotfixes.py"},"region":{"startLine":647}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7edec26bd7da8116262f48a96791b442ce5d42f9dbf016bc7ed28c474227bec"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # Hack, avoid non-square problem. See unet_2d_condition.py in diffusers \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/hidiffusion/hidiffusion.py"},"region":{"startLine":2110}}}],"partialFingerprints":{"codehealthFindingId/v1":"21eb28d46e4ebde41cfefa34eab876a5350f048cb61e8dfc17145e5f21efff15"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Improve blend modes \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/composition.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a00223ec1366b5b22e8c99b6457aae11c9b7be9f64bffaca2804ab3a6f3d543"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Add nodes like Hue Adjust for Saturation/Contrast/etc... ? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/composition.py"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a65241b0ae01ba24fa96acfd805a2188f59497927d83d187418afc483346690"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Continue implementing more blend modes/color spaces(?) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/composition.py"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"dae14c64db36101240efee2b56dd377ed5434e7451bbcb6a3d4dedc396a01654"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Custom ICC profiles with PIL.ImageCms? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/composition.py"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bc1cfe875479bb394f728706fa9701853e03fd737a33366051603784e2a8f16"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Blend multiple layers all crammed into a tensor(?) or list \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/composition.py"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"4580b78d6fe96d5af5618016e06b05bc6c5ba1249516ab6871784378bff2effa"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): The GroundingDinoPipeline does not work on MPS devices. We only allow it to be moved to CPU or \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/grounding_dino/grounding_dino_pipeline.py"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f2d256d4cd18154f24cd49c52d13cf477e03b9f3eec82605dce65e4b7fc7f8f"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): Fix the circular import issue. \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/grounding_dino/grounding_dino_pipeline.py"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"058ba8d76be69c6ceb63811424aa3c4f727f14f72240a5ee477344eab0bc54bc"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): Fix the circular import issue. \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/segment_anything/segment_anything_pipeline.py"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d55cfe5d80eb80426ec1fb3e074a83c54eac5e90b12eaa73ae0a0b19e694f6b"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): The SAM pipeline does not work on MPS devices. We only allow it to be moved to CPU or CUDA. \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/segment_anything/segment_anything_pipeline.py"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0bf0226c4116799a60296c66f6d0f8b79bf4af07bfec1c9876418fbe532f4f7"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK: The SAM2 pipeline may not work on MPS devices. We only allow it to be moved to CPU or CUDA. \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/segment_anything/segment_anything_2_pipeline.py"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"67202c675085b7425fa60f21184aa8d965a90a2f13f8f2d078fb2dc7ad202d6e"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK: Fix the circular import issue. \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/segment_anything/segment_anything_2_pipeline.py"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"0755e76fb342ca473c4bb14dfb6efac6b6d0b6e68f4f83c48a87ebf2b797c8b6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): Figure out how to positively identify SD1 here, and raise if we can\u0027t. Until then, YOLO. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/vae.py"},"region":{"startLine":584}}}],"partialFingerprints":{"codehealthFindingId/v1":"017492fe4da9732ed3491932ec603c4fc4163012493e5dce323388e6d894b954"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): Should we have a graceful fallback here? Previously we fell back to the \u0022normal\u0022 variant, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":539}}}],"partialFingerprints":{"codehealthFindingId/v1":"425119a4798c99cef8544df62dccc9c67acaa1c00dd34519d08f5f1810af538d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): Should we have a graceful fallback here? Previously we fell back to the \u0022normal\u0022 variant, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":612}}}],"partialFingerprints":{"codehealthFindingId/v1":"60e502025f480a0afe33c0b395a06abedbccf5bba89fbca64a85c36038dc24fc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): Should we have a graceful fallback here? Previously we fell back to the \u0022normal\u0022 variant, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":736}}}],"partialFingerprints":{"codehealthFindingId/v1":"54b4d7334f1b5fc744d47b3037505c66bacedb8ce7dd3f54631015addf8ea71c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): Should we have a graceful fallback here? Previously we fell back to the \u0022normal\u0022 variant, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":789}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4a2cd6960a6fcf27959d9f1869eae20cd73ad947055161d096267813e898674"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): Do we actually support LCM models? I don\u0027t see using this class anywhere in the codebase. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":1060}}}],"partialFingerprints":{"codehealthFindingId/v1":"37d8d3ee736f6a402e1097c03bc9e7dad392e6f13fccabe294d4c4dbeb84048d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): Is epsilon the right default or should we raise if it\u0027s not present? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/main.py"},"region":{"startLine":1111}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b1830a8c098d491b1d6f342d14976fdfcb6dea74f48733cc1acb886e4c3940a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): Moving this import to the function to avoid circular imports. Refactor later. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/lora.py"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cff9da7640991eef88a73c0b48a79cc4352af186c5fd23e49a128605483f67c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): Needs base handling. For FLUX, the Diffusers format does not indicate a folder model; it indicates \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/lora.py"},"region":{"startLine":1459}}}],"partialFingerprints":{"codehealthFindingId/v1":"36398c3179de7027b33ee1e62b972e841b51cbee71f133937e82ba7a5ea79eeb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Should we deprecate this field? From what I can tell, it hasn\u0027t been probed correctly for a long \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/ip_adapter.py"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"151d2b72496881d19c5cf279a15c1c66db30d92fc9d6842d5d149da66d7df351"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): This is very fragile. XLabs FLUX ControlNet models also contain keys starting with \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/controlnet.py"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"d940a4e5575c2c9d71af3ea5026fb5c65abc391affabf47a369da002bc9c4de1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Should I distinguish between XLabs, InstantX and other ControlNet models by implementing \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/controlnet.py"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed414f96d5fa119e0872c89bc1cf9af17b0af9b5f5bfc5fd20c81fba8e2962b6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): We should create a CacheableModel interface for all models, and move the size calculations down to \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_util.py"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"5491d8f65715e7d93ba53f7437b05e972872daef51ed31d05521ca08a417809d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Accurately calculate the tokenizer\u0027s size. It\u0027s small enough that it shouldn\u0027t matter for now. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_util.py"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e352a0ce82cd0596b99f637d9c5c62c42cd7425f9948d8933953ba9480cb3a2"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): len(model) just returns the vocabulary size, so this is blatantly wrong. It should be small \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_util.py"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"fca79a3d2f6aa4ffdbb9fd8e8df50e95816028d6fbd0b49023de44d92978e2ca"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Promote this from a log to an exception once we are confident that we are handling all of the \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_util.py"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"32f46e6a3afc4d8c22ad55c8499e55cc44f53930868f8339d350976055da15c7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: We could add support for mps.current_allocated_memory() as well. Leaving out for now until we have \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/memory_snapshot.py"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc30335efc3d5b4d3d27adde9ce63dcd00b50c014928ea4d72199a971f36bb65"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Does \u0060mallinfo\u0060 work? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/memory_snapshot.py"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"4891279b48511acc8cd6106864795de329559928d1fa2bc22eb1d2f93e5ab88d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Where should this go? The ModelCache shouldn\u0027t be concerned with submodels. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":407}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a2915641d0153f07e9fac73b7579a2ff0f9d9ec51b118827f6fe5e9aa3f0452"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Is it accurate that MPS shares memory with the CPU? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2378}}}],"partialFingerprints":{"codehealthFindingId/v1":"83911dbb1a88828b01e6961fe9116ab6999626abdc541827ef21ae00e7374a58"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Give more thought to the offloading policy used here. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2623}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e6e696debfa1d2190575ad6eedd42bbae1d5241c3f1878f983c53045d907fc8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): In the future, we may want to partially unload locked models, but this requires careful \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2632}}}],"partialFingerprints":{"codehealthFindingId/v1":"6366fd1cb824094d27be126c6bdbf7f54892ed265d53f24bf5e72cd4a11d7e20"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): We use this dictionary any time we are doing byte tracking calculations. We do this for \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/cached_model/cached_model_with_partial_load.py"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"40d97cc36fad01db49d205620a71590daf25989ca7b45c6548c6ffad6d894a89"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): Typically, non-persistent buffers are moved when calling module.to(device). We don\u0027t move entire \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/cached_model/cached_model_with_partial_load.py"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdcc25828834e552b8a00250d7d693b86b9bf8a9318857e1afe7a326ece3fe96"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Document this better. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/cached_model/cached_model_with_partial_load.py"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9d1fc3147d48d4220f33cb93883cb3e6ff6d7de840702ebfdcb9cca6bfba61e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Document this better. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/cached_model/cached_model_only_full_load.py"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3e332deb082bd16d2dbb7f2f49f72480fef68158b4dfca1f0c3d3935a60fa9d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Should we just break here? If we couldn\u0027t fit this parameter into VRAM, is it really \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/cached_model/cached_model_with_partial_load.py"},"region":{"startLine":451}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d2231e475eec802da1b262e413226532124f2b4488d424f5ce125dfc639b895"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): We use custom initialization logic so that we can initialize a new custom layer instance from an \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/torch_module_autocast/torch_module_autocast.py"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cae3cc492f5765f926768d1746c2f817b0a1ac34d7edbd652ffea16a2ce343b"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): We use custom initialization logic so that we can initialize a new custom layer instance from an \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/torch_module_autocast/torch_module_autocast.py"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a648e83bc230141932dbeb4eadaf69ea2ad5ac0a70cd2468955ac2f3c0b606a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): In the future, we may want to do a shallow copy of the __dict__. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/torch_module_autocast/torch_module_autocast.py"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"af3215741af3fa688ca78dfc3ca22ce86fd14ce39575b0635af612364055ddc7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): In the future, we may want to do a shallow copy of the __dict__ and strip out the CustomModuleMixin \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/torch_module_autocast/torch_module_autocast.py"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"30036e2cea37e6a8ee569d4359d083209405aa46ad82fe0825923e1b1dc9516b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): In the future, we should manage this flag on a per-module basis. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/torch_module_autocast/torch_module_autocast.py"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d84571e78a8550bed43f1d50d92e45957ffdeb61bec884411b73c895b2a4b4d"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): If the original parameters are in a quantized format whose weights can\u0027t be accessed, we replace \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_module_mixin.py"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdd5f218d65aced0e939d05bc7430d7c796decad7a7f4c171c06a4fc3c5e1507"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): \u0060self\u0060 could be a quantized module. Depending on what the patch is doing with the original \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_module_mixin.py"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b070dbe5579ee88ff4de65cf74d139573ef4773f87c1d924a33e1566c7d9468"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): Casting self.weight to the device also casts the self.weight.quant_state in-place (i.e. it \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/torch_module_autocast/custom_modules/custom_invoke_linear_nf4.py"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dd8b18ff90d709a7c7322249329e0f73bdd36d6b40e1c13e441f85834e423cc"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): We set alpha=None for diffusers PEFT format models. These models are typically \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/lora.py"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"734a41db73141bf23a21b17db5deb88661eb510e56dc9b4bd4a3dd0cdbd7a0a0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): the types on this diffusers method are not correct \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/generic_diffusers.py"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee70efd6b1bf74d8ece6bf3a3ab21be0bc95e3d37727657f6e3517e9372d8299"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): We shouldn\u0027t be hard-coding the compute_dtype here. \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":606}}}],"partialFingerprints":{"codehealthFindingId/v1":"78164971cfa5bc0c6ae25bc979ccd9826e83ab53594da05f668aa522b77d8cbc"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): We shouldn\u0027t be hard-coding the compute_dtype here. \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":1046}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f255cc7ea1586e88d569aafead96bdb133667816057f63bb9a62fc1076e0848"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): There are some broken GGUF models in circulation that have the wrong shape for img_in.weight. \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":1049}}}],"partialFingerprints":{"codehealthFindingId/v1":"80d3e40bd55af0271b67cbd3ce54157ecc6716e7e4e39f8a5c94ed56e13685a4"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): Is it safe to assume dev here? \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":1979}}}],"partialFingerprints":{"codehealthFindingId/v1":"14f30f79d992533f2ed997bb1545315a94afbaf2467cc3340efa9dd68e8bd9ae"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: create issue for support \u0022meta\u0022? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/util/model_util.py"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5970173343927f0c7c71e51784ff18ef3d4dde15d13518b0302d4b7432c23fd"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: # fixme \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/onnx/onnx_runtime.py"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a072821fcc1a1c65ef23c1386e6b1bdb31b1a54db7ffc843b50813a27d38a35"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: # fixme \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/onnx/onnx_runtime.py"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"3193f7b622add30fbbc14c9d19423156be2860a9f6a93d5e3af2d49a1ca7a5c9"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: # fixme \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/onnx/onnx_runtime.py"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5e05e1212ebf4a6fd85f8b3e6921e07602bb17e8211ffa8ee13a30224c925c9"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: # fixme \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/onnx/onnx_runtime.py"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2deb2aa28b8b417f9476ee02e13a3aa00f9f3bf1fc4f43ac9aa7944d652ae1f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: integrate with model manager/cache \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/onnx/onnx_runtime.py"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"48a06b1e118d51d5fd8dd2b5f58992f04e970a70dd827a203c614cd6d3fc5802"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: something to be able to get weight when they already moved outside of model proto \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/onnx/onnx_runtime.py"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"cee3b8063a32aa822f7d5dd62613f96662e101243e2dddea31a33ee4c209ea8d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: session options \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/onnx/onnx_runtime.py"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d0b164b78f736c363a57e57340ab684174b45d97aea46cd7461c4899a6016e4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Handle the case where we are running without a GPU. Should we set a config flag that allows \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/layer_patcher.py"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dc0d71211d085f1946eaf51af34ba16e4f47f8bdfd84faec2aafb28f6c2cafd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Using torch.autocast(...) over explicit casting may offer a speed benefit on CUDA \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/layer_patcher.py"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"94cd6cdb79ffaeb2b69df80c6f7e76ceda370021fb8bf5e5972c50f3eaa4ca44"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Simplify this logic. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/layers/dora_layer.py"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"51c762e56d9906f6b89952330c4ca6d1963c01ebe1a6d58c308b1762c785b484"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Technically, we should be using \u0060strict\u0060, \u0060missing_keys\u0060, \u0060unexpected_keys\u0060, and \u0060error_msgs\u0060 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/bnb_nf4.py"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7e62405a4e8718543794ad8adbc22927f168418296e9a9b4cf92880fda4ca36"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Technically, we should be using \u0060strict\u0060, \u0060missing_keys\u0060, \u0060unexpected_keys\u0060, and \u0060error_msgs\u0060 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/bnb_llm_int8.py"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"d947fe7e3d94161e0df6ba9c4bb665e312b2ebbd68f19db9ed616d5c502fa8b5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Look into how the dtype param is intended to be used. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/gguf/ggml_tensor.py"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"7004e81773afcd8f51d708b7f1a68e6ff80b4087a52014a2f8225665e9629818"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): We may want to add some modules to not quantize here (e.g. the proj_out layer). See the accelerate \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/scripts/quantize_t5_xxl_bnb_llm_int8.py"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"af7e8152f882d1d8ac3da96659bc3478d5235512ab11b487225861aaecb90e8b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): We may want to add some modules to not quantize here (e.g. the proj_out layer). See the accelerate \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/scripts/load_flux_model_bnb_nf4.py"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd0e661e1d49f2c216db3ae5f27b6829bc21f33980785b5dcc71a630abd51bab"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): We may want to add some modules to not quantize here (e.g. the proj_out layer). See the accelerate \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/scripts/load_flux_model_bnb_llm_int8.py"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"94cc40d613ecccc2f9a1fc369d80a45c86d7fcf4a62642be78b6c856cda61841"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Determine if this is a schnell model or a dev model and load the appropriate config. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/scripts/load_flux_model_bnb_nf4.py"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"73cdafb2ea57e37be61ab94cd7ef6e26be8e645b3f682f8beeb099cddf8403f7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Determine if this is a schnell model or a dev model and load the appropriate config. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/scripts/load_flux_model_bnb_llm_int8.py"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"e77769b19558939e3eb9985e222cff399e65ae8c879e38a80dd55a195c0f5b2b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Cast the state_dict to the appropriate dtype? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/scripts/load_flux_model_bnb_nf4.py"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"c41b1cc1a4e637c61b5ae8cc25fd8dc2966251c313626b44a9e46db4cc6d4b4f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Cast the state_dict to the appropriate dtype? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/scripts/load_flux_model_bnb_llm_int8.py"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"137abe6f841e89b280653bd0023908619db145b040f07b9950d6dd3217326ca2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): I\u0027m pretty sure we should be applying init_noise_sigma in cases where we are starting with \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/multi_diffusion_pipeline.py"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"cedfc34cc5fb6741ee167a12efb5422310ec90decf4e51eec73995b3edefa6bd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): I\u0027m pretty sure we should be applying init_noise_sigma in cases where we are starting with \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusers_pipeline.py"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d9d2314285aa60fecafd5690a00893cfb7695689951e1ec47d46b82d28dbfb8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Look into the implications of passing in latents here that are larger than they will be after \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/multi_diffusion_pipeline.py"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"33ea4254ce5e2a0da11932ecab179721e07d5e43678869c9dc821017dcffda22"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): This solution allows all schedulers to **run**, but does not fully solve the issue of scheduler \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/multi_diffusion_pipeline.py"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"7615d581463ee7136da127ce343216021afe7c163479baf85816570e1b91c3f1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: conditionings as list(conditioning_data.to_unet_kwargs - ready) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusion_backend.py"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"591756b95e254c56aa889a56a544951cada44461e44d20c4d92fb73aaaf74f80"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: rename \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusion_backend.py"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d2f10974ccded3e67e48f80ac85379fa56009da94bc9c1dbe8a156b7421462d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: file diffusers bug about inconsistency? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusers_pipeline.py"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"815724fc92adc64c2a071928bd5b90e444b73d13f1aba0e6942779aaa55f4fd7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: file diffusers bug about inconsistency? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/extensions/inpaint.py"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d82cb95695a5c6237d2cf8fe1561245399fa31197b0cf17206f4b6fa969ff6e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Do we need to also apply scheduler.scale_model_input? Or is add_noise appropriately scaled already? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusers_pipeline.py"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2d7137bda458b9b07a09f636cbfb16416c3c0769946176c82928e488a8b2353"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Do we need to also apply scheduler.scale_model_input? Or is add_noise appropriately scaled already? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/extensions/inpaint.py"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f505994b855bd760ff0705d5a1ab3d04fcb89bd604a93a528ab1253d45929eb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: should this scaling happen here or inside self._unet_forward? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusers_pipeline.py"},"region":{"startLine":461}}}],"partialFingerprints":{"codehealthFindingId/v1":"85e57d4ef9cf336c0575eaf95b4e16c8dc0696b7e1aaf0c98c3726a8709765b3"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # Hack: force compatibility with irregular resolutions by padding the feature map with zeros \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusers_pipeline.py"},"region":{"startLine":505}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9e030be386c0ba907d46e9b4d5836983dc940ea31fd80c5cd85adaffcc00fe2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Should we just raise an exception here instead? I can\u0027t think of a use case for wanting \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusers_pipeline.py"},"region":{"startLine":538}}}],"partialFingerprints":{"codehealthFindingId/v1":"206d84c03b9c01623abb2a55f938f0c324c557199fc0bfefa583d6c361b900cf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): If we decide that there is a good reason to keep this, then we should generate the \u0027fake\u0027 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusers_pipeline.py"},"region":{"startLine":540}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bb9d515f8bcb38166f262498df0b42e7fa4f0c34452f0f9a92a50fc5e649b26"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: debug how handled batched and non batched timesteps \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusers_pipeline.py"},"region":{"startLine":550}}}],"partialFingerprints":{"codehealthFindingId/v1":"5376ec9fc91b292b40aae798162366021b023205291883280465129a80f5f4ff"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: discuss injection point options. For now this is a patch to get progress images working with inpainting \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusers_pipeline.py"},"region":{"startLine":576}}}],"partialFingerprints":{"codehealthFindingId/v1":"c80826bd650651e5b5f5fd3ec9218cc13d575ea42ed5d8cd399e5c4a6d2ec62e"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK(ryand): seed is only used in a particular case when \u0060noise\u0060 is None, but we need to re-generate the \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/denoise_context.py"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"713bb0b965ffd8fc4b4edfae141b101a4fe84367d8452c38dc7c59232961512f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: how to pad? just by zeros? or even truncate? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ea39003d8903bdddaad88804cce334d873fc1daf42f8389375ba44a5213356e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: how to pad? just by zeros? or even truncate? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"da004c02f416b7127c9e66e6086803eb1b566c4f6758f1c95bef877fb43370ad"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): We currently initialize RegionalPromptData for every denoising step. The text conditionings \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2d60993087a72164b70481410eac4ddc76baa072aae18f38fa7c555165e603b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): In the future, we may want to experiment with other downsampling methods (e.g. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusion/regional_prompt_data.py"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ebf0c18450c3ad47103753cab38bb4f6de45810c72fc7767868e43fa84ce337"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: attention kwargs \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusion/regional_ip_data.py"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e510c8b28dcd05d6eb78794f0ecb1d23cb1a7e82604ded849ec2ba83aaca13e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): In the future, we may want to experiment with other downsampling methods. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusion/regional_ip_data.py"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"11a174baad71498358e2ffe094c434c979dad5e2431d64e784572b8ea8355773"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: add support for attn.scale when we move to Torch 2.1 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusion/custom_atttention.py"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3d76117a82caf959de3cc79a06c3ceaa70b9f9bc3b375c7ae04d69c3f3d2a8e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: add support for attn.scale when we move to Torch 2.1 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/extensions/ip_adapter.py"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"722a418853f29896fde2792db728bbe3a023e3554938c7607ab5b066c7cb49e5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: combine regions with conditionings \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusion/conditioning_data.py"},"region":{"startLine":442}}}],"partialFingerprints":{"codehealthFindingId/v1":"b42c6cd0d42b3412c46d889eda1fbfcd32684695e625d9f8de97ac248dc3115d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: change event to accept image instead of latents \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/extensions/preview.py"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"1525180b95820e172093a17fe85cd24a67755536f73f2c6bec0808391af39eb3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: is there any code which uses it? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/extensions/preview.py"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"d56ac61d0ad0b31554e455686b93dd4666659eea49edd7af792436a33ad0f356"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: is there any code which uses it? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/extensions/preview.py"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"479e83f3587cf1415d2ce07090fc87102f34ac37e4d7b7ecbd5e31353a36a6e9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: is there any reason for additional field? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/extensions/preview.py"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"841e3b94bd93f7ebca06b21b24979335755d712ef61c93d08036a30c83d6d05f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: refactor a little, when no longer restricted by old backend logic \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/extensions/ip_adapter.py"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"45f47b3cbc66d4e33bd168f48a1cd4ba1c1ee09de27626eff7bed3b049d377be"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: enum/literal/... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/extensions/ip_adapter.py"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c7413de2689558ad4f862b061c36bf310c55e02d014a40de2dd3f92fdf90532"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: # HACK: unload image projection model, as it no longer needed \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/extensions/ip_adapter.py"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"f03d9368871deca6bbc7a9e89701b06eda9fd3e572277b78a2e3a163c33ec454"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: cond mode to attention kwargs \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/extensions/ip_adapter.py"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d9e24aad927f1c5261eb73976352d77e33f7574d82d2c7a7a8f0a1c879ea4df"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: somewhere store/cache attn_processors dict \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/extensions/ip_adapter.py"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a1af4eaab80270b80c4598c4c573f401a140e1f17417b134beeb4a3fa628e93"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: check \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/extensions/ip_adapter.py"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"3910577c0f321238d974fd1d0cb4c7816b9568a2b67f5c52d8e55a9f8a7cc744"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: redo this with preview events rewrite \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/extensions/inpaint.py"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"461876622445027c992987bd6349983cfa734ffb3c7cdc46725e07afe389831a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: add dpmpp_3s/dpmpp_3s_k when fix released \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/schedulers/schedulers.py"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"a44b84e5f4a54c3ce51c6935639148ac59935450c5d10536feff682499663ad9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Replace with wrapper call \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/test_utils.py"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"f47c35448b0ca5a8a909486ba9bd47552fcc2106af4298101ea62ef0e1de722e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Provide support for SSL context and credentials \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/logging.py"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb70ff57d102b348973f97736422e3a5f3035f916428bf631f32b88811cb1b86"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: create PR to diffusers \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/hotfixes.py"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"1db5dbda20adc0eb525b482fe32b9b662dbc2b296c6e0119f6cf219bc393f0e6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: remove when fixed in diffusers \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/hotfixes.py"},"region":{"startLine":809}}}],"partialFingerprints":{"codehealthFindingId/v1":"984c7f0437a04327aaa4bbaa89020c66be5c7aafeb48b1736d85fc9cfffc21f1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): maybe we can clean up these utils after canvas v2 release \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/knip.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"11fe189d9b8f2661b1b0234c543ca890e6ef6d623bab814f91021ee1a80e5ca4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Disabled for IDE performance issues with our translation JSON \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/.storybook/preview.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"06c0d105c0ee10d9369bdb4b4b396fee4f2e13b1ecf9fda5ba439d4142c7e121"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Disabled for IDE performance issues with our translation JSON \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/i18n.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"124bb434aa462d3815ed96b3dd58895ba07d1de04142058db970fe83ed050af1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): Should we query the permissions API? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/hooks/useClipboard.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"302f9489042f110b358eec97f7a2fa4afef33a42972de9dd91e6c3419784521b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): Maybe this should just save to the currently-selected board? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarSaveSelectedToGalleryButton.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca034e5fca9075e48bafc9052a3cc0c4358a773f8af5c3e4aeeca41f856185f4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): consider using a constant to define which entity types are supported by which model, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useIsEntityTypeEnabled.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ccbb65a1497b73e9879e6870ab38a8ff3dff8a49c94f3360d0417a95ff82378"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): If we move the brush preview\u0027s Konva nodes to the selected entity renderer, we can draw them \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStateApiModule.ts"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce145091449806b3cb164b76b440c6d1478772ecb5a411928d1979c5cb4c37cd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): After resetting an entity, this can return stale data... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":1117}}}],"partialFingerprints":{"codehealthFindingId/v1":"178c7e4c479905473d6255791eebb8bbbfb3e241767a84c9b0f0e49dbb8ffb63"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): This is in the ABC and not in the concrete classes to allow all adapters to share the \u0060destroy\u0060 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f54954889ab1ad18f51a6275d0675fd91a63e4c8a520576904b3a0b389d6f2d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): This is in the ABC and not in the concrete classes to allow all adapters to share the \u0060destroy\u0060 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ffe43abbc9e8fa266293d948304884313e70888b9fdc3fdea20bf0622a02e1b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): Get rid of the cast - see note in type def for \u0060InitCallback\u0060. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f4cc79dd5887f355d13df5862e739ae2c5889c8b32f444add6b62398010d800"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): Fix the docs upstream! \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"faf3740666842234f1465c53fb9db49d158be1131027dcae57040ed297387d18"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): Figure out a way to handle this without resetting the aspect ratio on every change. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1259}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bbf1a20a225a015c3014eb634480484769ab3210274f446be0367bc15845637"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): If we add the object without splatting, the renderer will see it as the same object and not \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1565}}}],"partialFingerprints":{"codehealthFindingId/v1":"98805013aae056f05f0dad6e3c89fc4d24a4c56ccdf36fdbae8677483b1c21dd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): If we add the object without splatting, the renderer will see it as the same object and not \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1580}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9b71a9decfb18de6139023dfae096be8119fd5bc4f389b29f07ed08aa2bfd7f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): If we add the object without splatting, the renderer will see it as the same object and not \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1595}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4322927def380fff130a5cc68cc966480aad3b959472843af1029afe347fd04"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): If we add the object without splatting, the renderer will see it as the same object and not \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1606}}}],"partialFingerprints":{"codehealthFindingId/v1":"894bb6583414d18eed3e2ec83a87836d1abceceb58fc2848a3267df17797f994"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): If we add the object without splatting, the renderer will see it as the same object and not \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1617}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb4190bc2996d11a7c336b4b3cf74aacf4e316681544f64634f4cb5411e14bfb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): Figure out how to satisfy TS. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/useDndMonitor.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"420f94b6818058065ce25aa27bf45fbd013c39c2b16e2ad916fdbaa430e4d45b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): Figure out how to satisfy TS. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/useDndMonitor.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1d591b8e15e5647457c358cf14a5cd8e42d682c625973e66822944fba0d71b7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): Figure out how to satisfy TS. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6b5ca34814243e5ec1709c0dff4bdcd0fe37abce87b831c6e1d37c2b469ebe8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): Figure out how to satisfy TS. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"b73388fdc9c81864a145f31958811107f85af05112d0db31e68b68b565c6e1cd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: fix hotkeys \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataViewer.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"014c964bd332ed847d7b79d682d999305f10384a51e8443c6c3eac22d2a53abb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: These had parsers in the prev implementation, but they were never actually used? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2615}}}],"partialFingerprints":{"codehealthFindingId/v1":"de706cc288044c1b376fb15298b2769abf6fe94430215d096d9cdbeb20e362cb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add a link button to navigate to model \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelResultItemActions.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fd951026b5695f5198bc6dab0e88c66291b146ccbe5ce30d7b9bc286653c329"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add an individual prune action here? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueItem.tsx"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ef86fcb9a028f4dca7a6ba6e2e634ef646205a9d772997d2a889c2c5484576a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: In the future, refine this logic to more strictly validate \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/RelatedModels.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba0566aefe415fb78c4ec3eaa6b0056f2a830f122af7af19961c940f51c116c0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: can we support reactflow? if not, we could style the attribution so it matches the app \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d0924fff26bb9e27b6e700842b16dd77224013c11d74496521ac16d4217c88b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): Handle/guard against circular references? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/form-manipulation.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"750af010592f90c034218dc4dea7a335e037abf47327d901225d1f4147c1301e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): This causes a kinda jittery behaviour - need a better heuristic to determine stickiness \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"63dcded5a2b7309b6912a7ad286f90d5c088f6299efa089b2bb5f9984c00d5c1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): Can we move this into a separate file and avoid circular dependencies between it and ContainerElementComponent? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElement.tsx"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"7739858bcb38bd25b078e53d0a98f86b9f08416c4fa84b214439540111a6c141"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // // TODO(psyche): this causes an infinite loop, the scrollIntoView triggers the onScroll which triggers the \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowList.tsx"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f7453ebbf92cdd9c9454c4025600dc31864bab23e24406f635c226ebc566055"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Keep track of invocation types so we do not need to cast this \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useBuildNode.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cbad95dfec41c0a6f7a937a10078a1b2422e69bff00d068d7b0ce4c5111e262"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): Do we need to do this zod validation? We already have type safety from the action payload... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfa835a4fd85b10dd3971153fab49f4b4eafc0e1048bcd3f79f13a98b5fc76a0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): The below TS issue was recently fixed upstream. Need to upgrade @xyflow/react and then we \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b9c01340cfbc06f8bef5ef8e10df3e6bb1307dfb9b55f5f13ebd395473a7af2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // @ts-expect-error TODO(psyche): fix types \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/common.test-d.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a5805e29d373413cf185929472e9d4ff6071456d1d168ab137aec32dc08a6c3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Get this from the OpenAPI schema? may be tricky... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a6b645d7683e8ed4abf70883f0481b0c4cf7f2c61bab6f538e0ca9fdee70694"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: should narrow this down to a refiner model \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"4825fb74598f6cf4cc39bbbd2aec4644fd2b242d1d70efef296acae81d85f753"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: should this field ever have a value? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b83dfa5eb11e059cb6cb3ae79929e9243b3d1458635900d60192f35c72c4a5f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: should this field ever have a value? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts"},"region":{"startLine":467}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d4ffaea17fb01b9e94c41e5a7050f4154a415ac0b065c37e4941f225876bd65"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Narrow to SDXL models only. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/v2/field.ts"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"84e140a82b93765fb60846ef1262afd593dfbd0d1a2851a81f77fa6998c6a656"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Narrow to SDXL Refiner models only. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/v2/field.ts"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"f844be295cb7d23c80779e440691938dfb2ab1bfc57e2ad3a6dcfeb2164671f1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): Figure out a way to alert the user that this is happening - maybe return warnings from the graph \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"43306fcec2989a00439570cb3e29c6e6fc63492b6d9e4a67ca45874d27319e88"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add FLUX Reduxes to denoise node like we do for ipa \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":875}}}],"partialFingerprints":{"codehealthFindingId/v1":"d45008a96229cbaff6e1ab40c1c4ab56d5d39acd4a9ba49bf0765c612ac32172"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Should we put the positive prompt in both fields? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"e879a217df6304f796f5b9f8d18f95eba4fa9260da399d8b079aa1fb3d2d91e9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): figure out how to satisfy TS here without casting - this is _not_ an unsafe cast \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.ts"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cac7fdcedcddb81a017bf5abc6c5d4016eefc467fa0aa9d1f39470d65b00af3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): Add more validation checks - cycles, valid invocation types, etc. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.ts"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d86db55bca6fcb6fa3a05d7efade0899aadc7fcc386d4cb6f0bbac767092c2f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO(psyche): Test workflow validation for form builder fields \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/workflow/validateWorkflow.test.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"363e3b8a7ba8d3de5ef4b8bdb11125d63d54e795b0525f5657d19b4946b02e44"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(psyche): Do we need to reset things w/ canvas v2? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/useClearIntermediates.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"718d4491dc5cdda722aaa2940382fa0c903409b250408457de763dec5765fef0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: every value below is a placeholder. The registry refuses to boot without these facets, but \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/new_architecture.py"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"01ebdab0da2bbe14701884013c29e775da9d922151227d85f2a63527213e00f5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: the latent -\u003E RGB projection for this VAE, one row per latent channel. If the architecture \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/new_architecture.py"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"02289ab803084a5051acb05c100a3deff22cec37f41914503b9d13369368ee17"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: latent channels; must equal len(...LATENT_RGB_FACTORS) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/new_architecture.py"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbce1e44ed1c6bdf52dab82516fa035878b756d74598ba455453ebb75148d609"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: how much smaller a latent is than the image, per side \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/new_architecture.py"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"b52899c3716539ac55668ba916b31aec4023a95a43f691a40ddade7f2da69c9a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: the class its text encoder produces. Reuse an existing one where the shape matches. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/new_architecture.py"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"48be2e0ba2c046bd4bc77fa5e2bb40a151e2c6faed6eb3a4d78d606532c44451"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: what the generation sliders should say. Cite the model card in a comment. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/new_architecture.py"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"97f815dc65a10f7388a99ebe96afec3430f4eb5b837a7197974aa51d143d22cd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: which of txt2img / img2img / inpaint / outpaint / t2v / i2v it can do, and the prefix \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/new_architecture.py"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"0271679306ce2485778ce993e6cacaa8424828ba51d2e8661afc103cb0083f21"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: dimension_grid must equal the \u0060multiple_of\u0060 on this architecture\u0027s denoise node. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/new_architecture.py"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"c641b37709447c7c33af2865e24ed0fc97ced4b9eae6555ea28a0ff0923407a2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: declare the starter models, then add them to STARTER_MODELS in this package\u0027s __init__.py. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/new_architecture.py"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"45dd34362a140e6e24826c75594073e1dd6bbcd9ea64399883b802dc84e6ec21"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: test that derived types mixed with base types are compatible \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/test_node_graph.py"},"region":{"startLine":2132}}}],"partialFingerprints":{"codehealthFindingId/v1":"39b4d2674cb59bc976b5781d1060fc33e93b749438230708500eeb0cc9de8cbd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: TEST INVALID ITERATOR SCENARIOS \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/test_node_graph.py"},"region":{"startLine":2378}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c3f326397b1ef778a1e3a26bd8c72ef0393b74125f6630b2f980a8bd0824f9f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Graph serializes and deserializes \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/test_node_graph.py"},"region":{"startLine":2595}}}],"partialFingerprints":{"codehealthFindingId/v1":"8517ed919ab90e4b0a6bbe91dec927d75b368366b2862aa18115ffaae684ef84"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: when cache size is zero, should we consider it a miss? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/test_invocation_cache_memory.py"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"a788ab7fcd5d8973f79a73aba7967105cc64d8b780c8a3b67169348c48ec1f0d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: test completion with iterators/subgraphs \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/test_graph_execution_state.py"},"region":{"startLine":3852}}}],"partialFingerprints":{"codehealthFindingId/v1":"82804b9d3b13fb83724e5ebb5fba6145a0c2f11a4c58173d19f750cf98d3919a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(psyche): The extract_metadata_from_image does not validate the graph correctly. See note in \u0060extract_metadata.py\u0060. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/app/test_extract_metadata.py"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"29e76b1e9d5c43515bb6dbc8205b7df8b02d01f1d92868c52841ff856feba62a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): Figure out why some tests in this file are failing on the MacOS CI runners. It seems to be related to \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/backend/flux/controlnet/test_state_dict_utils.py"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3a7eedf68046a4252130b4e40e7462021abd1cae929a2885ef590089cad8c14"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Set the expected result preemptively based on the system properties. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/backend/model_manager/test_libc_util.py"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bd522c3d18047de67c0198fe5cd329d8e4fbac9018cc084b42a6ffe85058ddb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(ryand): This feels like it should be a type check, but I couldn\u0027t find a clean way to do this and didn\u0027t want \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/backend/stable_diffusion/schedulers/test_schedulers.py"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"f84221bbc0249289ee33575a83a6a8cdacdf3eb5f2b8ce48cfa1c306b0d433bd"}},{"ruleId":"D20","level":"note","message":{"text":"No ADRs found: No ADRs found. No recognised ADR directory (\u0060docs/adr/\u0060, \u0060docs/decisions/\u0060, \u0060adr/\u0060, \u0060docs/rfcs/\u0060, an \u0060ADR0001/\u0060 folder, or their siblings) exists anywhere in this tree. What was searched, so you can tell an empty log from a search that missed one: every directory under the tree (build output, dependencies and VCS metadata excepted), for a document that is either any non-index page inside a recognised ADR directory, whatever its name and however deeply nested (\u0060docs/adr/use-postgres.md\u0060, \u0060docs/adr/2024/0001-x.md\u0060); or a file anywhere whose name is ADR-shaped (\u00600001-use-postgres.md\u0060, \u0060adr-012-caching.md\u0060); or, when neither turned anything up, a document carrying the decision-record signature (an \u0022Architecture Decision Record\u0022 heading, or Status / Context / Decision / Consequences as section headings). A decision log that clears none of these \u2014 unnumbered files outside any recognised directory, without those headings \u2014 is not seen by this check and this row is then wrong. If that is your case, say so rather than renaming anything; otherwise, consider recording architectural decisions in \u0060docs/adr/\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d2bea044ff79d7d275f5a91a6e2f548586178eaf480274c33960ad020c854631"}},{"ruleId":"D26","level":"note","message":{"text":"Projects may be oversized for their cohesion: 3 of 7 project(s) overshoot their size bounds, lowering Project Cohesion to 1.4/10. The most over is \u0060invokeai/frontend/webv2\u0060 (275135 LoC, 3553 module-visible types across 143 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":"94cdd3ce5d794cd41ae2f42580c2f8002a5977ee84646819cbf40c51b218068a"},"properties":{"commitSha":"3e330d7d9dce1b1f4cb1b3ede864bf143d207680"}},{"ruleId":"D28","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3cdfd7beb31b791ae18dcb425e21eb157c842e7bbcd522cc330573c1a6538db1"}},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6676d8f5ec445fc9a12ac12e914d473e1f8ac247d9138924ce3cdf9db0454172"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"25e33f06862e7067c7188a8ed80ab4b3d4719d0a1bf1aa1bcd48023d92d19333"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"614fa7721bac0f7fdc5d8962a411d2479f160d3bcdf1d4212a98c52b06ce2f38"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"628eefdc67b8ee8ce8fd02a678b72d5cda0de06815a8c0103f7c8fb7b1e76b0f"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"c4c53bd264a8040c04e36ae6eb430477d4af1342b59685227677d8ca9a6eccab"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"e72dea3b0e2c95088a2e0f9d568e90c1e2b99d521e2ff8bec61fa29d30a00ff2"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"e4d58f2e305933a956268a59db1cbaa4ef684c28a719814787318ab791d15435"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"53770ea0d6ae7759346777290fc96b5c977e671383b1dfb832377e181391c5c7"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"1d2b3b365dc4cb62a7c75a5717860cb3b6b05d1e1c717bc89693721b757ed1ad"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"776725ede41d2426629973bc1307cfa0729cc3215d2d2fd1c9e65ad2fb3be354"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"373c9a90a2525d0e6b5aaa63996b76db94f71ef13907147a0fcead535d1d36dd"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"b14b71acafd87d4a6fb48b7c5008527042c087894e12fcb6b22dfa0d5051d708"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"6d8e5626dcad9e406118f8ecefc48d831e459926a51b0d385b8d51d969c08cf8"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"f1af5e7db40027cea6f4e771b9f3511355a9ca643a785c9b76026c7313277601"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"ed1182e2f145ce33802d120ff560ec49539432e9c039160209c422fbfe4c33ed"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"313334221895c9cdfd6552e046a66df49f99c0be8c5d09ddbd985c7c9c71a954"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"5dfb7066450014b10d4bc71ca5d7d8749a1db563bc0525129b59ab2d1af95b35"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"0312074f81afe4e5a8f72cafadaba00c073c85d3075dd88fd7d12362de8e8eb0"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"a264f053a7371747bf707c8a1e332d1c4c390d469b6204a0d2dad447a515caac"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"7e8d84c5f81196569584f9ce8c8a96eaab720985ea3b679c2b4ec1924218a2b9"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"c6ef2f316ca631b692d03c475bed7e473e93f3db6fa35d9ef86248c50808e234"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"5c802ec97e672feaa32f710e6686a62b890e325cf5a04a8fb4136422a8a2ef74"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"f40b60322077a9addf50227e52c7e5b36a96f8161a0ba63fe67b7539c1df86c7"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"fa257781e018631f75dcb3056e897059748df4eaa600830ccbad369cd03df197"},"taxa":[{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"0800f4864083acded076e18ce179102b7980394c47ebdfe5507602d97e47d589"},"taxa":[{"id":"CWE-95","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"f83bb5948b237c28419ecb110510ea1f48e35efd5478ea957e3ef1f5f243b69a"},"taxa":[{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"6b8e02643176daaac128a84c468ffeb4af932c38ec4a22c05022e6826e51c0c1"},"taxa":[{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"6ed059458dc0d864f79fffc2c8cd3f09ac2213f256b255ba1e07734350228541"},"taxa":[{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"252d79c90b184ffed24d81ffdcf6670269121babe50798657fa683f43f6db8cc"},"taxa":[{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"d1737ea6872184f97ae07a133ce3e7f5b3006f3356507e28b1b2c5cf142ce9f2"},"taxa":[{"id":"CWE-287","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"32e1e195177281c552e60e0efa2a7094e2abb866e1fe2e28af2e3caca13c72f4"},"taxa":[{"id":"CWE-502","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"e7e8e87ad89e3df22730c9ed254eaf4becd781024ed5ef63f1ec63bfc204c1b2"},"taxa":[{"id":"CWE-502","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"4805877bc3bb45397e1b5a3d10fc07059c3f6ef8a4e01a6af8b481ab38c0dc9f"},"taxa":[{"id":"CWE-327","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A04:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"45efccb95f19f79987708a51ac6645d43067906037802dea372d61774cb8f16a"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A09:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"d35e085a42f457417d5b06cd0a6938446f542f8c8f54cd7303ded3cc33b9f880"},"taxa":[{"id":"CWE-502","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"01b109ff5c7347f532b7de1c226f422e763690a70cfeb10db7eea6f1ed7ceff0"},"taxa":[{"id":"CWE-319","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A04:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"4bd4a4b98a0482264895a4b580287363d7cef1708bc0913ef1bd65d3b81f7e35"},"taxa":[{"id":"CWE-319","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A04:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"4326bbd49b2ad4389934a3d24df9bf30365dd4438a238802cdaeb8e24bd993a8"},"taxa":[{"id":"CWE-319","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A04:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"4af3eaef121950bb128200f25f3125ebe280dfbfbcf507c5dbc9f51f6589a2ef"},"taxa":[{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","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":"a58fc28d933fc43061a085240089df9f0f6587761dfa25f47eaf5ffef7e1fb44"},"taxa":[{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"c18ecf20ad02aa1cae1c462be2aab11e63b32973aeb1f6bd2a97b7c85bff4108"},"properties":{"dependency":{"package":"braces","version":"3.0.3","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a22f33ff13534695bdbc83544259b765f67c8be29e88eb8728ab1c3a5e039e5d"},"properties":{"dependency":{"package":"protobuf","version":"4.25.9","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","PYSEC-2026-1805"],"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":"6080f946c8512de5a3928b2a067b206a0b0129393036c0649f6566498eec2fa6"},"properties":{"dependency":{"package":"torch","version":"1.2.0","advisory":"[GHSA redacted]","aliases":["BIT-pytorch-2025-2148","BIT-pytorch-2025-2149","BIT-pytorch-2025-2953","BIT-pytorch-2025-2998","BIT-pytorch-2026-4538","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","PYSEC-2025-189","PYSEC-2025-190","PYSEC-2025-191","PYSEC-2025-192","PYSEC-2026-139"],"reachability":{"kind":"production","file":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/geffnet/activations/__init__.py","line":5}}}},{"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":"2ed327f68424aa0f8323222e15f4863ad5eb8bc789a40bd82cf47c18e71dbd19"},"properties":{"dependency":{"package":"ajv","version":"6.12.6","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"41dd2e35cff3083cebe56f28f5444762154e5692a80ac1700205cd4a897bfa1b"},"properties":{"dependency":{"package":"yaml","version":"1.10.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"617182b72a221d41e6edd19c38150ac6c4b3defee1061ef7e69ba8d6142e34cf"},"properties":{"dependency":{"package":"@vitest/mocker","version":"4.1.5","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"495b2c29f6e1b6644ef7c3efb4924db6d29ad96ac1f2d4ff51d5618a0f154bad"},"properties":{"dependency":{"package":"vitest","version":"4.1.5","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8595b0a037dd180bfbcff930c27aa68ed1e772f94411f46801754c413dd71b2d"},"properties":{"dependency":{"package":"fflate","version":"0.8.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"228852a2c5c623216a3bec1868c002ca82857cde6727ecb98eed4d23b981e612"},"properties":{"dependency":{"package":"i18next-http-backend","version":"3.0.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"production","file":"invokeai/frontend/webv1/src/i18n.ts","line":3}}}},{"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":"c2accf08643e0bda523b79965b21ff025b7917dd621344529ee2ac72ddf32486"},"properties":{"dependency":{"package":"decode-uri-component","version":"0.4.1","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e617d23dbebb43afee742974d531c2b49ede676598c71f279925702b18a61f44"},"properties":{"dependency":{"package":"uuid","version":"11.1.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]"],"reachability":{"kind":"production","file":"invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts","line":8}}}},{"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":"44d90a502f750e1810f512ef36548b1a0b26b2d094ec429307c42950955f4637"},"properties":{"dependency":{"package":"@humanfs/node","version":"0.16.7","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":"31a4626c8a479d5df95800c40726de18cd5967079c672e4107288cbea5492fb2"},"properties":{"dependency":{"package":"accelerate","version":"1.14.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","PYSEC-2026-3804"],"reachability":{"kind":"production","file":"invokeai/backend/model_manager/load/model_loaders/anima.py","line":7}}}},{"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":"f9e506f2fd4b70d603334a3ed977e88f2ca1815aa1295c9f4384683a9c204e41"},"properties":{"dependency":{"package":"torch","version":"2.7.1","advisory":"[GHSA redacted]","aliases":["BIT-pytorch-2025-2999","BIT-pytorch-2025-3000","BIT-pytorch-2025-3001","BIT-pytorch-2025-3730","BIT-pytorch-2025-55551","BIT-pytorch-2025-55552","BIT-pytorch-2025-55554","BIT-pytorch-2026-24747","BIT-pytorch-2026-4538","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","PYSEC-2025-193","PYSEC-2025-194","PYSEC-2025-195","PYSEC-2025-203","PYSEC-2025-204","PYSEC-2025-206","PYSEC-2026-139","PYSEC-2026-1856","PYSEC-2026-1970","PYSEC-2026-2286"],"reachability":{"kind":"production","file":"invokeai/app/api/dependencies.py","line":5}}}},{"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":"13586fc0c39afd311c8f68b33f2e89fbb1618f43b2d8bc54d4d00cd4d7925790"},"properties":{"dependency":{"package":"setuptools","version":"82.0.1","advisory":"[GHSA redacted]","aliases":["BIT-setuptools-2026-59890","[CVE redacted]","PYSEC-2026-3447"],"reachability":{"kind":"production","file":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/setup.py","line":3}}}},{"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":"b98ad1ea8092868c51ef0db67d9f6cf7de03d4bce9baa0b58913e8a2ce2b8d14"},"properties":{"dependency":{"package":"onnx","version":"1.21.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]","PYSEC-2026-2689","PYSEC-2026-3587"],"reachability":{"kind":"production","file":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/onnx_export.py","line":25}}}},{"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":"af205982137016589c13fcf26e2ccf62675d2509e3129794e823686828d8cdc1"},"properties":{"dependency":{"package":"pip","version":"26.1.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","PYSEC-2026-3721"],"reachability":{"kind":"unknown"}}}},{"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":"20bea309c4b637b511869f9c5f2f7961e471cab10122e64170a384e99f87177d"},"properties":{"dependency":{"package":"@babel/core","version":"7.28.5","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7ac253e6337862149b9c9fa81ea07ccd318bb29d84572d0991151d4b60e8a52e"},"properties":{"dependency":{"package":"@babel/core","version":"7.29.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4bbbed32550998a686ab2d76352010a57237f6b7dcc5f5554eb51a3c91675057"},"properties":{"dependency":{"package":"esbuild","version":"0.27.7","advisory":"[GHSA redacted]","reachability":{"kind":"not-imported"}}}},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"56b36431edc1eba0afd3150f8fe2a6dda0396fea344d888e83196cd25eed4e7b"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cc28170ed5808f4cf89d7d7fb7ecb2baf45dd6ec0cda43f5589c28b0a594e80d"},"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"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D31","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"373e305f6001577651b42479d2cf4d60bd4ebf60635dcdbb799a1c0961be0633"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/geffnet/gen_efficientnet.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"47f5aa334026f260d1325a1c6ff1e9cc0162f954d2f9d8f6a12ca46340bd6edf"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/images.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7eef904abadee341418d7ba99aa876a213ecb8caf54e281115008fdd01679aa"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc55aeb1c08e199ae9240081237ede340510f76a15d515fc99f5f41e0c381280"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/cropper/lib/editor.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"19767adf5a40cf482300e0f7b23d1bb2de638a78a1ee274d0a9b6a7cc6442dbb"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b95498bdb47f3799342532aba5e1b71ed7aa7721faaa735ca931cd0a5f00307"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bb0ddefb848294c56eb55301949335e05aa6572c4fd21af4fec4f1bc6b13644"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"de6a75d37e914721442278880532e2ff554ae01230282a1eadf9377b54722ad5"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/geffnet/efficientnet_builder.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f483e5c8d006e814528ada77ff2fa333e020e6fe4ecdb5c4929e9baffb73315"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mlsd/utils.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa39c53283de6e24dd35ef7255b7a1f20a4add76ab37781ec7b9eaa3591e6de3"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5936d0005e796a9eaea0a06636eda49e4458ca8fbefc84c816660f369b8b43d7"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/pidi/model.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dda5871d662f2563bbdab9cd64bb2fdef9e676cbdbf831db3a9c46e9855bca8"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c15186159aeaecb0f722298a944e55d511f60175848c7b1ec9327aa5e544b6ad"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/compel.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8173a8ee65bafa6b31daf71ed8540924bb61806a51ce97656153dc31280de53c"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBboxToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b52b9bcf1a31b1c0ea578af4d6752c1c2b5f8aef4b828d68f52be373d44c38c"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/tiles/tiles.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e4f06847b7fe5bd4ae20020af97759f2345dde8714d747d52f92c35c9ce2359"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/run-graph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"84d39357034ce673b969b67c1aa2dc5ca6a20621526f20b358417d0bfc876ff2"}},{"ruleId":"D34","level":"error","message":{"text":"Orphaned knowledge: No living knowledge remains for this large file \u2014 its last meaningful change has decayed away; if it breaks, no one currently understands it. Schedule a read-through / add characterisation tests before it bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fe40d913d2872acadc5ae466e432cd5d5ab4073ac9e4a1e6d9571068e08305e"}},{"ruleId":"D34","level":"note","message":{"text":"Further orphaned files (smaller): 427 smaller file(s) also have no living knowledge \u2014 folded into the freshness score and metrics rather than raised one row each \u2014 most significant first: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts, invokeai/app/util/controlnet_utils.py, invokeai/frontend/webv1/src/features/imageActions/actions.ts, invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/geffnet/mobilenetv3.py, invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_common.py, invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasColorPickerToolModule.ts, invokeai/backend/flux/extensions/regional_prompting_extension.py, invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts (and 419 more) (444 orphaned of 2403 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; 2403 of the 4522 production source files in this repository met that bar). 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":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b734df40da7ebcc23461841c73641a1fef087875fb854a3a9814d6fc4e53aba"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/controlnet_utils.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5f68aa17e8312af5e8bc7cc2a0ef5c913d9fcd171dd97e5ea63b61001ad66f1"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb6337132c4233f3090bf0b7fbd6910838975c77409f2a0cdb3bd1b9c15e21b1"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_1.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c103e7fc23840a996591ff7930858bc2c3500edad8a00a8522434d28c26fbc9"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/geffnet/mobilenetv3.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b50e84ac4844c78ff7baf122d2d3032c853fc29f8b617c7d42773941f0fb684"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_common.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbd9faed8e1bb1819462be641fcae48985398761276cb174703e4802975634ed"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasColorPickerToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fb6c2193e76805099b363357665fa65cc61e88f31b7e8620f2975f69139b143"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/extensions/regional_prompting_extension.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5e60602504ac77ea0549ddcc22d83bc8f99eadf9e929fc1b3aa0b4de58680d0"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"983b2762cba2fa3351235dae062c7041a7bfd6f9f5d3c4df0853847de21d1dd6"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"43c7b95b23983cef94ac9de3643b13f73ff8784a7ec070683e65d875ed02d35e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e578457bb0026b3a20e1159955988081c0cedd7593ac06346c0a05b52607f812"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1ae10ff4a978b21b2fff15aeb6fe0d5e98616fa917ed913f73089401dd8dbe0"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/v2/field.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e9381d8b740005c67c72be5859ae1c7273928cd445b29f1e602fd6065b2e970"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"296c31c7946af3d7d66b8c5b37493180117111aeb5f705454352185ec1f39aeb"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/wan/wan_lora_loader.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a0a4a1d14e3385c826ee5cc4031211219aa47c7e6606e088130ff49d5a8d2d2"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/geffnet/conv2d_layers.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d696210733ed93af1a808d66ea0ccd5937cb299e3f55c1ffb92c97311a6e50d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/controlnet/state_dict_utils.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"52a1fe7623e8abf2eb64352fbb32521835f2775c0789a7cd833d0074b3b2070b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasManager.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a37aa64dc5754fb4eac10bf211c5ff52c225c1f0f30ed5b4907f864e2f054ae2"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/hooks/useImageUploadButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff79b113ace0666743fe76a8c3b98cbfd68f948fe0dd2eb7c41f5058983dccf5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/dw_openpose/onnxpose.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2972eac9d1cf7de00b47d7e55c4d44c7957a8b480fd87d97ec6803f2a27249ed"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/tiles.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d381f493c90fb92e4bd8a4245345c5288e218cf3e5268257ac2688b8876dc5e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_hash/hash_validator.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d8a3935972e8a19d8eb261dfe441afbc756192bc5d201700a67f8a11aeb1588"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/RelatedModels.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc0a822e09aea76216d294c3f3e85771e4666365be546ba59a84d5283580b756"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/lineart_anime.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"11e03f49f52949fa5461fd481afb8dea4ba9440092403e168836ebac21c30642"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb92b09d7d5eeadd83eaef3478c139c1e14bcc4e36cb03f49ede4083dd08f002"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/realesrgan/realesrgan.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9b7a5818303884a743749405fc6c1bd17789a12383db1eb5aade8b8f05886db"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/submodules/decoder.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"22049c7c83e2e42ae658f21bc3da8636f9682931380c25eab8f232a7398eb247"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/context.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a95e3fe42ca30e49948066fbbadf11ff0dfaaec70734c4ec538a1aec16ffe22d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/gguf/utils.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"98c35cad258c99633ddd95c20ac02fbb5eba36a6a372891abfdec5c55e0d12a5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/segment_anything.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"23e6e4eef1f35778699ef7195c36594e7752b3c685263fb4de0980d25d5bab80"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/imwatermark/vendor.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"726ccb71036c14274d5894048db9875a9b098ba83ddd19de15d60e3a36e3b3d6"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElement.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"895a43aaf4e6c7c52f24befb47078c68321040cf0e60dbe57bf870e5cfb23c10"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d783811a8582186c3c42d4918122523d0eec6fc06488c4e4bb472f84ef75204d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/wan/wan_ref_image_encoder.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f70b0cb2bd5910d8d586d2bb23d5329890dc903c44569f5794a31c89c70fad13"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/minimax_h3_text_encoder.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f26f9ea3d70b826f5dffde3669222fa60a134fc35a69489c25d704888a713fd0"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStagingAreaModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1308b2bad7e8f5993817ae2c5df7a3b2df0551539a05a02e4be2eef6543f09dd"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/external_generation/providers/gemini.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2e0306cbdbf537f778a01764a972efd72bd34b879aad0cf705d66d90a4efea5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bbba2eb393c186dddd2d0cdbb9698ca6fe82202c592871ae46d7038bba0043f"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1eb5a4ca2613c3ea21fe35b4f364f0c89651d1903dcceaa99a9a0a05901b019b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mlsd/models/mbv2_mlsd_large.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8c3651c7a0f2e4ecfe43a3af0b28f721636fc4d63d698eedd61c6ec99cd7119"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/multi_diffusion_pipeline.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccfa5a4a6c08f9fc84efda7d806f3c3686ed8a4cc492b22d00b0e0ab5efb4d13"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_23.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"82063b62011e5902661f48414f97b13b713db0d71fa4faa89f4598bd2c48d3d4"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/modules/layers.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"57e0e265176963837d8fb579bfb617af534af6dd4b8a9671860acced4d319ae4"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"48a310eb5c3620cd0db44bb82ae2994acb5f42280de63f6b0ffef76c4a304e86"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mlsd/models/mbv2_mlsd_tiny.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3aa9f8e6563a8d62f526df6c274fa52def0a274ca7e497f2146046ca072b675d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux2/flux2_klein_lora_loader.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"698dcb7a012977e29fc8ff159b9c1e495a45287f10f9661016b5a72bdd0d3ce4"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectImage.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"927e4d2bb6dfb4aa5541fe6a75b139368fa102920a929bbf19c9f8bb23b5fda3"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f905c81714fb274ae8ff3aaa3a1edf9a5a661cca2bfdd08ea1d483e0bd9ea64"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/enhancers/reduxRemember/driver.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"23d8fd9b4a491a9967d5d04e4b393d71cf6e3e82570849137049b7f3829c95a8"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/minimax_h3/minimax_h3_model_loader.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"adf65964b5090db134d7e90cb53de6327642d32aefb720db194c4fbdc6acd164"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/util.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b30d3f22682749c134a12116f3ed7583025568d393c47bd2d3e9966a7910c551"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dca3728414e8ee5f749a832aed6ef73e1220726e442ee4943284fcfb805dc17"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/wan/wan_ideal_dimensions.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7d80a957791308b3e5473acb8b330c2c845844af3ad4e8e1238547e4310232f"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementIntegerSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"53f45d399cdb0616ebc886f376b08c9cad9521cbf208afd995ce14e618109bea"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementFloatSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d85dd818ad115cec3886fa03fbec2d1b39f7949f768ecd4d5c2655709f4f47b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/lora_conversions/flux_kohya_lora_conversion_utils.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d95e1e5af7e5f6be039b78dd478d264a4577768ab526a831b0fa654654a12d05"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/bulk_download/bulk_download_default.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3869afce44e39634f4846cab7cb859d35a4c9be8f08eea9d24fa736fe23a801d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/VideoContextMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1c4991f89dd8e2274b7397344221f94f2260c9b7e6db9742912ccc2a2db2e35"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/schema/parseFieldType.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"239b4505b6ad600737636bbe1a02b9f5d23da2025c39242f7d395a55a7b8cad4"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelFilterMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b794155295bd1c8c0ef51ba7abb83440ca26d3b02b08ee20373dbd9ae94be7d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/form-manipulation.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"950476cb2c3021e80c8e26971bb2cbb87a2a540a50af2b1296ba370a888f6469"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapter.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d31012bd9a74ac1dcb62e818d5024b977208dfa45377749dc2a1597c56d8355"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/extensions/instantx_controlnet_extension.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a205a088d0291072530a035a8abd16aa19d95ba52afb70b0d61ff0cdbf7d2216"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarSnapshotMenuButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca5a13df04d30a3018d94ee2f89a40916e809d038260ab5efbabed19ae5d13d6"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/contexts/EntityAdapterContext.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"104360a13c8a92b9d6a70eb784c9d7410b0a39dcf55865be46f0e6f5c86b1e95"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux2/flux2_dev_lora_loader.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c63d511b187d093d735df9e0714600a3cbdbb888cc814cad4353db1d64da3b0"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/krea2/krea2_lora_loader.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3612b5f38381c94dc25ab4f29c79ae0d91ae5d5edc7136368f481f6175c51f03"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSlider.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b9180d03fb5fe96982c7dea680155563ec8216caa70fe782603bd6a69e33dff"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd174acf189479defdb9aaabcfe278fb2c2e5a1e92229b661789a998d35bc23e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"00ad8a4ce951ae184b6349335a02796186d2efba5e245cc9c432d35aa3f62ebf"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowGeneralTab.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a215a75aa547d2cd357727cfba17234c7b06e10616ca67372676c5c19d5c518d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/controlnet/instantx_controlnet_flux.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd4599a602cfa6acd8d01c0f6c023bcac38565a175cca3a95f054d195c78041f"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/bnb_nf4.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0115726eefc0b72ef75c923f95a5e2827c2787297f9f250b314c1fda1700d70"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/workflows.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"73ea0dc4cfc937a78bb38c2d6dba0db454b10d29410fa7ca8da737f95a379c99"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/batch.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"836798fd6602298ce324959cec4476f1e76ddfd8e93a5806a0fbc7cf43fc086e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/v1/fieldTypeMap.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c2e7f95975a65646a357895bbdfe6e0cd50363aeedfbcab3c622e0827c64b5b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/z_image/z_image_lora_loader.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"53ff314aa49f7125cc47ee34dab9cac9648c1c8be51eb5a07e39d70466a55871"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasBackgroundModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3db33c298980dbce251c62f382a2d861ea8da7ac08f4fe2d36a7427c1278f0e9"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/lora_conversions/flux_onetrainer_lora_conversion_utils.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"df408e31b16e355baf1a891933e20be38cfc4a9f0be81d57b1c304087c94707a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementStringDropdownSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"598315519ba1c03dc37f82904f30e252003026f1874733ce761ac6cdc19f7c16"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityGroupList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f326108bc5145801359e855bb255cb85649e3eee38c779c15edbcc6975fa0e0"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/infill.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"125e90a3db8d88a497a7f659cd4ed01866f0b8bae2dad35058c327f423d4706b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/minimax_h3/minimax_h3_lora_loader.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c989a710d45e20a519e696193fcf5de456601254ef2f9b576875de012019fcc2"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueItemDetail.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"985044c52aeb73d64ba13f0dae6e11ddd58f64f1b7ff040f5e6385a5de1d5c8b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f982c10b0ac6fb6e0e047f57145e7ba39fc14a1b47effcee69e70ed4925ab1d3"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/cropper/components/CropImageEditor.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5fd5f60836f67650be98594d26cacbb6dfc12812f41ac9ad875fab4d5b0a01a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"679892d69ab39dd24ccc97f3529d1f0f2366df30593c309af43bd27d55a493a4"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/lora_conversions/sdxl_lora_conversion_utils.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"606c6f6c1b154426448fb9bab9dc731708b4ad9bfb3b37b5b510dbbda9e894fe"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopRightPanel/WorkflowEditorSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"058e2166f68e214c5e43c94c256577be049da7f41b8bc217f5cc18ba8f5a0b7a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarScale.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0e107e7550bed7b8469d71bcd0cf8939860dd2d064655aac96924c5dac19de2"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/invocation_stats/invocation_stats_common.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"337c956256e7dff5c99212c91d9c1c09a99b568629722b9e3bb2e0644ef7567c"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerFieldCollectionInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d0e172c60c28e6540cb446a7e75dcf5cfa73d603675eb018b6ba9649bc3f798"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/AutoLayoutPopover.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"98626cd0369c1b1a8b4566e879fee025318e0a2ce9834dddd5320ea294780be9"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatFieldCollectionInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6606298cb892902644030ca5cc928b54e62b524c0496517afe6b44b0b9cb941d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mediapipe_face/mediapipe_face_common.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"71b67f69f402c0e91ecbf1c6e0d2ee424ace590ebc86382c6d9d0dae68bcd942"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux/flux_lora_loader.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"48f1d668260aaf3c985039185d0b66e1b66d2523f9b9ef541808f48f7654a20c"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/components/ColorPicker/RgbaColorPicker.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"00c893c309cce77fed31b3231330d0b8af37bb5395dfba51ad2232c041652aa5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardContextMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed7fda56fdbbec543d4287fcab24be15ff566c45403ab14ffa21acdf883cd0d1"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b43011a8d3f3c3fe22586a918e7ad4836b34940eaab64b36e729a93359dce801"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/validate.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9c0cb6e69208147e8303b44977c62683f1450837ebdfa48c15d5192539f70ab"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"837b15053026e02ac97dea938e464186b8eb6bcd57803b0957a3f49a02be97b4"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/util/getFirstValidConnection.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b247c4db377b3c385c2ab9d64116bdfb2216925a1df1a6f5e76bfc613d0263d8"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/generate_vae_linear_approximation.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4ba61b5bda304a1959c5b813c19a360bff5477459cdd43d8102a03587bc9337"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c71e8277b437612a13d45a0c69e67099903cfde1aa27a05cf8107e7e02de4c5b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"401088f1a6a222087f7fa9443dc5464bb34a9d54224da0ce944dd12a529adf6c"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/model.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"766707c2109047f652fb7cada0a123f74271bc79b18de196be7dc49284b2aeaa"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasSnapshots.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"afd44314b850fe03a47a4c1bcf0880654e128e597e081f2c4774a84849a7c6a6"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasContextMenu/CanvasContextMenuGlobalMenuItems.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb32b742ff0a6453aade0c4255d1298b413e8e1a6d07ded50f6476059411f5d4"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsPopover.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"43ce4bc82aaa138deeec90b629f4f4c24ba184390a251734ead2ad1aa73296fb"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/ernie_image/ernie_image_prompt_enhancer.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff3776893ca7e7d022b7979352c501adaccb377fb35f5ac0595030b8180b2bbf"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useConnection.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"641e7b4df301fd9341212850a44ca06f0be538bfff6b9a781c793f3e2947e37e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"18c2802dbb10dc178429cfe3515506bd579be56cb068d7bc3b9d906d45451609"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/anima/anima_lora_loader.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"108d2c4851cf0c9f59983cd857192d4b21699425218e0419716baa2a91d585ff"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/caffe2_validate.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"68bb0cd1c78b6fea211705e19f8bc848094c03b14fba933a8b1de1b2da1cbb66"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"762592140a020d4f9d34fdfe1309735186800714c1b1edd1440560590b69f597"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorFieldComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a23ecbecdd0df45a0525cffae2febcece7fcb85e23f5e71712b1c324cd026738"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorFieldComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d8c2d44169553673822fbe81d41d318230350f51d662b9af8923e29219c5c0d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f333b8777eddf3f8ed16797073d414460339489feebef1377fcb15a34f49f206"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/onnx_export.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa1da9b35bc0babe2cdba9c087c78d69b3e167c7b0506b18b59eeefc5c3b8186"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/hooks/focus.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c7064232770d47469ca3ac4811595dfc7211a3e842e73f1a8caa4fd345a7438"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/context.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff298b6c934578d514a12c6b859b8456625ab8ac58865ff1d272efc17e9d1996"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityPreviewImage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9349344ad49a6215e0e75969b9c417e1a7acc372ef83a0e65d1988f2b48ec14"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/submodules/submodules.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"00292cf8774b392ce64c4a43de90c5ff63e4080ffff768b656f5fd945d5a5294"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/controlnet/xlabs_controlnet_flux.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"36a73ecd0e254348c3aabd93634684983b62b067fc14c239e060f34711b8722a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/custom_block_processor.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bbdfa329220bb037a605d8fa3dff2f24b96f1793a20d82cd131e6784c46eb59"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/tiles/utils.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"536ea36d7bf0533659d58e1ae285bf187cc50c1046e19f6dc1e034d5f258c8cd"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarOpacity.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a859f46a433533757109c16a0fc71db170d8a53b1d9ab0cd52db3b4edf9c58b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolFillColorPicker.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb0501954acf3ca3f3de40a4e329df1fc483e57e94440ed4ac12164f7ce9df84"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntityRendererModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"25bb9028ea794a8259a359e5d10ded72438a42ee5b4af15240e5e12479f577a9"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/dw_openpose/__init__.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a911758cfe75c74fcdeacb715ac496e575587120b039f563819890efabfbccd"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/OutputFieldHandle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4632a8570b36754ef5969df4a12d50a8fb889dc3ff265345160c450f7180a4f"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/PromptTriggerSelect.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c823304bbe85041477d9fdb35291716fa77c55320e99ecae802fcf91d351db8e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldHandle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6d026aefdc33989079c0754e38910e0e72e49b11b750a56137759ef0a0d54c3"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c54c75002b33b07a805b30da73c450907e81aba5145dbfbae0f41008b1659c73"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5411810e6af70685fe1c0038f5a621871e0807fedca6c1f4abf2223aab856f2"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/textual_inversion.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a978b39c121c7b6b337e1e50cca7247ed36c4b8a7bd048a6d6e68c9d4085808"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/controlnet.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e24bc3f60b931059afbb046c796d8fca275d19ce505b9b8b97a1b28b337c29d0"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/util/lora_metadata_extractor.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0a8725fa2802910b6cf66b5a00e2929a4cee2dd1a32c6d80887c1841194b2fe"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusion/regional_prompt_data.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"92b80951853b8aaaa856fdb9fda8a6a564681158da6082815df901696feee341"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useExportCanvasToPSD.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"710a6b9b1da1a3aa651503f81a57b4caeb7ca4d639ea908e48d9a5a929e2a300"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/pbr_maps/pbr_maps.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"de8774de3e4137d4c2e2e1467cf4f9fdfd66e3d2d9ae2c26e627ae8a993c43be"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringGeneratorFieldComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f72cffbed64df91724a0ad3e4f99fb71d66e06e5d97549f7852a9c465b2381d5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/extensions/xlabs_controlnet_extension.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aabe1736a84cb2f7c0b45c4f960a4c8784f7c5148b06092cbc3c4e7e15759b76"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/hooks/useSubMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa04e196a5c9caf65aad9810bb8c92bf3dc4c342b62c943c76ba480e1ab8d938"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/wan_latents_to_image.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0c78a09e39d12e8010bcaabc4946c16c64c1840295f5d61caa6abaa9c50735f"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetListItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6e93acf969b416e61f091cba210609193a6341b85265783d438c6a9d08ff80c"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CompareToolbar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6535c5cdf5a78a8b0c528bca57ad4145feb6130298ad2695b52deac96a5456fb"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementEditMode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f264916dd8e99f225be3c590ac4d738da7a7a13e47b50b1792124d216d27cbe2"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/WorkflowBuilder.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6414ab1bf7c0e97a2378a87ddfab0e83d74d5f4e9f4d264630a3db37e96f368"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/spandrel_image_to_image_model.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"903185dda319d7b0d40c627106403f81017d127232ab102e46714484e4e94317"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/session_processor/session_processor_base.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d29b73a99d98865e545003266b33c7a3ec2349b837b84c45c0fa199ed678dd9"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringFieldCollectionInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c4d357b0a8a2e3dbaf5f4a0a83f5c6a2d02d0a3d62eea8a6a8c028547cfdd85"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/workflowLibrarySlice.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"06aabb3438848845c7ec12dc6c2e2afee70f4d243906bb4f455e0ab609b9c36e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b221f085d7a6b78b78b3f9d6c09d9ccea173d78fe8d7698289043e039354c787"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/addArchivedOrDeletedBoardListener.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"46a0314dee44a1682cae16d9e9340c35e5169f860d201fca344837f26f14113e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasPasteModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"80b69e6af4060d89c42b9f020ec1052be93854edde61a77325e1197b96a129eb"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/cogview4_text_encoder.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"384166912d21cf05a22a7f8ed0a2db0c8be09cccdaf2d274a35762db679a5c1c"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/util/simplify.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"99b31bc4ebb5eb8f0a561ef16f018ed6318a264ffabeeb00bf1194654c51330a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/external_api.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e6e67633bdf9ef6616b6250dccfad564bfcc849240196661cdf784fe2e5d50b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"379aecef129ab4630423067e601f8b1c0b273ba04622464f370b8a5fe7e1a72b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldEditModeNodes.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f91efff9e4480e1659e97753daa7554c0c47dc2155869bb9c4e2fb6f4314fc7"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositionGuideModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"428721140e2fe15c017d03d1e4cb1304cd3b5cd090d844745b1c788aa1dad1ea"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/onnx_validate.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f146c8d81b68b46e29596cbbe5e33dcadfc37d3721c6a0f0989e36273f434e0"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/FormElementEditModeHeader.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a21cb8c9f73edf2b3c4b3e05d18f9118557b99dcdca70f48429c37171853fa4a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/text_encoder/wan_text_encoder.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"93810d7c20d03b769fcd36a9f7855dd2ff64d2696fbddbc3efcd88cfa560b9e5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"33f4f575fec06e7e28b950831bf0dca54c63f1b111dba8f553321bd88c087ed5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/blend_latents.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"de809ab1f783706d80be65a126384b53913771b67ac61c26a90e19251c71d0c4"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/LaunchpadForm/LaunchpadForm.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2111d2ad57a4dee828fdd553f8b5816cf40de10b68a88293d57724ce31964b3"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/basicsr/rrdbnet_arch.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c83bb64e043c9290c5b17b6bb088b0e07fad26ee5d294d1180e5614c8bfde2a1"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenuNewLayerFromImage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e579eb708b0fb17eddfb9b9a62bb3ff3daefcf261bef42c5e42839892b150642"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/invocation_cache/invocation_cache_memory.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"09ec9c74a17f4f00a3c80d74f58474d5cec52645afab945e03283497838f5e7a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/boards.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca2060bf35b826bc96d20fbd0436775cc66dbab26dfa358c87fa818f2d26bbb5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b4c099e349dd43128aae31cf73b1ce9e55a73f037fe61e084fdbdc7f4f808cd"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6bdd57d864a9953169390b3cfd0cc26e0c87a96dc54a78b100bdc4b9ccdb34b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/selectors.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd6338322e2708718ed038f9485d3909f09441fb1c467d82bc7ada5f4b083ebf"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8132de0f1d994dcf5cfba62bbe1499f198257d96a4751a14958edcdb84aa103a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/wan_image_to_latents.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"71c9162f8274260aaaa0364cff328d268c473e3df3b2e636268d1ddd4ca9ea35"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/sdxl.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7330261abde701cb6ee487931f5b027507c8e477e0a6f9f1494821de99dc6782"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/grounding_dino.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"893a8beee1f20e7939b10610735425d8e9368e1fd97903d826be3865792ed67a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/boardAndImagesDeleted.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"40d53233a556cfc6ca50f79633ecaee7f3cbb4d81830108726995c14bfdd4207"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/get_external_contributions.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f597d2d1eb2b6829f89510e011af36aceefd752bf7a0eb00f532e6aa8a2f165"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonHover.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9cf799af795a0a97414f2463231217e72f3aea3b812050a4542a0290aa7b79d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/geffnet/activations/activations_me.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"94f11262d6f87b9b471b530a01e1efb2c1dfc000488119e0d53b1475517f9400"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsSelectedEntityStatus.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"506a1644be23b12b33abda7a1872b8d7ad93e90ee7600521a7f77a7ad98484e2"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/scripts/quantize_t5_xxl_bnb_llm_int8.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff9ba73bced9498e3caa11a6cfcd189892b43864043e729d10d5ab1c604f087b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/components/InformationalPopover/InformationalPopover.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"13082e0cfd33d1d3a97e0d0ccd02968178580e9a5439b22ede5b401194088c8a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/stylePresets.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0fb4af774a8ead303c99f000defb0b0b65e3e022b4aa3fe7cab38753b45ca5e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"51612f9d439c20b50fa3e6b8bd10e0b568c4062749aff216818e6ac7d3982020"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/dw_openpose/onnxdet.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d0625cde8b07f5c0ed9a9bdb93129202c9561e112a17a08924db955fb7b4e81"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/workflow/migrations.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2603a6eddcaa8e84563b0b90ddde41d12f4d0206a101d66e27b9ac4e85883715"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorFieldComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b60ebc4b368eebb02eb6cef87e7ba7ce55285696d4c88487650ca66634d5096e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/layers/lokr_layer.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9144a03975deb722e5a9d6556eecdd73d6df7637e3014cb39bb0ef2068d0ce2d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_22.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a16bad5588dee947ea14fc879a236666fe1f0c08942980a98b2c62786dbc923"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderResults.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec5e9fcbc9c198bf18c3bc730558814d236d14af49f2ec2507df6f061bddd1a3"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/infill_methods/tile.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a37d5f232c96ed4df65f5b217b740aac0f11c87ac98e77bf5c2f9cdf428b2076"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsArrange.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"842b14961bd64bd0f34ee6d75e8ad76f8cd0d9cba807e67998ef63db8b3b5329"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/toast/toast.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"26dc57a12cfe61c8078039b53b35ebe8dc1a448829718204d6703f13f136e781"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux/flux_controlnet.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac1fac9c60146a47524ca8006c97f758f412b36174ea920eeb9e0d8f34650c4a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/WorkflowsLaunchpadPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e3af31637329f92465efc149dc9a3675370b601dc208983cbf5b84394acb51d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueActionsMenuButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd4006024004e7d7788881c60e6b573fe970eaf385528d07104863365133a97e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/imageUploaded.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0426cecacb9eaba0db124c3ba068412d3db6859dfdbe7d468df6522f06ec7a45"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/pngwriter.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"475c3ce3cdae8c7149b4a4cfb34ab9a0162ef2b9c55e3733e4acf5fae5627ce9"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0089dfe574ebefc2f82b81f0db46c97ddab61c9549ea3bad75c4effff906d82"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/SingleSelectionMenuItems.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"be4497d167e37fbc2aff78d7934175b9b934f8577520da29d549f9d5ce954175"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObject.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"936a4f266aa62d26b3775e25c22e73e7941bd3f5c80d58af284a948dd567e14d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/krea2/krea2_seed_variance.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"db7c47f375ca3b59ae969603220fa5f35a893afe8688c62f54489047b57261f5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/minimax_h3/minimax_h3_frame_conditioning.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"477588b9d6a73db939cfe110512f84252a03a737bd9ae83f6c23f73a84d26521"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"68b3f799560b5e36e5176d528d9014892241567f98a39af95049aedc3be50032"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useNextPrevEntity.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"602d1dc78f7d1874a94ceb796e315a8bfc186e9f599dec4466fdc37057f2291e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/geffnet/activations/__init__.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3af0342e188d9c31a82396d82138f38cf77d9d7e741616a8839cae322fb872a5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c88691f23a7600aa2eb7bd8c0f79fe4d5e315a42046c8c64883d7d9be4ad1bee"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/anima/anima_transformer_patch.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"057789cf1d79a91e84448f1b586f8969f1fc431ed0319c22b598b4280e4e9f1f"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"55fba9fd9b81cbdb4b4c5c1153e11995309a358b82e18d7db801788367942a3c"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetForm/StylePresetForm.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc497c9cb08eb420a80ddf1ab1a6d9aec6d4144302eec66b8435e6d6821180c9"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/invocation_stats/invocation_stats_base.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a1baf76945a709b41a165cce6147de01685b224b5cbffdb3541ef289f14c798"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/qwen_image/qwen_image_lora_loader.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"403104527ae298f0c2b3c3b999167d264b74734183d32104edbbeead4a9dc8c9"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/dw_openpose/utils.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1689c3a6670747bbcde6df1b684f9e5c2025698d7bbb47df19ca8dda29ff2a5a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowFromGraphModal/LoadWorkflowFromGraphModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f13eb75dbb076393c687e61daf3b4efec26b84aa8b1017e7a77405dba979726"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorImagesFromBoardSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fae87344e298f50ed8ceb77a0688fd2e8de9a66def9ccf599334aae3cc70dad5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/sd/t2i_adapter.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"42279c1c23e1e6748f437d2fee912b0207c35960203d37901763fafca13f0442"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/anima/anima_lllite.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2f2cc43db5b5ad28658e27232b1c4f7cc9d06a6f4449c68356029bd5c2e96f6"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"528ccf6eab4c6c0a7f7761286dd1cffadb083b7e5d3ce231f172e40f94781fd9"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/CurrentImage/CurrentImageNode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5795a8f5d1f36b5e6999c455e3b1054763a0047d992cfd20f1209eb359e4548e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b227edbfdf843ab067c261970dff466c596bc412efdecb14feb87e903ccc2c1"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/edges/InvocationDefaultEdge.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"654d2aebbce0845cb556b26d98349bb2f067252008c974353aca4dd5f4bc5fdb"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/scripts/load_flux_model_bnb_nf4.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb9bc28280759a4762f5af73562e0ad2617609417c048a548184f819f092ae2d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/ideogram4/ideogram4_caption.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa17ff84ce2c7824ba3640a1acc72592a405e9303a7cf1016b2c6938f2d5877d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/ip_adapter/ip_double_stream_block_processor.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"909e67af16923c8a41b2cfbba5dcff137c53608fbac276c3c85bf20299658d4d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_7.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a455559e35ef46c58de0bc21f13374cfb9ff27f306e7adc632f28f60350a6ac"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/BoardFieldInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"135cc5a391ff5a9879c360a7c4b49a16b0f30d709731ba5f145a1c595f09d891"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"76e228709a352d64ddfa6aa94c75e3ec2baca61bdabdec37455a8a0edca166b3"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/store/uiSlice.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"df0b63946cb8d135f7569008316c73d5afd316f28360c17afbb660ab3ad814be"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ParamDenoisingStrength.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"607fe7d60ff359a5808351b8e6aaa1b97e6115e236eff9424ad84b7c2d6cf392"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityHeaderWarnings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"84c7ebce25fdd32c69cf64a1687cb946dec7383430bace37a9ad385fcd3aa513"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/ActiveStylePreset.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"75abfb6aaf6d2b66926d5bddb9925afa6030656245bcf82cb8065a4832388db8"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettingsEmptyState.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a74bcce78afb016f0d9e2d2ffc133c551b94dc54a601ca48907013115567dd1"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/layers/lora_layer.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"399e7b0a70c7af569e288b8519f904b44015f5fcd597361d99c4c2a995bb2ce6"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementViewMode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"39c7518b7f1b1fc1741f97dbe2bca5ae5aa78762114b04d144d7d06cbd964a3d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/layers/lora_layer_base.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4737d65501a6d98c32e88f03bd791f9c600ce3c7356f1a708773dc84603afa06"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Transform/Transform.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"49490b0e908e6be2c3c523f02845374c0a273afa05e3604947bc2f0bdbd59fda"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2891bf991611049623e07804e73f41d42afdfb44d4b889e27fc9d1daa508e3bd"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/patterns/transparency-checkerboard-pattern.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dd635fb56c2e9756075ba8b5e08eeadbf4ba030c094f3666d8cc7e2d0ab481e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageHeader.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"be62aa85d1d16e4c456e88242a575527281d7c320205b1aad48d1a10c3bcb014"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/lora_conversions/flux_control_lora_utils.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2bc49ea7e63bfb5ee570c6ff011f867b51df7093d0a4b9a271a5ecc85b9552c"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/resize_latents.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a8607598161c8f4110af34e4dd13ce69916b94d42acb729162222712b8ca951"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSDXLRefiner.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d99f10c526ae6b9a284ba76baad40b2cf8d66503b4d969bcf703b9f39d8e2851"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/hooks/useGroupedModelCombobox.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"23ca32282b5c7d1e553d513715481d25606b4b335b767490f5fdd1c5f1977bb5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAddEntityButtons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"19e050f57f5033a99e76108b1948d169141334a5a3bbc251e542176e8052cd1a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useInvertMask.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"27e87b75a06ee0d247ca4ff036c9a4149c7fee29b64f1431acc91b54bd2b0b2f"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"68847f588223e7978df784d954da920ddaf513b7a1df15e2bf8d71bc003ea60b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dynamicPrompts/store/dynamicPromptsSlice.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9758a775c912e374c02fb86127b79589293299a73849bdd43e33520c21dd9beb"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c00e0c2317b183f888d6fa0d572b4717a9beedb7570e0701a398d6d58cb13b3"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"db6e3aa9ff15fc36d18de417962ea114c27a7e3c4e28cecf38b9eddb3d8944ca"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/minimax_h3/minimax_h3_ideal_dimensions.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6046903ceaaa760a3a47cc330c2428bc2828081639bfaf04f1d501c10f53905"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterSpandrel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"00d7f7ead1001f4771809b6e474017ca6406dfffaca9a8d6a46a225184b85f75"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRegionalGuidance.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b155ac29239b3bfae5fc9cf6ac663247b08422443d716d63f930ad2a55c8fd6"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useCreateNewWorkflow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7d4c5c654948a997603a324ec96b3109ecb7d85495e95873f27acb7ec7789db"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/worker.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9003a099d7a0c96bd7564e9979f93928038773043f1aed785a0d12a14153e092"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/components/GlobalImageHotkeys.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f98b43317a7b43105407864cfd8ee90b7a9a26de922aab2d62de075d1da0dea"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/scripts/load_flux_model_bnb_llm_int8.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5002a1b566f2d583be3fed067040f5eda9e8786638f2ab418d50f6983d361baf"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"54424b96ad72c5239070686d1e507c6742191034ab0b5a514f9e1760ab70221e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HFToken.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e4b21a72d4dd626e9fc3993a2f75d39898c6a699df27fd06aaa71bd6d96aeb5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterControlLayer.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb90d3daf70c08e064b0abe51f7beb3ba4072ca62aba818d9d5b2d549ee09fa3"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/TriggerPhrases.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5caddb51f3dab9ef2bd4206923bacfe9a186de0d162f53b41a563698152eca63"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/krea2/krea2_conditioning_rebalance.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"25761583b2377c7ccca9a85d256c30962f171498f392a5bbd54969abe8c0c8a8"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/segment_anything/segment_anything_pipeline.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"da08b89bd0b418d39684444187fd288b2946256f741a11d3257daf929e8aca4b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/components/ColorPicker/RgbColorPicker.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"66dca6a2d1b5f9a4487f1cdf2022991ec2d31934f6fb59105c3c45b5afc7330b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/copyHooks.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a951ab91acabce0c388d4ef7522514936825f2da02ecf58aa42eb3102e3e252f"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/store/stylePresetSlice.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"08feb417b0d1c022540f9b47d8d976f0492466cd1c023eb4231c9c9c3150dbb3"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5416d7020d6bd74314c0787476ed472a0de562e6756e2a21d4a8595632beb70"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparison.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b973511e18b06003ed6a3a1040a923306c87a3318a8cd799183007c17854bba"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/extensions/xlabs_ip_adapter_extension.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdcd811a98b31ce6669023e65c30c30fd6db56ee97ece9b3858986cb254fc1b5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/workflow_thumbnails/workflow_thumbnails_disk.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2eae45f2c06f632f069a7944c8d2397127b7aa4e7e8be7953fdba480bc1b33d3"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/EmptyState.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ebd5d74f32313f060ba22d31b1743b565d919e09e6a85a54acb9264392d4e87"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterInpaintMask.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbb7112d9f3f3ba0771e9a52b4db5df874a6e127cf33ce9137877dd86482f873"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileControlNetModel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"88a6b20abfcf5a1c04125197cfcc637019efdef622dc336ef22844b4713f323e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/PinnedFillColorPickerOverlay.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"25cfb1990aa1743da1263bc1b74cb65fbcd2e0d1d2a4b5e095a9da1e0e2be13b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/util/validateConnectionTypes.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ac5ffc1d3df13a4004e68add956177935483430ca399a19a94f284765eeb88e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/util/result.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0ef9587690329c67797b7c9cd1771e6028465ccab400f308916c9e7c6a5ea65"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"108d918306b49a3f6bc16f3a708e8f33a462122c604d1f7bed5bc0055b64cf58"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/pbr_maps/utils/image_ops.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b80eef3987e3bb2b322290d704d712a398d4d584c007fe4dc90d22d4f0344a6"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/hooks/useBoolean.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2052f4668287653d64430fe04a66b49a99948a4796d1db7c57fd83983913c0fa"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/DndListDropIndicator.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8719fb49275ad8e97e78fba432479085d05f869319192107e09c2f31e50bc02d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/AboutModal/AboutModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"41024c5532227025509927a719df1b53bc288fa0ae53255a4caf9f150f3db544"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildLinearBatchConfig.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f08e4061bcd15e3b1b204bceda41bc50e24453fddff913bd07fd3f066ac51ab"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/single_file_config_files.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d2c2da238177e8e8b60323c24fbbb66253116d68e1264f1b3984743a5b795f4"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorUniformRandomDistributionSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b190d07777506e474ed9ce1781850b772fb6969773e5f223bb0b4c28f58784e7"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/PostProcessingPopover.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd8dced45e5f68d42876ac32b570bf25ca3e5909bbf84764af3424b2501a51b4"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3899185d75186c9cd0892623bb936e9df68126c44412cd5dece3ecc9c3728a05"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasMoveToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb7f72cf81d9acd7139fadeb85f22018370fe435fd9e98988c822c047bc48a98"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/geffnet/config.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0e0fd1eee95ee113cee6aa29c9e251e9e157f8e578e5b02c09280225ec6f9a5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"acc1c6dc92ae79407b34c37bebef317caa9af99ad31889822bb9694417f13364"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/VideoMetadataViewer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b342ea80e0e746b28774fcae3ffd371fe299ae17d99cb4467318a649d077cb2"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/useFloatField.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"467ebf7ad55cfc1704945cc49fa9cb1e30cb94d2d077212462890169adab875f"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectBrushLine.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"90af9ba2b11fab9e24d12e208376cc22b18ab20144dfdd21b25f8bd2381a5e01"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/socketConnected.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ecc1e29793e4011ffe377c88bb8ff1f52eef2b42437089d446a1e32aa435448"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/layers/loha_layer.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"410d01da7578c2ebf8939fa41eae61f26c8fdcf9b27c77b1efd9eaf6e259973e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/use-collapsible-gridview-panel.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"082e5163a4d0b6a6bcb735b478d90fa5448efed0345bfa421b6b539f59466ac9"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/hooks/usePersistedTextareaSize.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"36f528985616799e2abd48348fbe818a5b61c7bf64fde6d6ac8e8023d3cd3f79"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"402b65d1cf338edb265e62e738bc232581426bd362256b08c3077d6d1750f8b1"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/QueueItemPreviewMini.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0dead0c3bf701410ab81c39b81cc2fcdba9a6ca5d39d9115b89a40de1f49b6e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorUniformRandomDistributionSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"173815f34fba2710d129bcf2528388e7a54f34eee99b36ea5a781a8f6e5688bf"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/DndImage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"71fdfc67d32c3f2deab8860a4dce9c0abe09aa6f58011bf4663e123b542e055c"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1799d456ca3f820f96c7048453133cb8cac95bb37462b8fb5782fa48e5eca463"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e513217a5484401392660b942dbfe9297b23e89229ff2ce338c95d36b0e20371"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/openapi.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"10049a3db92eb956e6606be2f84671b69752b5e068c371a3432028566783c2c5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dynamicPrompts/hooks/useDynamicPromptsWatcher.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"02c2fa6ce1ee61b2fca82ee66022bcf1f72efc02a373bb8ca4bcc58914bf71e6"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXRedux.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d20797963f4b9b154891d7c0402e6c76be3a1a19fc2a7cd182f913e863703bec"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/scripts/clean_translations.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"86a0077435af7e784cc5be0e7838f79bf46d663c0eb4e02aa3d749165b99ad5e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeExecutionState.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"480cb28524aaf0accc95f1dadfbf34db201d6c51926bff910a13093a947fa996"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceResults.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e659fbd4b0c71eedfd2a69e1a83251f619664e653082f0d5a64215b7a7f37c5a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/pbr_maps.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a162d36e8e7d58589a9452c4892c79b389f0a9b60e911e71c3e4508cb5386b1"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/useIntegerField.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"158921a67fddf297ad93a5ea09f5027cbf1261755d9d1b11323abdb7c5770c95"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectEraserLineWithPressure.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"16e5007a8a661f3c9479800712296d4f5bfb2ded73d78cef81a1bcd8039f3c2b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldNamesByStatus.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"204c4e83c96b15c72a96a6a12a4f7377b471868717288c87978a51f10dc4feaa"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/DefaultPreprocessor.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a87578e1b7eb74c0d01eb6bc001b010c96b4f395819c3babe3e55a2bf550d5a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"77f6baf0bb4ca2630f0398479f2c86200193fb325a473dbb9df383963439e1db"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasContextMenu/CanvasContextMenuSelectedEntityMenuItems.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"de56b95da4657a5b68b3fb9b282521e4e5a4b073fabe322a9faf38a7617a4edf"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFill.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c133d49fd88820efe8dcdd00f492a5879945d4989b6aae2b20b89b28e17dd0c2"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/images/images_common.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f728ba03b82de18473aa707db51b444af8143e3894315f8584e5b93c1aa33afa"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/edges/InvocationCollapsedEdge.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dac29ae6e897a8ffdbe75fb276745349d5ed2147993b9c38b2dd702d24c8150e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelConvertButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f738e9b294bb3123faef54a417b7411929bb21d54e67a2f5ad02bdc4b6d2b9c0"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsListSortControls.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c8016895e10e83722e03431c9dc9149cdf9d2148ce2a9f1558c92a68b498abd"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetForm/StylePresetModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"11b3bc157662a4118bf9cf2b070aece97c24c8da5ed2b13ec5d711219632f3f7"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/NonInvocationNodeWrapper.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa9aeb928a7aa2f5338ba24b79a4e5a6910cc31ce84b19fbdf38788123fc91e4"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/__init__.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"68147a056a0c9f7be99ed7926af253719b157c83334ff3c149751e2dc0f50ced"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/AppContent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc84c3cbfdfa7a9fc877dfe373efb2cf6991a4e9ed31542160712a527952f0ab"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useSaveLibraryWorkflow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"211cc7bf455d555d80c314df6a36b27f4925b4f82e2d21cfe66f5f17288401a1"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/llava_onevision_vllm.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef98cbbf2130c822bc037713ff27f3fe1f33676c5aadea9bad605fda6e8023cf"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/baseline.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"130b89aaa6218e5195298fa7798d7a6572778c6e0dfed9e99bbd5c47782ab08a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dynamicPrompts/components/ParamDynamicPromptsPreview.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad218c237261a7f5f2252cfd6b0b3e62c95ffc3d3952a33be5f88061120fc7e5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowThumbnail/WorkflowThumbnailField.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"82c1c5b79a50b32dfe2488fa9e2234ca652fa3727a0b81743cb644ecb2247b1c"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorDetailsTab.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"16185a43cc533b4ba14de181649e127089b57a2035d65d5b2880de261a12af8a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectEraserLine.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"12c9e8a5f902181cc6154c34540131e08e2954b3fd3f12e9da120307d4db9eee"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldGate.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d456d2b8ee96f7e5ce6b40053bb4008d3c24a2799d999db2255b421b74542fc5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/InvocationNodeTitle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"906a2ccaa5517eed9ecf60e1d9cece2b9140b97e12c47c21df193e6b9c72950c"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b03453da49df4686e5f9b486398a0aa3ab1003ca919ed51c037949a3cf2d1e42"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/onnx_optimize.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"47f31e2c47cf121faeb9d0c668c280e8115043bbb83d42636cd6dd56398249bf"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/useCanvasEntityListDnd.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"65945ab164b25fd3b07f3f5d8431957f589b698d44aa532324c1a525c1d88369"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/InstallModelForm.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ebc9cb52fe8c5e15d5c0a75a4ca13246307fb4c12ebb6fbcc902d6e6fbc9db9"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/IsolatedWorkflowBuilderWatcher.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7735c149199d59876d781b1dafb96a04a03365a9335b9085bf89edd1db8cf5a0"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsConvertToSubMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"df18a51a753c9ab86874fa04a5f0e0a2f0bf20200e6bee7db56b6b4fd6a5d864"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowSortControl.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c930e3f82095e3d4c322cff244d987644c726a70de5917808960e9bd59022807"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/scrollIntoView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"954f610f91edceefdad3954f8e3cc8a983c16525baf19fd6b9b387f6e5b16192"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addIPAdapters.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e204287ed486f567853c4f910063beb6a5d8ff194932e7c62c149aefe0dbdacf"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb0429d6b0c207fcca1d8fb1c461215f1570ca3cff5f2debbd7086629482cad2"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarSaveSelectedToGalleryButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a7b057f8f25add8d35cdcb1306bb3f4fd6be6cb94abb7d3d3876953e6674f4a"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/anima/conditioning_data.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"966b8a4ff05944679fd2c6696b90834ba6bab500feac8bcdfc08151e49ad75ec"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/load_custom_nodes.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"429d36590b3e648fefb2c615ce83a6fa7f61c158c3bb50bb2a50091513387804"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Notes/NotesNode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f6d73f7047bdd78d7be42391a794400301808f34d065ce9f31be904dad1aea0"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/edges/util/buildEdgeSelectors.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"baeafdcaa4b71df7e9f6762f0237c76ddf37e150381564412430c59385e164e1"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/tabs/ResizeHandle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e46c3527ccc7de7a7b6445399029ce95e5c4d4904c7f3ee45c8deb4744b0f56"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVae.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"578ad96c3c2040940f42d763715599bc67a62b31e23d07acb4a196dfddab5492"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceForm.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"15fc3b412ff745973d1adeb81b564a6891f05bf5b441bcf325f7b28f722819bc"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsCopyToSubMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"547db94a1636d073a8a858dc404aa7cdfc6f89febf12d828234be7c8e919cab5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/NoBoardBoardContextMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f404f56a141ea4e61b83a890ec9606eb473ac651afe25238f6ba7676b059301"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/geffnet/helpers.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f31e0870961385f6bbd284a95b516ceb61717d43fba6a65a4a2ace873ed89826"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/util/getScaledBoundingBoxDimensions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8071c38d53e29314b373a68a51032209010a4f321929e56e09292fa165d4dd6"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/UpdateNodesButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a0b3a4bc014b94a87979386bf4e5e6cbb372a4af3a69d7b035d173eac297af2"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelIdentifierFieldInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d463378e13df232c71a9cca0ef14cd5f74351cec9daefeeaf9bebe95d2027ba"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelImageSizeSelect.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"99af39437200be12e021607c9720febde2b3c1349584c1f316158cf3083452a8"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/flux/ip_adapter/xlabs_ip_adapter_flux.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"46521ef5350ae069fb43f2be983519777186e7dd04bae4c2c052c33a63fa0bbb"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/common.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"302598258ca75ec014ebdcd564aee631f144ee9c8a69fc0b36729a1c61649077"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/t2i_adapter.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"47c1068d98ed56053dcfaf991c94c9be911fca9506f4cc38ce41eb0aab4e0c5b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ColorFieldInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"335a497582cabc1f4825d736c162e22e11b02907b0a2f732671563987b97c3e0"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/IPAdapterMethod.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e088a1eaf3ce3121809efbb3c9cf2a9b02fb9d76dd09c457b2fe8f25e49dacc8"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListGlobalActionBarAddLayerMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce86eff4d89bac4d770666568684178324eba0199fb48cf5b7807c34ef0d9fc5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageModel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1fa5531cfec4b2cf5cb92aaed84c694d00b8571e6e1e32b46f29ac3b26ba9df"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSideBySide.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"82a65681679c69e125a7423c29d2660ffd9c4e8745a63c79f03444001f93f2b9"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/ernie_image_vae_decode.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"668cbfc3ddfa03092b83b176a8de909bf014ac7e1cdcc932e1a9bf92cb126a77"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterModel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f29e0c334d4712ed7fceac64b695e2a3d8e47ab95e9bdb89fc2de706080fa780"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4edb641e68802bcab19f093b5b3fac7c368f98c82c89f7d9b21f0dad86a0597f"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/hubconf.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e1c981ca151e110d6e7347d0cdb8f847f496fe2c88e2b4850e98cf785e80efa"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/useDndMonitor.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b700e3df8c5cd36a8fbb397c2e5016838dd012ad20930aff8427c006054c3c4"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/image_panels.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c68855d0dc445ce7f22a3d70b9361b8bfceb864599f57f47236f7d90082ae0a7"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringGeneratorDynamicPromptsRandomSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"769b6f729ef388f3a202a07268f4092d9305d5d275f6816e2ba40c2fd648c638"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/crop_latents.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"58de3c7527d2393f1bb53dc7e23cd2295ffd0227c6dd55d6daa890dd2389564b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/VideosModal/VideosModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e37e436cd985b4eec76d3d7b9da23397f591b158287a7912401993e2bc8e99ca"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardEditableTitle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a04d148f58a5b3e4dc6014b3876b8a2bb220971c797528b402fc0e54f08686a2"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsConvertToSubMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd177e4e0155300b3ba030450c64ce42fd674c6dda7bca48e27037508aaf81dd"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/geffnet/activations/activations.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b48096853eba60689e3a2b83d6e4459285c58043d534cc4bd1d90152961d7b9"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/components/AppErrorBoundaryFallback.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8ff70508062a2814a20418341cfdd332a83596f7a77cbdd1c89bfa773feed17"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorOutputsTab.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff08101b4e3ee8a334acd16de36696311d6d32e06ddc1a7dae1eee8be9e80429"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/layers/merged_layer_patch.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"13c662f671e4ec6ec2ab3ea30655ce4507c7132d67a01e01c334f168ce87efeb"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultWidth.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"961206be3984cae338845ef645f2cd1cd5eb3a982abfea66fc9dbf42e7c2b636"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/allocate_vram.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ce4be9e1c66acb47ab364b00e4c968a5f94fae9f25eb64fbfc6012879586a0f"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSDXLLoRAs.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bc1f09a143cbe78518bb29ea83944bdbd7a8ba1005dc5b7e67d6522ac6b550f"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GallerySelectionCountTag.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a589238864a794bb1fd7858f54e693f44ae688e4513a6238d00dce3380eda24"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4cb9263edb6750f1f18ac30b0ff322b59a27fa635f7765489bcf7af8aa533d1"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultHeight.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f163bcd81a6ebc4c2d7e5e8f317a60f198d57feb075613ba4a469938fb749f95"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsCopyToSubMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"97a5044e0465c3ae531d9c8cfcf9b417e3efdc45f622118f78ae8f7e82130f78"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7da320fabe5a5986f0dce58cb66973338134efc8045aae098d344fba54a6589e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgRescaleMultiplier.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"10529028327168928daee68015f5f2bbd113ddfc2c12b2e1c372afaf85acd272"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/pidi/__init__.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c31c8349d90cc302878955442ff22b04ce71fd4842011e10a43d30241394258b"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/bulkDownload.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b75e9d83c30e973e9b4e256ec269e5a4c001cccbd6f87a21cfa92301a6a8783"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/components/OverlayScrollbars/ScrollableContent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc65ad0eba93332fbe2b487dbfe19c7ef7c425662e31697ac687e8494f6fe4d3"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectActionButtons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd6c12d3c64fedb109f946e6f2d376a9ab058c57cdb7f74f464e6329e8c6717f"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/hooks/useModelCombobox.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"247e0321d2f2536b951671c0e04fd98f0eb145945efc06c3160119a691cb3be3"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"15fa2e16051f52d01e50e6e2a4420baeceeb48e9531fcdd1a9f1bf1cee4855f7"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageStateWithCanvasOptions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d35d5e64d093981ea1413a02b040f7c99b097851e04d5dc6319f886b3f44f3f6"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarResetViewButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef202a1eeb620fb26a83ff20a60b8545076a0c8761fbcd00bd7c5b8081d48a7e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"07530bb63d3905437dea22aeeb01ae68bfe8a70e0d69daf445c1772844b60234"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectSaveAsMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"04c80dfb18560619d9230f32f06093af5b46d0167c17b6038f8cf81f5fcf63da"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalReferenceImageModel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5e8de008c3b893990e32e380f199803d5cd1851cf1cac19f353452efb51047e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addAnimaLoRAs.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2bd0a5a40280ec723e6dd7ac02223536a5b17283585dba0f03d2717a5acb722"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/logging/logger.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8c75c73acd0ebfc4ec61666a255f28f6e0aaf104c9426699c0ab708eced3db8"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/batchEnqueued.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4b850c2be9395933e6f514eb3ebeccfb9f411886242a7937b8030e85a45e02d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/GeneratorTextareaWithFileUpload.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e253f6af2b9aa554cfbe8a7f467c5def203f1e30eeb7615a2b14137f4a78b577"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/basicsr/arch_util.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6db57ac6a04feb6d12fa36a9faea17ea7308d454c2142c453f53877f5646636"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaAutoSwitchButtons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"de2e28035ca90940f31d6e052b065c188cea75b5ef99ccb0d0fcf2db8e18ba85"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasWorkerModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"21419f1ba8dea12c4e6431f645517869f66f01d238d7e2b182777835d15b0a32"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetImportButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4ab7ca0438f9b93b5a7c0c1815effa93beae850e72ea184e858924b1b134f68"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardTooltip.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f47ceb8ec05d4384b0a5bc000923c1d2335f1fdbb03c1047e2adf685f73e850"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addLoRAs.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcc4cab3258147bcd5ed51a27e733f2db8b36024572c78fa4860a2615d3b54f0"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultGuidance.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7593f375f7dbe1de95a17f35a18a0f981a7212ec0ef03738065131df9d1f8e32"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"044c47e733e16c95d89ce7459b95ed1af6c259a2d215c22a8a95c3692a8e46a5"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromImage.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f28bd3ab0f29f4217cd62aea8e4876e458f85c13011d84a7e2953ca53594eee"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgScale.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d7ef10712993b4f45a8c61dc3054299586307fad829d43be0e9c958057c4215"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterBundleInstall.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4c73c963db67d6cdbb06ec64c17918014d28b97df728de19d1e9c108d845a2d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Prompts/ViewModePrompt.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"48db50e7be9193a97e336149ed4217eaeb12ed70666c850b98f8d80c11e7d83c"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9a686dc1cb5b9e732555e83ee2cad1043df22e4cbd1af094de7e81e2abe89dd"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityTransform.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5923d7976cf870f5b0257e0df675b30450fb0972ed9a50401156f8cb96653c67"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/components/IAIImageFallback.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b96bae06ed16f07d20f3af301d074ff27a44ab01616e78b6050cc7f7a0130ae2"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/normal_bae/nets/submodules/efficientnet_repo/caffe2_benchmark.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"da46a89634a5347a1631015dd8054c93eaf3e41afdf13b5e881800ff7c1a149d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultSteps.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4645f1fd16fd562aee2d86859ae1b510cceba221b95f7a842e028cf106f0d1f"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItems.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee52f9b1fbde4b0bb62a466693541edb45142c4c54e10f4041ee20768d49cb5c"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/infill_methods/mosaic.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"59969e11d72f291695a7ea6bcd09b13c8f9c2e13e90a4809e61017c5afd72a8b"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: CanvasAddEntityButtons.tsx \u2194 EntityListGlobalActionBarAddLayerMenu.tsx: \u0060invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAddEntityButtons.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListGlobalActionBarAddLayerMenu.tsx\u0060 change together 100% of the time (16 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) 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 16 shared commits counted here, the most recent 3 are \u00602b2f64b2\u0060 refactor(ui): simplify useIsEntityTypeEnabled (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/CanvasAddEntityButtons.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/components/CanvasEntityList/EntityListGlobalActionBarAddLayerMenu.tsx\u0060); \u00608837932b\u0060 create hook for managing entity type enabledness for given base model\u2026 (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/CanvasAddEntityButtons.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/components/CanvasEntityList/EntityListGlobalActionBarAddLayerMenu.tsx\u0060); \u0060c259899b\u0060 feat(ui): support for FLUX Redux in canvas (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/CanvasAddEntityButtons.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/components/CanvasEntityList/EntityListGlobalActionBarAddLayerMenu.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAddEntityButtons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d73579cb8f796617e2397e3e2e30d24691bbfcd3cce6f8a061b47f95737b0b84"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: canvas-tab-auto-layout.tsx \u2192 generate-tab-auto-layout.tsx, upscaling-tab-auto-layout.tsx, workflows-tab-auto-layout.tsx: \u0060invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx\u0060 changes together with 3 other files \u2014 \u0060invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx\u0060, \u0060invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx\u0060, \u0060invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx\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":"invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dffb865e6bc1d9a6533d8f87a77a8309f5dd561856c3628222371fba678f9c47"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: upscaling-tab-auto-layout.tsx \u2194 workflows-tab-auto-layout.tsx: \u0060invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx\u0060 change together 96% of the time (23 of the 24 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 23 shared commits counted here, the most recent 3 are \u00608fec6add\u0060 fix(ui): keep main panel reachable on small screens (#9144) (at that commit the files were still \u0060invokeai/frontend/web/src/features/ui/layouts/upscaling-tab-auto-layout.tsx\u0060 and \u0060invokeai/frontend/web/src/features/ui/layouts/workflows-tab-auto-layout.tsx\u0060); \u00604f3a5dcc\u0060 tidy(ui): remove unused progress related logic and components (at that commit the files were still \u0060invokeai/frontend/web/src/features/ui/layouts/upscaling-tab-auto-layout.tsx\u0060 and \u0060invokeai/frontend/web/src/features/ui/layouts/workflows-tab-auto-layout.tsx\u0060); \u006096ee394f\u0060 refactor(ui): use dockview\u0027s own ser/de for persistence (at that commit the files were still \u0060invokeai/frontend/web/src/features/ui/layouts/upscaling-tab-auto-layout.tsx\u0060 and \u0060invokeai/frontend/web/src/features/ui/layouts/workflows-tab-auto-layout.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc33514bf76e7d1deb193fb46a5388a6b385779556a91836c1a4053ad63286b7"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: generate-tab-auto-layout.tsx \u2194 upscaling-tab-auto-layout.tsx: \u0060invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx\u0060 change together 96% of the time (23 of the 24 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 23 shared commits counted here, the most recent 3 are \u00608fec6add\u0060 fix(ui): keep main panel reachable on small screens (#9144) (at that commit the files were still \u0060invokeai/frontend/web/src/features/ui/layouts/generate-tab-auto-layout.tsx\u0060 and \u0060invokeai/frontend/web/src/features/ui/layouts/upscaling-tab-auto-layout.tsx\u0060); \u00604f3a5dcc\u0060 tidy(ui): remove unused progress related logic and components (at that commit the files were still \u0060invokeai/frontend/web/src/features/ui/layouts/generate-tab-auto-layout.tsx\u0060 and \u0060invokeai/frontend/web/src/features/ui/layouts/upscaling-tab-auto-layout.tsx\u0060); \u006096ee394f\u0060 refactor(ui): use dockview\u0027s own ser/de for persistence (at that commit the files were still \u0060invokeai/frontend/web/src/features/ui/layouts/generate-tab-auto-layout.tsx\u0060 and \u0060invokeai/frontend/web/src/features/ui/layouts/upscaling-tab-auto-layout.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cfa9c54a8f98dcab3830ba1fe1c64cbc0b1e5ab8d65144c0b3e7b035244932a"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: generate-tab-auto-layout.tsx \u2194 workflows-tab-auto-layout.tsx: \u0060invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx\u0060 change together 92% of the time (23 of the 25 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 23 shared commits counted here, the most recent 3 are \u00608fec6add\u0060 fix(ui): keep main panel reachable on small screens (#9144) (at that commit the files were still \u0060invokeai/frontend/web/src/features/ui/layouts/generate-tab-auto-layout.tsx\u0060 and \u0060invokeai/frontend/web/src/features/ui/layouts/workflows-tab-auto-layout.tsx\u0060); \u00604f3a5dcc\u0060 tidy(ui): remove unused progress related logic and components (at that commit the files were still \u0060invokeai/frontend/web/src/features/ui/layouts/generate-tab-auto-layout.tsx\u0060 and \u0060invokeai/frontend/web/src/features/ui/layouts/workflows-tab-auto-layout.tsx\u0060); \u006096ee394f\u0060 refactor(ui): use dockview\u0027s own ser/de for persistence (at that commit the files were still \u0060invokeai/frontend/web/src/features/ui/layouts/generate-tab-auto-layout.tsx\u0060 and \u0060invokeai/frontend/web/src/features/ui/layouts/workflows-tab-auto-layout.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"29c009f44183c4fb2eba3c0b5fc649306d50572faeaad80dd357c0a9602572d0"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: flux_denoise.py \u2192 flux_controlnet.py, tiled_multi_diffusion_denoise_latents.py, instantx_controlnet_flux.py, denoise.py, instantx_controlnet_extension.py, xlabs_controlnet_extension.py, model.py: \u0060invokeai/app/invocations/flux_denoise.py\u0060 changes together with 7 other files \u2014 \u0060invokeai/app/invocations/flux_controlnet.py\u0060, \u0060invokeai/app/invocations/tiled_multi_diffusion_denoise_latents.py\u0060, \u0060invokeai/backend/flux/controlnet/instantx_controlnet_flux.py\u0060, \u0060invokeai/backend/flux/denoise.py\u0060, \u0060invokeai/backend/flux/extensions/instantx_controlnet_extension.py\u0060, \u0060invokeai/backend/flux/extensions/xlabs_controlnet_extension.py\u0060, \u0060invokeai/backend/flux/model.py\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":"invokeai/app/invocations/flux_denoise.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a74bce32a2366cce7a65b44d52021abf033fcd777edcb4231a72acb54d3a84a4"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: engine.ts \u2192 paintTool.ts, operationController.ts, ControlLayerSettings.tsx: \u0060invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts\u0060 changes together with 3 other files \u2014 \u0060invokeai/frontend/webv2/src/workbench/canvas-engine/tools/paintTool.ts\u0060, \u0060invokeai/frontend/webv2/src/workbench/canvas-operations/operationController.ts\u0060, \u0060invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx\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":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fc028590c5f7da8c12493e312f912019bdb7fc155e0efbff9f8c2a30e7447d1"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: tiled_multi_diffusion_denoise_latents.py \u2192 compel.py, denoise_latents.py, flux_text_encoder.py, sd3_text_encoder.py, layer_patcher.py: \u0060invokeai/app/invocations/tiled_multi_diffusion_denoise_latents.py\u0060 changes together with 5 other files \u2014 \u0060invokeai/app/invocations/compel.py\u0060, \u0060invokeai/app/invocations/denoise_latents.py\u0060, \u0060invokeai/app/invocations/flux_text_encoder.py\u0060, \u0060invokeai/app/invocations/sd3_text_encoder.py\u0060, \u0060invokeai/backend/patches/layer_patcher.py\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":"invokeai/app/invocations/tiled_multi_diffusion_denoise_latents.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b3e17db72920e26d7e388ac740cadde5a85e8771a626643634295abd7c99918"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: NegativePromptField.tsx \u2194 PositivePromptField.tsx: \u0060invokeai/frontend/webv2/src/features/generation/ui/promptFields/NegativePromptField.tsx\u0060 and \u0060invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptField.tsx\u0060 change together 83% of the time (10 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 10 shared commits counted here, the most recent 3 are \u00600730324f\u0060 feat(webv2): show feature hints on generate and upscale fields; \u0060d684fc28\u0060 fix: normalize prompt template view state; \u006048fae7fa\u0060 refactor(webv2): share the prompt field and catalog seams \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/NegativePromptField.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b430d998cb670dcf4cb56ae3db6fd734ecc859b819ebfcdbce5e8c78814e376"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: CanvasSettingsPopover.tsx \u2194 canvasSettingsSlice.ts: \u0060invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsPopover.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/controlLayers/store/canvasSettingsSlice.ts\u0060 change together 82% of the time (18 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 18 shared commits counted here, the most recent 3 are \u0060340566c2\u0060 Feat(canvas): add pressure dependent opacity for brush (#9232) (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsPopover.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/store/canvasSettingsSlice.ts\u0060); \u0060daa4fd75\u0060 ToolWidthPicker refactored (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsPopover.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/store/canvasSettingsSlice.ts\u0060); \u00603fd265c3\u0060 slider for brush and eraser tool (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/Settings/CanvasSettingsPopover.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/store/canvasSettingsSlice.ts\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsPopover.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4ad3ceb33d0d8def7a56dbca6c080602fd376ba4f1261bc389a15e2948ea86c"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling clique: flux_vae_decode.py, latents_to_image.py, sd3_latents_to_image.py: 3 files \u2014 \u0060invokeai/app/invocations/flux_vae_decode.py\u0060, \u0060invokeai/app/invocations/latents_to_image.py\u0060, \u0060invokeai/app/invocations/sd3_latents_to_image.py\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":"invokeai/app/invocations/flux_vae_decode.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0d91e9fb4ac7c5562d6e7f2ddede73cb8eab3486bbb87a47cf49b5bb3a61baa"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: SettingsModal.tsx \u2194 types.ts: \u0060invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/system/store/types.ts\u0060 change together 82% of the time (9 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 9 shared commits counted here, the most recent 3 are \u0060eaa42bf6\u0060 Chore: Code cleanup (#8998) (at that commit the files were still \u0060invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsModal.tsx\u0060 and \u0060invokeai/frontend/web/src/features/system/store/types.ts\u0060); \u0060fcdcd7f4\u0060 Prompt Attention Fixes (#8860) (at that commit the files were still \u0060invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsModal.tsx\u0060 and \u0060invokeai/frontend/web/src/features/system/store/types.ts\u0060); \u006002b91e8e\u0060 feat: :sparkles: highlight focused regions (at that commit the files were still \u0060invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsModal.tsx\u0060 and \u0060invokeai/frontend/web/src/features/system/store/types.ts\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"df55e7bee5b979bf5f23d9556912933992f472457d6210271ee802fdca407ab5"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: InputFieldRenderer.tsx \u2192 nodesSlice.ts, buildFieldInputInstance.ts, buildFieldInputTemplate.ts: \u0060invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx\u0060 changes together with 3 other files \u2014 \u0060invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts\u0060, \u0060invokeai/frontend/webv1/src/features/nodes/util/schema/buildFieldInputInstance.ts\u0060, \u0060invokeai/frontend/webv1/src/features/nodes/util/schema/buildFieldInputTemplate.ts\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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7c8a96feab3d40c449d1b74239879c1200f79e12b86709738a2634bdc6dd45b"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: compel.py \u2192 denoise_latents.py, flux_text_encoder.py, sd3_text_encoder.py: \u0060invokeai/app/invocations/compel.py\u0060 changes together with 3 other files \u2014 \u0060invokeai/app/invocations/denoise_latents.py\u0060, \u0060invokeai/app/invocations/flux_text_encoder.py\u0060, \u0060invokeai/app/invocations/sd3_text_encoder.py\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":"invokeai/app/invocations/compel.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"85458e3597400f56610d82ca7b1f08af59beef8d155f9086f567686301044618"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: RefImageSettings.tsx \u2194 RegionalGuidanceIPAdapterSettings.tsx: \u0060invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettings.tsx\u0060 change together 78% of the time (14 of the 18 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 14 shared commits counted here, the most recent 3 are \u0060e0d7a401\u0060 feat(ui): make ref images croppable (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/RefImage/RefImageSettings.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettings.tsx\u0060); \u006056cd839d\u0060 feat(ui): support for ref images for chatgpt on canvas (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/IPAdapter/IPAdapterSettings.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettings.tsx\u0060); \u00605956f96e\u0060 feat(ui): add flux redux image influence to canvas (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/IPAdapter/IPAdapterSettings.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettings.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cd67ea549d16cce604d5096febeed0536adee447578d4052b5c2a365f29cd8b"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: boardIdSelected.ts \u2194 onInvocationComplete.tsx: \u0060invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/boardIdSelected.ts\u0060 and \u0060invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx\u0060 change together 75% of the time (9 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 9 shared commits counted here, the most recent 3 are \u006097844ed6\u0060 refactor(ui): item-owned reveal state machine with explicit selection\u2026 (at that commit the files were still \u0060invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardIdSelected.ts\u0060 and \u0060invokeai/frontend/web/src/services/events/onInvocationComplete.tsx\u0060); \u0060e431d249\u0060 fix(ui): don\u0027t strand the viewer under the progress overlay, for imag\u2026 (at that commit the files were still \u0060invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardIdSelected.ts\u0060 and \u0060invokeai/frontend/web/src/services/events/onInvocationComplete.tsx\u0060); \u0060c09dc8e1\u0060 tidy: removing unused code paths 3 (at that commit the files were still \u0060invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardIdSelected.ts\u0060 and \u0060invokeai/frontend/web/src/services/events/onInvocationComplete.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/boardIdSelected.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e32297e3eb150de91dfdfefa0de9e4e85b3e4df19c817c6a43fd2e46059b7016"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: flux_text_encoder.py \u2194 sd3_text_encoder.py: \u0060invokeai/app/invocations/flux_text_encoder.py\u0060 and \u0060invokeai/app/invocations/sd3_text_encoder.py\u0060 change together 71% of the time (15 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 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 15 shared commits counted here, the most recent 3 are \u006068b90174\u0060 Fix: compute device partial load (#9375); \u006080eb0bb2\u0060 feat - Migrate to Transformers 5.5.4 (#9248); \u006076b08380\u0060 Feature(backend): Add user toggle to run encoder models on CPU (#8777) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux_text_encoder.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"078adfd1ffa7424af3b30a23a17daf25c79dbfe73ef46a31342e105f0f4bc894"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: DividerElementComponent.tsx \u2192 ContainerElement.tsx, WorkflowBuilder.tsx, workflow.ts: \u0060invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/DividerElementComponent.tsx\u0060 changes together with 3 other files \u2014 \u0060invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElement.tsx\u0060, \u0060invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/WorkflowBuilder.tsx\u0060, \u0060invokeai/frontend/webv1/src/features/nodes/types/workflow.ts\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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/DividerElementComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbd7a7f1b3eefa6ad5a668c5d9125761acb062b6465187766f5032dd419646d9"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: InpaintMaskMenuItems.tsx \u2194 RasterLayerMenuItems.tsx: \u0060invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItems.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItems.tsx\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 \u0060bd6ff3de\u0060 feat(ui): add merge down for all entity types (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItems.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItems.tsx\u0060); \u006056222a84\u0060 feat(ui): organize layer context menu items (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItems.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItems.tsx\u0060); \u00607211d1a6\u0060 feat(ui): add context menu options for layer type convert/copy (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItems.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItems.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItems.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8f6b1b2adc6f3366e65d5cf1814d8807c5364d491430405563650b595b7bbe1"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: UpscalingLaunchpadPanel.tsx \u2194 WorkflowsLaunchpadPanel.tsx: \u0060invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/ui/layouts/WorkflowsLaunchpadPanel.tsx\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 \u0060193de6a8\u0060 feat(ui): add launchpad container component (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/UpscalingLaunchpadPanel.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/WorkflowsLaunchpadPanel.tsx\u0060); \u00608b8e29d2\u0060 Fixes \u0026 Styling updates (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/UpscalingLaunchpadPanel.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/WorkflowsLaunchpadPanel.tsx\u0060); \u006046a56191\u0060 Update all text to translations (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/UpscalingLaunchpadPanel.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/WorkflowsLaunchpadPanel.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"898c36c1c8af736f5c4a839cf091b60e83013d9e4e0f7a1403363996a2cde492"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: WorkflowLibrarySideNav.tsx \u2194 WorkflowList.tsx: \u0060invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibrarySideNav.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowList.tsx\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 \u00602be701cf\u0060 Feature: Add Tag System for user made Workflows (#8673) (at that commit the files were still \u0060invokeai/frontend/web/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibrarySideNav.tsx\u0060 and \u0060invokeai/frontend/web/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowList.tsx\u0060); \u006097593f95\u0060 feat(ui): on first load, if the selected library view has no workflow\u2026 (at that commit the files were still \u0060invokeai/frontend/web/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibrarySideNav.tsx\u0060 and \u0060invokeai/frontend/web/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowList.tsx\u0060); \u0060afd894fd\u0060 update recent workflows UI (at that commit the files were still \u0060invokeai/frontend/web/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibrarySideNav.tsx\u0060 and \u0060invokeai/frontend/web/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowList.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibrarySideNav.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"75fcd6d82412a29542de8e701785bb973618bcfb20f071cd48f1d2936f36eecd"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: z_image_denoise.py \u2194 buildZImageGraph.ts: \u0060invokeai/app/invocations/z_image_denoise.py\u0060 and \u0060invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts\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) and are written in DIFFERENT LANGUAGES, so no import can join them and they cannot be co-located into one unit \u2014 they compile and ship as separate artifacts. What binds them is a CONTRACT across that boundary \u2014 an event or message name, a route, a serialised shape \u2014 that each side currently spells out on its own, which is exactly why a change to one drags the other. Declare that contract once where both sides read it (a shared schema, a generated constants file, an interface-definition file) so a change on one side fails the other\u0027s build instead of drifting silently; where the surface is too small to be worth that, name the counterpart in a comment on both sides so the next reader finds it. There is nothing here to merge. You can check this without leaving the row: of the 9 shared commits counted here, the most recent 3 are \u0060a3507121\u0060 feat: add configurable shift parameter for Z-Image (#9004) (at that commit the file was still \u0060invokeai/frontend/web/src/features/nodes/util/graph/generation/buildZImageGraph.ts\u0060); \u0060689953e3\u0060 Feature/zimage scheduler support (#8705) (at that commit the file was still \u0060invokeai/frontend/web/src/features/nodes/util/graph/generation/buildZImageGraph.ts\u0060); \u0060132a4849\u0060 feat(z-image): add scheduler support with metadata recall (at that commit the file was still \u0060invokeai/frontend/web/src/features/nodes/util/graph/generation/buildZImageGraph.ts\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/z_image_denoise.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9b1351927a4a7defa21cd05739042002da2ef390af4632632e5791160f20613"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: videoPolicies.ts \u2194 videoRecall.ts: \u0060invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts\u0060 and \u0060invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts\u0060 change together 67% of the time (10 of the 15 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 \u006097c0adaa\u0060 feat(video): let LTX-2 soundtrack conditioning keep first and last fr\u2026; \u00609c8b2338\u0060 fix: floor guidance and CFG at 1 everywhere; \u0060b37b0091\u0060 fix(webv2): restore LTX-2 dev\u0027s negative prompt when the panel carrie\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7c6cefde59b212af12ecbe75d861df4ca700642fb92ca9de777f3ccdc92e6a9"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: DndImage.tsx \u2194 GalleryImage.tsx: \u0060invokeai/frontend/webv1/src/features/dnd/DndImage.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx\u0060 change together 65% of the time (11 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 \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 11 shared commits counted here, the most recent 3 are \u00604347b43e\u0060 Fix (UI): Extend input draggability fix to all browsers (#9100) (at that commit the files were still \u0060invokeai/frontend/web/src/features/dnd/DndImage.tsx\u0060 and \u0060invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryImage.tsx\u0060); \u0060eaa42bf6\u0060 Chore: Code cleanup (#8998) (at that commit the files were still \u0060invokeai/frontend/web/src/features/dnd/DndImage.tsx\u0060 and \u0060invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryImage.tsx\u0060); \u00603104a1ba\u0060 remove crossOrigin for thumbnail loading (at that commit the files were still \u0060invokeai/frontend/web/src/features/dnd/DndImage.tsx\u0060 and \u0060invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryImage.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/DndImage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a14cc03715a50bd53a12a50de7d25ef450be3817c3a4081c9f8078f668b7e722"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: CanvasLaunchpadPanel.tsx \u2194 GenerateLaunchpadPanel.tsx: \u0060invokeai/frontend/webv1/src/features/ui/layouts/CanvasLaunchpadPanel.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/ui/layouts/GenerateLaunchpadPanel.tsx\u0060 change together 64% of the time (7 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 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 \u0060193de6a8\u0060 feat(ui): add launchpad container component (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/CanvasLaunchpadPanel.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/GenerateLaunchpadPanel.tsx\u0060); \u0060e73150c3\u0060 feat(ui): improved automatic tab/panel switching on user actions (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/CanvasLaunchpadPanel.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/GenerateLaunchpadPanel.tsx\u0060); \u00603f1b2c39\u0060 Model Guide link update (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/CanvasLaunchpadPanel.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/components/SimpleSession/GenerateLaunchpadPanel.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasLaunchpadPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"736e830f1b77f2884240a049b8c7c79a12e4e7f40e10af25c35d4544b3a37074"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: ModelBaseBadge.tsx \u2194 constants.ts: \u0060invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelBaseBadge.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/parameters/types/constants.ts\u0060 change together 60% of the time (12 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 12 shared commits counted here, the most recent 3 are \u006030619c04\u0060 add runway back as a model and allow runway and veo3 to live together\u2026 (at that commit the files were still \u0060invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelBaseBadge.tsx\u0060 and \u0060invokeai/frontend/web/src/features/parameters/types/constants.ts\u0060); \u00606370412e\u0060 tsc (at that commit the files were still \u0060invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelBaseBadge.tsx\u0060 and \u0060invokeai/frontend/web/src/features/parameters/types/constants.ts\u0060); \u0060406e0be3\u0060 Revert \u0022tsc\u0022 (at that commit the files were still \u0060invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelBaseBadge.tsx\u0060 and \u0060invokeai/frontend/web/src/features/parameters/types/constants.ts\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelBaseBadge.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3489fb1371480b5a0d16bd57de19adcddc21e7b7f6b51ea9031b873df708501d"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: use-collapsible-gridview-panel.ts \u2192 GalleryPanel.tsx, canvas-tab-auto-layout.tsx, generate-tab-auto-layout.tsx, upscaling-tab-auto-layout.tsx, workflows-tab-auto-layout.tsx: \u0060invokeai/frontend/webv1/src/features/ui/layouts/use-collapsible-gridview-panel.ts\u0060 changes together with 5 other files \u2014 \u0060invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx\u0060, \u0060invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx\u0060, \u0060invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx\u0060, \u0060invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx\u0060, \u0060invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx\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":"invokeai/frontend/webv1/src/features/ui/layouts/use-collapsible-gridview-panel.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e39ab5cf5d0e0a8c50d74949f5fc8d0399d0cd8311bf95bca1281018a48c9d6a"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: index.ts \u2194 executeVideoRecall.ts: \u0060invokeai/frontend/webv2/src/features/video/index.ts\u0060 and \u0060invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts\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 \u0060f9b5e99a\u0060 feat(video): place a gallery image in the Video panel from the recall\u2026; \u006097c0adaa\u0060 feat(video): let LTX-2 soundtrack conditioning keep first and last fr\u2026; \u0060701b657d\u0060 feat(video-recall): place a video as the LTX-2 conditioning clip \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"987ad2f36f74446070b3b3e88ecfeba08628b7867271d9760b62c26329b4e77d"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: load_default.py \u2194 MainModelDefaultSettings.tsx: \u0060invokeai/backend/model_manager/load/load_default.py\u0060 and \u0060invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx\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) and are written in DIFFERENT LANGUAGES, so no import can join them and they cannot be co-located into one unit \u2014 they compile and ship as separate artifacts. What binds them is a CONTRACT across that boundary \u2014 an event or message name, a route, a serialised shape \u2014 that each side currently spells out on its own, which is exactly why a change to one drags the other. Declare that contract once where both sides read it (a shared schema, a generated constants file, an interface-definition file) so a change on one side fails the other\u0027s build instead of drifting silently; where the surface is too small to be worth that, name the counterpart in a comment on both sides so the next reader finds it. There is nothing here to merge. You can check this without leaving the row: of the 6 shared commits counted here, the most recent 3 are \u00606706a708\u0060 feat(models): enable FP8 storage for FP8 checkpoints at install (at that commit the file was still \u0060invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx\u0060); \u006057c85344\u0060 fix(fp8): never apply FP8 storage to already-quantized weights (#9416) (at that commit the file was still \u0060invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx\u0060); \u0060b06e57e6\u0060 feat(fp8): enable FP8 storage for Z-Image (#9414) (at that commit the file was still \u0060invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/load_default.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3878eb9ac05bade636b151f6a784348cfe43f05b2a573862ff33a4140574ce4"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: queryCache.ts \u2194 useGalleryData.ts: \u0060invokeai/frontend/webv2/src/features/gallery/data/queryCache.ts\u0060 and \u0060invokeai/frontend/webv2/src/features/gallery/ui/useGalleryData.ts\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 \u00602910b2fb\u0060 feat: rank gallery semantic search within the selected board; \u006040e5c29b\u0060 feat(gallery): anchored infinite windows so deep reveals can land; \u006009d0745f\u0060 feat: semantic gallery search over the embedding index \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/data/queryCache.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9c5e6e7c938b826a4de74d4596701fcab5cdcb24332e12e945171ddc65553b7"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: assetTransport.ts \u2194 projectFile.ts: \u0060invokeai/frontend/webv2/src/workbench/projects/invk/assetTransport.ts\u0060 and \u0060invokeai/frontend/webv2/src/workbench/projects/projectFile.ts\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 \u00606a0b0a62\u0060 fix(projects): clear references to deleted boards when a project loads; \u0060ea2210ce\u0060 refactor(projects): share the duplicated transport, walker and quaran\u2026; \u0060b79742cd\u0060 fix(projects): harden media restoration \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/assetTransport.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"83dcb7beb13b71fdf9a8dde3b5a92c15d0cc3866829d82c96a42742cc0407634"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: types.ts \u2192 ModelBaseBadge.tsx, buildFieldInputInstance.ts, DimensionsAspectRatioSelect.tsx: \u0060invokeai/frontend/webv1/src/services/api/types.ts\u0060 changes together with 3 other files \u2014 \u0060invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelBaseBadge.tsx\u0060, \u0060invokeai/frontend/webv1/src/features/nodes/util/schema/buildFieldInputInstance.ts\u0060, \u0060invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx\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":"invokeai/frontend/webv1/src/services/api/types.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbf4da7eb4c46b3566e5aab7b1074e93797bf2b353c02c69eb00949dd31dc1fb"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: common.ts \u2194 DimensionsAspectRatioSelect.tsx: \u0060invokeai/frontend/webv1/src/features/nodes/types/common.ts\u0060 and \u0060invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx\u0060 change together 59% of the time (10 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 \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 \u0060299a4db3\u0060 chore(ui): lint (at that commit the files were still \u0060invokeai/frontend/web/src/features/nodes/types/common.ts\u0060 and \u0060invokeai/frontend/web/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx\u0060); \u006030619c04\u0060 add runway back as a model and allow runway and veo3 to live together\u2026 (at that commit the files were still \u0060invokeai/frontend/web/src/features/nodes/types/common.ts\u0060 and \u0060invokeai/frontend/web/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx\u0060); \u0060e046417c\u0060 replace runway with veo, build out veo3 model support (at that commit the files were still \u0060invokeai/frontend/web/src/features/nodes/types/common.ts\u0060 and \u0060invokeai/frontend/web/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/common.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc14608639eda35bd62613ab018c6799d3245ab187508092f0e928e80a65297d"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: VideoReferenceListField.tsx \u2194 VideoSourceClipField.tsx: \u0060invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx\u0060 and \u0060invokeai/frontend/webv2/src/features/video/ui/VideoSourceClipField.tsx\u0060 change together 57% of the time (8 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 8 shared commits counted here, the most recent 3 are \u006006843a22\u0060 refactor(webv2): move Video sliders to ScrubberField; \u00601a9c6081\u0060 feat(webv2): play a reference clip\u0027s trimmed window in Preview; \u0060280de2c5\u0060 fix(webv2): keep a recorded video_audio reference on recall \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"11d18ebf0c36d6d08d104c10dfe007fa0419922d398bfe3b89981e6d27d422a0"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: submissionApi.ts \u2194 runtime.ts: \u0060invokeai/frontend/webv2/src/features/queue/data/submissionApi.ts\u0060 and \u0060invokeai/frontend/webv2/src/features/queue/runtime.ts\u0060 change together 57% of the time (8 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 \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 8 shared commits counted here, the most recent 3 are \u0060acedb1ec\u0060 fix(webv2): show a finished video in the preview when its run completes; \u00605b83931e\u0060 fix(webv2): keep node-boarded workflow images off the selected board; \u00603446c76e\u0060 fix(webv2): replay pre-seed-mode queue items with the expansion they \u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/data/submissionApi.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"84403f02c9cff2bfb96abd9a5176da043d1ab4454fb5c10bfd2adea2953b2d50"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: flux_lora_loader.py \u2194 model.py: \u0060invokeai/app/invocations/flux_lora_loader.py\u0060 and \u0060invokeai/app/invocations/model.py\u0060 change together 56% of the time (14 of the 25 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, 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 14 shared commits counted here, the most recent 3 are \u006091522321\u0060 feat(nodes): Add a LoRA collection picker node that selects and appli\u2026; \u006058bca1b9\u0060 feat(nodes): use new ui_model_[base|type|variant] on all core nodes; \u00609ca07181\u0060 chore(nodes): remove beta/prototype flag from a lot of stable nodes \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux_lora_loader.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1aba0004c222cf8da28b905884695ef3af0493fb63131b437fb6e4545c2e66b6"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: SelectObject.tsx \u2194 CanvasSegmentAnythingModule.ts: \u0060invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObject.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts\u0060 change together 55% of the time (11 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 11 shared commits counted here, the most recent 3 are \u00600f098861\u0060 feat(ui): spruce up UI a bit (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/SelectObject/SelectObject.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts\u0060); \u0060a0232b0e\u0060 feat(ui): combine points and bbox in visual mode for SAM (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/SelectObject/SelectObject.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts\u0060); \u0060e1e964bf\u0060 experiment(ui): support bboxes in select object (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/SelectObject/SelectObject.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObject.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"637935cd68e6ca968abfe53db6725c3051f1aec0c6a02b1577d88d72c1bc8722"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: GalleryPanel.tsx \u2194 use-gallery-image-names.ts: \u0060invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/gallery/components/use-gallery-image-names.ts\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 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 6 shared commits counted here, the most recent 3 are \u0060b938ae0a\u0060 Revert \u0022feat(ui): consolidated gallery (wip)\u0022 (at that commit the files were still \u0060invokeai/frontend/web/src/features/gallery/components/Gallery.tsx\u0060 and \u0060invokeai/frontend/web/src/features/gallery/components/use-gallery-image-names.ts\u0060); \u00600df631b8\u0060 feat(ui): consolidated gallery (wip) (at that commit the files were still \u0060invokeai/frontend/web/src/features/gallery/components/Gallery.tsx\u0060 and \u0060invokeai/frontend/web/src/features/gallery/components/use-gallery-image-names.ts\u0060); \u0060dcd716c3\u0060 Revert \u0022feat(ui): consolidated gallery (wip)\u0022 (at that commit the files were still \u0060invokeai/frontend/web/src/features/gallery/components/Gallery.tsx\u0060 and \u0060invokeai/frontend/web/src/features/gallery/components/use-gallery-image-names.ts\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b8106898ac97c55bfb6749e1eb7646624cfa517ccc154a841e570cbf59b23a7"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: use-gallery-image-names.ts \u2194 videos.ts: \u0060invokeai/frontend/webv1/src/features/gallery/components/use-gallery-image-names.ts\u0060 and \u0060invokeai/frontend/webv1/src/services/api/endpoints/videos.ts\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 \u0060b938ae0a\u0060 Revert \u0022feat(ui): consolidated gallery (wip)\u0022 (at that commit the files were still \u0060invokeai/frontend/web/src/features/gallery/components/use-gallery-image-names.ts\u0060 and \u0060invokeai/frontend/web/src/services/api/endpoints/videos.ts\u0060); \u00600df631b8\u0060 feat(ui): consolidated gallery (wip) (at that commit the files were still \u0060invokeai/frontend/web/src/features/gallery/components/use-gallery-image-names.ts\u0060 and \u0060invokeai/frontend/web/src/services/api/endpoints/videos.ts\u0060); \u0060dcd716c3\u0060 Revert \u0022feat(ui): consolidated gallery (wip)\u0022 (at that commit the files were still \u0060invokeai/frontend/web/src/features/gallery/components/use-gallery-image-names.ts\u0060 and \u0060invokeai/frontend/web/src/services/api/endpoints/videos.ts\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/use-gallery-image-names.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"95c374fc66db2cc4ef0b4988d17264e02b7dc3fb035a55e1669c43f58827d600"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: RefImageImage.tsx \u2194 ImageFieldInputComponent.tsx: \u0060invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx\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 \u0060faeb5f0c\u0060 refactor(ui): canvas flow (wip) (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/IPAdapter/IPAdapterImagePreview.tsx\u0060 and \u0060invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx\u0060); \u00602d974f67\u0060 feat(ui): restore missing upload buttons (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/IPAdapter/IPAdapterImagePreview.tsx\u0060 and \u0060invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx\u0060); \u00601afc2cba\u0060 feat(ui): support different labels for external drop targets (e.g. up\u2026 (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/IPAdapter/IPAdapterImagePreview.tsx\u0060 and \u0060invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b513d433c1116222a45f267729945315afd3f4765db7996ea430cc0e2f8256a8"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: GeneratePromptFields.tsx \u2194 PositivePromptActions.tsx: \u0060invokeai/frontend/webv2/src/features/generation/ui/promptFields/GeneratePromptFields.tsx\u0060 and \u0060invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx\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 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 6 shared commits counted here, the most recent 3 are \u0060dd48b768\u0060 feat(webv2): default and remember the prompt tool models; \u00603d65cd11\u0060 feat(generate): rework prompt fields; \u006029c5f9f9\u0060 fix(webv2): replace the seed dropdown that crashed the Generate widget \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/GeneratePromptFields.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d29e990d4107a3f743057bf374a3eaf881eb0ffede2006535737d5ab1ec69116"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: buildNodesGraph.ts \u2194 readiness.ts: \u0060invokeai/frontend/webv1/src/features/nodes/util/graph/buildNodesGraph.ts\u0060 and \u0060invokeai/frontend/webv1/src/features/queue/store/readiness.ts\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 \u006010f2c0dc\u0060 feat(ui): support generator nodes (wip) (at that commit the files were still \u0060invokeai/frontend/web/src/features/nodes/util/graph/buildNodesGraph.ts\u0060 and \u0060invokeai/frontend/web/src/features/queue/store/readiness.ts\u0060); \u006038e50cc7\u0060 tidy(ui): abstract out batch detection logic (at that commit the files were still \u0060invokeai/frontend/web/src/features/nodes/util/graph/buildNodesGraph.ts\u0060 and \u0060invokeai/frontend/web/src/features/queue/store/readiness.ts\u0060); \u006096671d12\u0060 fix(ui): filter out batch nodes when checking readiness on workflows tab (at that commit the files were still \u0060invokeai/frontend/web/src/features/nodes/util/graph/buildNodesGraph.ts\u0060 and \u0060invokeai/frontend/web/src/features/queue/store/readiness.ts\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildNodesGraph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0980f14a454671810c3b472b8e682dcd9e59a1848e59ef200eedf895c0342b73"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: Filter.tsx \u2194 Transform.tsx: \u0060invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/controlLayers/components/Transform/Transform.tsx\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 \u0060b7510ce7\u0060 feat(ui): filter, select object and transform UI buttons (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/Filters/Filter.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/components/Transform/Transform.tsx\u0060); \u00607f2c83b9\u0060 feat(ui): consolidate isolated preview settings (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/Filters/Filter.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/components/Transform/Transform.tsx\u0060); \u00606efa1597\u0060 feat(ui): focus canvas on filter/transform (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/Filters/Filter.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/components/Transform/Transform.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4ce5f5c852ab30d6bc292488399b9ba68a43cfc2e11bfb0593df27598dd3dd1"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: useInputFieldIsInvalid.ts \u2194 readiness.ts: \u0060invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldIsInvalid.ts\u0060 and \u0060invokeai/frontend/webv1/src/features/queue/store/readiness.ts\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 \u00602a9f7b2e\u0060 feat(ui): abstract node/field validation logic, use error color for n\u2026 (at that commit the files were still \u0060invokeai/frontend/web/src/features/nodes/hooks/useInputFieldIsInvalid.ts\u0060 and \u0060invokeai/frontend/web/src/features/queue/store/readiness.ts\u0060); \u006062e5b9da\u0060 docs(ui): add comments for recent perf optimizations (at that commit the files were still \u0060invokeai/frontend/web/src/features/nodes/hooks/useInputFieldIsInvalid.ts\u0060 and \u0060invokeai/frontend/web/src/features/queue/store/readiness.ts\u0060); \u0060bfe6d98c\u0060 feat(ui): support float batches (at that commit the files were still \u0060invokeai/frontend/web/src/features/nodes/hooks/useFieldIsInvalid.ts\u0060 and \u0060invokeai/frontend/web/src/features/queue/store/readiness.ts\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldIsInvalid.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b446f3f8bfbce55cc8406b5a077febe76f8e6686aebea36f897bdbed7ec8c555"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: flux_controlnet.py \u2194 instantx_controlnet_extension.py: \u0060invokeai/app/invocations/flux_controlnet.py\u0060 and \u0060invokeai/backend/flux/extensions/instantx_controlnet_extension.py\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 \u0060a654dad2\u0060 Remove instantx_control_mode from FLUX ControlNet node.; \u0060d99e7dd4\u0060 Add instantx_control_mode param to FLUX ControlNet invocation.; \u0060e8541814\u0060 Create a dedicated FLUX ControlNet invocation. \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/flux_controlnet.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d3ba9d772a95871ba22630794c70587c6c25c52a142683841ac7523d4c5e9e5"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: types.ts \u2194 onInvocationComplete.tsx: \u0060invokeai/frontend/webv1/src/features/gallery/store/types.ts\u0060 and \u0060invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx\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 \u0060e77c0d12\u0060 feat: Add virtual boards that dynamically group images by date (#8971) (at that commit the files were still \u0060invokeai/frontend/web/src/features/gallery/store/types.ts\u0060 and \u0060invokeai/frontend/web/src/services/events/onInvocationComplete.tsx\u0060); \u0060c09dc8e1\u0060 tidy: removing unused code paths 3 (at that commit the files were still \u0060invokeai/frontend/web/src/features/gallery/store/types.ts\u0060 and \u0060invokeai/frontend/web/src/services/events/onInvocationComplete.tsx\u0060); \u0060895eac6b\u0060 integrating video into gallery - thinking maybe a new category of ima\u2026 (at that commit the files were still \u0060invokeai/frontend/web/src/features/gallery/store/types.ts\u0060 and \u0060invokeai/frontend/web/src/services/events/onInvocationComplete.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/store/types.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf3ec896964dd79cb07cb279bd4bd6e56327c5d412ed1793f721c32f2673be00"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: parsing.tsx \u2194 buildZImageGraph.ts: \u0060invokeai/frontend/webv1/src/features/metadata/parsing.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts\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 \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 \u00605f2c5c35\u0060 fix(metadata): recall z_image_shift correctly (#9139) (at that commit the files were still \u0060invokeai/frontend/web/src/features/metadata/parsing.tsx\u0060 and \u0060invokeai/frontend/web/src/features/nodes/util/graph/generation/buildZImageGraph.ts\u0060); \u0060a3507121\u0060 feat: add configurable shift parameter for Z-Image (#9004) (at that commit the files were still \u0060invokeai/frontend/web/src/features/metadata/parsing.tsx\u0060 and \u0060invokeai/frontend/web/src/features/nodes/util/graph/generation/buildZImageGraph.ts\u0060); \u0060bb6c5446\u0060 feat(z-image): add Seed Variance Enhancer node and Linear UI integrat\u2026 (at that commit the files were still \u0060invokeai/frontend/web/src/features/metadata/parsing.tsx\u0060 and \u0060invokeai/frontend/web/src/features/nodes/util/graph/generation/buildZImageGraph.ts\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b7579f04c895a3bb2b8838bb8df0094b0833a74d99716ce43642a89e02a2c2a"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: useGalleryActions.ts \u2194 useImageActions.ts: \u0060invokeai/frontend/webv2/src/features/gallery/ui/useGalleryActions.ts\u0060 and \u0060invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts\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 \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 \u0060f41a7d93\u0060 feat(webv2): apply gallery move, delete, and board updates optimistic\u2026; \u006016895745\u0060 feat(gallery): complete mixed media boards and uploads; \u0060a1ec2acb\u0060 feat(webv2): add mixed-media gallery actions \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryActions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"107ec42c5150970e924291671b5553ce2044a20c06b49d2504c18a5876491fea"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: galleryStateView.ts \u2194 workbenchState.ts: \u0060invokeai/frontend/webv2/src/features/gallery/ui/galleryStateView.ts\u0060 and \u0060invokeai/frontend/webv2/src/workbench/workbenchState.ts\u0060 change together 53% of the time (17 of the 32 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 17 shared commits counted here, the most recent 3 are \u0060fbfbdaf8\u0060 feat(webv2): add an auto-add board and keep None workflow results unc\u2026; \u0060b7bae935\u0060 fix(gallery): send results to the project board by default; \u0060c7a98932\u0060 feat(webv2): semantic search mode for the gallery search bar \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/galleryStateView.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"265d945fe6fb7087e53d313564db374b84d48ebb707d0d3d71427007245cd3d6"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: GalleryUiContext.tsx \u2194 workbenchState.ts: \u0060invokeai/frontend/webv2/src/features/gallery/ui/GalleryUiContext.tsx\u0060 and \u0060invokeai/frontend/webv2/src/workbench/workbenchState.ts\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 \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 \u0060c7a98932\u0060 feat(webv2): semantic search mode for the gallery search bar; \u00605c4d204e\u0060 fix(gallery): fetch the same board the state view resolves; \u0060bba8b83a\u0060 refactor(gallery): scope the starred section to infinite pagination \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryUiContext.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"31505da8241e16c68598a26ed82afbaa72a43882a9d25cbd87d4de72c343afae"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: buildFieldInputInstance.ts \u2194 modelsByType.ts: \u0060invokeai/frontend/webv1/src/features/nodes/util/schema/buildFieldInputInstance.ts\u0060 and \u0060invokeai/frontend/webv1/src/services/api/hooks/modelsByType.ts\u0060 change together 52% of the time (12 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 \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 12 shared commits counted here, the most recent 3 are \u006030619c04\u0060 add runway back as a model and allow runway and veo3 to live together\u2026 (at that commit the files were still \u0060invokeai/frontend/web/src/features/nodes/util/schema/buildFieldInputInstance.ts\u0060 and \u0060invokeai/frontend/web/src/services/api/hooks/modelsByType.ts\u0060); \u0060e046417c\u0060 replace runway with veo, build out veo3 model support (at that commit the files were still \u0060invokeai/frontend/web/src/features/nodes/util/schema/buildFieldInputInstance.ts\u0060 and \u0060invokeai/frontend/web/src/services/api/hooks/modelsByType.ts\u0060); \u00605b5657e2\u0060 Revert \u0022replace runway with veo, build out veo3 model support\u0022 (at that commit the files were still \u0060invokeai/frontend/web/src/features/nodes/util/schema/buildFieldInputInstance.ts\u0060 and \u0060invokeai/frontend/web/src/services/api/hooks/modelsByType.ts\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/schema/buildFieldInputInstance.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"517ad76399bcca589298ae6464decc40885b24f00df817edbf09a425de6513c6"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: ControlLayerSettings.tsx \u2194 LayerContextMenu.tsx: \u0060invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx\u0060 and \u0060invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx\u0060 change together 50% of the time (7 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 7 shared commits counted here, the most recent 3 are \u00602e4b2d91\u0060 fix(webv2): read live layer content when the layers UI renders; \u0060ad688799\u0060 fix(canvas): normalize z-image control state; \u0060077f7a8f\u0060 feat(canvas): support z-image controls \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"46a19a72a6c7b2ed92791bd7dfcbbff37ce2fb1b9ebd97a8049ffd21d3f8b092"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: LayerContextMenu.tsx \u2194 LayerSection.tsx: \u0060invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx\u0060 and \u0060invokeai/frontend/webv2/src/workbench/widgets/layers/panes/LayerSection.tsx\u0060 change together 50% of the time (7 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 \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 \u00604bc6b722\u0060 feat(webv2): reveal Properties for layer operations and title the pane; \u00604e61390a\u0060 feat(layers): regenerate regions on raster layers; \u006085a6b56d\u0060 feat(canvas): levels, hue, and invert adjustment entries \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"caebbbf62253d33c62a65f5b2fece3a25d894ab9289127013c4fa248b66cfed9"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: queries.ts \u2194 galleryStateView.ts: \u0060invokeai/frontend/webv2/src/features/gallery/data/queries.ts\u0060 and \u0060invokeai/frontend/webv2/src/features/gallery/ui/galleryStateView.ts\u0060 change together 50% of the time (7 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 \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 \u0060c7a98932\u0060 feat(webv2): semantic search mode for the gallery search bar; \u0060ac41c144\u0060 fix(gallery): keep the paging constants transport-free; \u006069aed34b\u0060 refactor(gallery): trim comment narration and consolidate tests \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/data/queries.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ef1346f54642e9cc40f866227ddec7f9a05a814506098c8402a161f95ecc623"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: GenerateConceptsSection.tsx \u2194 UpscaleWidgetView.tsx: \u0060invokeai/frontend/webv2/src/features/generation/ui/GenerateConceptsSection.tsx\u0060 and \u0060invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx\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 \u006068e96158\u0060 fix(webv2): fence project actions and restore startup budgets; \u0060f2799e25\u0060 feat(ui): build concept rows on list items with a context menu; \u0060baf54c20\u0060 feat(ui): say when every compatible concept is already added \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/GenerateConceptsSection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cc3ca518c2a71da424c513fd842cdfc13c961384e96487490c24f5f13546b4e"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: CanvasLayersPanelContent.tsx \u2194 ImageViewer.tsx: \u0060invokeai/frontend/webv1/src/features/controlLayers/components/CanvasLayersPanelContent.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewer.tsx\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 \u0060dda69950\u0060 refactor(ui): :recycle: apply memoization, system style objects, and \u2026 (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/CanvasLayersPanelContent.tsx\u0060 and \u0060invokeai/frontend/web/src/features/gallery/components/ImageViewer/ImageViewer.tsx\u0060); \u006002b91e8e\u0060 feat: :sparkles: highlight focused regions (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/CanvasLayersPanelContent.tsx\u0060 and \u0060invokeai/frontend/web/src/features/gallery/components/ImageViewer/ImageViewer.tsx\u0060); \u0060cd6ef3ed\u0060 tidy,docs(ui): focus region logic (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/CanvasLayersPanelContent.tsx\u0060 and \u0060invokeai/frontend/web/src/features/gallery/components/ImageViewer/ImageViewer.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasLayersPanelContent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9613ab4d3f83fa5e726dd16c18accd01e213c6576d449e3090732a775fd2d4ea"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: RasterLayer.tsx \u2194 GalleryBoard.tsx: \u0060invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayer.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx\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 \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 5 shared commits counted here, the most recent 3 are \u00601afc2cba\u0060 feat(ui): support different labels for external drop targets (e.g. up\u2026 (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/RasterLayer/RasterLayer.tsx\u0060 and \u0060invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx\u0060); \u006093a3ed56\u0060 feat(ui): simpler dnd typing implementation (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/RasterLayer/RasterLayer.tsx\u0060 and \u0060invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx\u0060); \u0060406fc588\u0060 feat(ui): migrate to \u0060pragmatic-drag-and-drop\u0060 (wip 4) (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/RasterLayer/RasterLayer.tsx\u0060 and \u0060invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"89d4d446d747cc2fad3dfc6f70688492a3c16d6593fa655b5e6deebcb47d8b81"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: SelectObjectPointType.tsx \u2194 CanvasSegmentAnythingModule.ts: \u0060invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectPointType.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts\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 \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 5 shared commits counted here, the most recent 3 are \u00601b1759cf\u0060 feat(ui): support prompt-based selection for object selection (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/SelectObject/SelectObjectPointType.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts\u0060); \u006075f605ba\u0060 feat(ui): support inverted selection in auto-mask (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/SegmentAnything/SegmentAnythingPointType.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts\u0060); \u0060230b455a\u0060 tidy(ui): $pointTypeEnglish -\u003E $pointTypeString (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/components/SegmentAnything/SegmentAnythingPointType.tsx\u0060 and \u0060invokeai/frontend/web/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectPointType.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"958d5375cb08a47fb1ded1e69a2a66dfd5b436a9bffd508aa016f0c39a28d657"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: types.ts \u2194 optimalDimension.ts: \u0060invokeai/frontend/webv1/src/features/controlLayers/store/types.ts\u0060 and \u0060invokeai/frontend/webv1/src/features/parameters/util/optimalDimension.ts\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 \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 5 shared commits counted here, the most recent 3 are \u0060370fc677\u0060 UI support for gemini 2.5 API model (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/store/types.ts\u0060 and \u0060invokeai/frontend/web/src/features/parameters/util/optimalDimension.ts\u0060); \u006002e4a3aa\u0060 refactor(ui): params state zodification (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/store/types.ts\u0060 and \u0060invokeai/frontend/web/src/features/parameters/util/optimalDimension.ts\u0060); \u00602ad5b5cc\u0060 Flux Kontext UI support (#8111) (at that commit the files were still \u0060invokeai/frontend/web/src/features/controlLayers/store/types.ts\u0060 and \u0060invokeai/frontend/web/src/features/parameters/util/optimalDimension.ts\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe27e4bb843f50d9237fe97b1615c4c71f8b53b9ecbf0b30d9f65d6012f0f9ba"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: GalleryViewTabs.tsx \u2194 DynamicPromptsButton.tsx: \u0060invokeai/frontend/webv2/src/features/gallery/ui/GalleryViewTabs.tsx\u0060 and \u0060invokeai/frontend/webv2/src/features/generation/ui/promptFields/DynamicPromptsButton.tsx\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 \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 5 shared commits counted here, the most recent 3 are \u0060899461ee\u0060 fix(ui): compact SegmentTabs in embedded locations; \u00601df62985\u0060 feat(ui): use the layers SegmentTabs strip for view and mode tabs; \u0060f0f14f3a\u0060 Revert \u0022feat(ui): give SegmentedControl the layers panes\u0027 pill variant\u0022 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryViewTabs.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"42f7c8a14c03452c15d8e0caef8c816b8b51db1cb0a1c018b358775a6bbc853a"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: ImageViewer.tsx \u2194 NodeEditor.tsx: \u0060invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewer.tsx\u0060 and \u0060invokeai/frontend/webv1/src/features/nodes/components/NodeEditor.tsx\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 \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 5 shared commits counted here, the most recent 3 are \u00601c69b9b1\u0060 fix(ui): restore \u0060display: flex\u0060 to image viewer and node editor (at that commit the files were still \u0060invokeai/frontend/web/src/features/gallery/components/ImageViewer/ImageViewer.tsx\u0060 and \u0060invokeai/frontend/web/src/features/nodes/components/NodeEditor.tsx\u0060); \u0060dda69950\u0060 refactor(ui): :recycle: apply memoization, system style objects, and \u2026 (at that commit the files were still \u0060invokeai/frontend/web/src/features/gallery/components/ImageViewer/ImageViewer.tsx\u0060 and \u0060invokeai/frontend/web/src/features/nodes/components/NodeEditor.tsx\u0060); \u006002b91e8e\u0060 feat: :sparkles: highlight focused regions (at that commit the files were still \u0060invokeai/frontend/web/src/features/gallery/components/ImageViewer/ImageViewer.tsx\u0060 and \u0060invokeai/frontend/web/src/features/nodes/components/NodeEditor.tsx\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"26a93f186b4581ee6bae22b849c10278f73ad587bb93f292376a223e9cc4931f"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: settings.ts \u2194 executeVideoRecall.ts: \u0060invokeai/frontend/webv2/src/features/video/core/settings.ts\u0060 and \u0060invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts\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 \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 5 shared commits counted here, the most recent 3 are \u006097c0adaa\u0060 feat(video): let LTX-2 soundtrack conditioning keep first and last fr\u2026; \u0060701b657d\u0060 feat(video-recall): place a video as the LTX-2 conditioning clip; \u0060280de2c5\u0060 fix(webv2): keep a recorded video_audio reference on recall \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/settings.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"34f0200dc1631f05a95f3423b544bafa66e56e445e0840c55d22fe54f86f19d1"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: GalleryViewTabs.tsx \u2194 GraphPreviewDialog.tsx: \u0060invokeai/frontend/webv2/src/features/gallery/ui/GalleryViewTabs.tsx\u0060 and \u0060invokeai/frontend/webv2/src/features/workflow/ui/graph-preview/GraphPreviewDialog.tsx\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 \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 5 shared commits counted here, the most recent 3 are \u0060899461ee\u0060 fix(ui): compact SegmentTabs in embedded locations; \u00601df62985\u0060 feat(ui): use the layers SegmentTabs strip for view and mode tabs; \u0060f0f14f3a\u0060 Revert \u0022feat(ui): give SegmentedControl the layers panes\u0027 pill variant\u0022 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryViewTabs.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"316fa11a8dd3fb40a1b23126dbaf092f7ca9d117c808d869acf0c6cfe1f33460"}},{"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"},"taxa":[{"id":"CICD-SEC-9","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"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"},"taxa":[{"id":"CICD-SEC-8","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ace515990e7ee0f17b5c17e44dd168a5bdecf90804a3a3dd845cf05540978013"},"taxa":[{"id":"CICD-SEC-3","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Ccanvas\u003E without a text alternative: A \u003Ccanvas\u003E with no aria-label/title and no inner fallback content can\u0027t be described by assistive tech. Add a name or fallback content."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8e10b825a28359c9521e6fb58e21a3848358ee2b9cad11c2ca4237241cf3bae"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"808e59bcb3fd2b1e3139ba809d5be5de23ce526d6473e63aef48da8c03158cea"}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Ccanvas\u003E without a text alternative: A \u003Ccanvas\u003E with no aria-label/title and no inner fallback content can\u0027t be described by assistive tech. Add a name or fallback content."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasSurface.tsx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf5cc96fa68782ee1fd2deb105aec245441c88c1b872b9e73874c02a651770fb"}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Ccanvas\u003E without a text alternative: A \u003Ccanvas\u003E with no aria-label/title and no inner fallback content can\u0027t be described by assistive tech. Add a name or fallback content."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasSurface.tsx"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b979cba7158b313e7820bf161d1b4fe192a67b46d8b0d84c99a17aa1304de4a"}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Ccanvas\u003E without a text alternative: A \u003Ccanvas\u003E with no aria-label/title and no inner fallback content can\u0027t be described by assistive tech. Add a name or fallback content."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerThumbnail.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3161210659457dd57759f625c195e13fd887b26f1ed2d9f03c4a45e180374a7"}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Cvideo\u003E without a captions track: Video with no captions \u003Ctrack\u003E offers no captions. This player\u0027s source is set at runtime, so there is no caption file to author here: give the player a way to carry captions \u2014 accept a track/captions URL alongside the media and render a \u003Ctrack kind=\u0022captions\u0022\u003E when one is supplied \u2014 and capture that asset wherever the media enters the product (upload, import or generation)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx"},"region":{"startLine":894}}}],"partialFingerprints":{"codehealthFindingId/v1":"6567fae7dca5f3595a3027e06596ebbc7039cff8458bb35e707bf9311ed0b373"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSearchInput\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx"},"region":{"startLine":797}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7216aceb6e8c187a825f2672659f0b317cdc9c3805a6265b5989b24ca844cb1"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"85e1ef04eab7fa9ba94e783a607b2c102c241f6388ffed04c4fb1c4ee1a6ffb9"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarCompositeOperation.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"48a64d195b2d44f023ba0b88f6d6577cd9500d2c03cda2f2c0fd9010b9dab178"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/CanvasWorkflowIntegrationWorkflowSelector.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"31de72abe46053d5a0a3e2732176220bbc5c229844b9bd9d9981f5a24a3aae81"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfd71e2ff7c608a9b7a70e3ac9427a00d41444f594b776a79a4003ef76dcc936"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"735b178a6e2d528706d2917a417bef67e1dc2d450a6f97a956e57be00c03a3f2"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":387}}}],"partialFingerprints":{"codehealthFindingId/v1":"707a89c49fa5731770e145997cc492b2735cbdc36440d6fb4918f8a0fb4f44df"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"92f3a6a950f5462d4fa54c325d665e38a331955b39e106486d977508ef19b2e7"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterControlMode.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaf6464686d9e988c765213dc1b6abc833a4d3403d9b62ead1f3d13d4fee3e7f"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterAdjustImage.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"61483beb4b067060673832fd70e64ccd9cca03b046c0781c4bbe3e60de07d2b2"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterBlur.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4e3ae81e590f62a40a5a1ee6503b9e44f3a15e531b13c20ab803c4b68e38ff5"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterDepthAnythingDepthEstimation.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ad877397bab05bf507839bf5f155679250f5e512872362cf9aa33eed78201db"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterNoise.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"642b58961e0aca86ccdb42944f4b3642866177cbeefc4e22a2715ecd7fd2f326"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterTypeSelect.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed4bb3f41ae1981d89028aca7d8a91d00cb9371e00415525e2570fda4193dc64"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/IPAdapterMethod.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"93a2a0201a8957646578f0cc536178072514ced98a4ae3716a3b5c8806f65dd7"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CRadioGroup\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectModel.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dcbcba40435ef6b90002c610ac60fb64078aa75dc4da5e667df9d5ead5f1f43"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CRadioGroup\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectPointType.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"2318a63c3f7af2b43487601548cb9c3619d5ad43189b52b3e2dd590ac87d8a04"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef87a8cc7a048010ffa7a214d6d0c7508a7f37b5e76ee053fed8aa8e6d163f74"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Transform/TransformFitToBboxButtons.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f01a0c7ebca06fc143ecf638a2afd999b932ba2dd75060a5a82573442d1f7f2"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Transform/TransformSmoothingControls.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"c60ea88c8c616885825918c397c99cf42e6ea1627ad316c2fea6851db700ef20"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/FLUXReduxImageInfluence.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"4967f2dbb334e88f1d878dd32c4291bd8d0db3edf079919aa78635bf724dc194"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/IPAdapterCLIPVisionModel.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"41144ba8b04beccd5420d6be6b8af653878727739d721771d1e682fd5d09b4a1"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/MaskFillStyle.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ec7401400204b982db665a7a7f2360404e06e63884e404f4cd16830251e0690"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/cropper/components/CropImageEditor.tsx"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b4f1de49ee82f50533eb1815991f67f6896d94567f3f227ee5354466e79d125"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dynamicPrompts/components/ParamDynamicPromptsSeedBehaviour.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bdca698bba15257b3c606f2d3b83c46bf29a77b42438cf30453f34c58ea5df5"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardAutoAddSelect.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"7df03f709104dd5ef0aaa85c2b0323ac6059f1c349a4c43a5e867de6157e9c74"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsListSortControls.tsx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"56911037301bd02e60a97fb1f7bc611ef600c5e729489f1495aa1d9161ff4e0c"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsListSortControls.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"62e83e0fd6d66485bee23a9b16c4b91a7bc765a46f7aed6c9ab1006beaceacd6"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/SortDirectionCombobox.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c32a6b79055a1646560898db8b8b789c17dcefa71f29368aa55fa2921b368d7"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/DefaultPreprocessor.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"21d5837c847cf1ed7eef36501bc544bed6ba72590b63f3fe88d7020333f9e2e0"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/BaseModelSelect.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"281305091a0e663047a9a70ebb510d92fde52dcdb7983d13c6aed4e4e55ae471"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelFormatSelect.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"420757c44d1ee86ae36bd555ff80668b7d5f8186767f6710d9e09f71904f1adc"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelTypeSelect.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"179773470b713db7c8621744cde5807ff9434961c6fd0017ae9364252f55c672"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelVariantSelect.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e81903817b5fb61b08f11f0b35352e815e577572f0664c6d75f6af952b28921"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/PredictionTypeSelect.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"0af341eb77ce3a43e1af63e46b393d8785098383869bb4152cec603f08cacf32"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultScheduler.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"f101bb33803d89785944254fd9382e2750b95ac64c79ec135e443f932f6bb8ac"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVae.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"9096e211213b3c897fc8ad233570efb79e7e4eff2c1b9d84a591c95681d9d4a5"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVaePrecision.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"345a52ca08f72d8fc9006abb084d903c70e80386afb2ab4f80f539bef78c725b"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/RelatedModels.tsx"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fdecddbac1d336636d3227930ed8eb1da51e89aef4f5f8e72a052a7143b2392"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeNotesTextarea.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cd75e5ebe9e3d0b38fe4f85bc24a182ebf94454dbeb7aab260761e66f6fcf9d"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldDescriptionPopover.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbf2cd3f98f4822309d772b7bbcd7eb29637072c32aa4136cc89cace8ed79bab"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/StringField/StringFieldDropdown.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"034c55984bd15a610630568516422ba4f8ae85d7647db06b9fa2d4174406e643"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/StringField/StringFieldTextarea.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5dae138df158bd2e64c6bdb4a5e43dac8f0021634d86c8cccffe697d44c8cd2"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/BoardFieldInputComponent.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"1833cea9967522db1ba560b4b4930031ac022f2e039b8a818a4de4c1f75ac757"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/EnumFieldInputComponent.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"834f9feecf862893f105ca4760f9e70b51d3b418fc3633b4803348008be3e04b"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorFieldComponent.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"044443b5ac6a3ab9f12f90156d22a3e800ac394d87a6e869ae01b7968f3ace15"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/GeneratorTextareaWithFileUpload.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ecf86d34dce773a9abe8074fce62886e05b7cf8f0a9798ec7f81daff1672d2f"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorFieldComponent.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"0057874831c06229d9ce3da0dd0eb48d9d6c59ea84434dc8480275c9ef587719"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorImagesFromBoardSettings.tsx"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"21c86b8b4f2aeb6956f905ffb236418bdc8e1ea2008e04cf7ee6ef6872907999"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorImagesFromBoardSettings.tsx"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bf6647f44125e69b6249d5777206f55804dd1ffc71686a8f1007a611d48ca4b"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorFieldComponent.tsx"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3c313128452634ca1191b75d0b94664b612634cce257d23e9b19d08b333e0d6"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e733a525f6d64b1d8d64c0551f533776912537c93be8b099ff8ef862558587c"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SavedWorkflowFieldInputComponent.tsx"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f7532b2894e2daab9d8cf0b9109c914263aa36a15e8f50782957106576159af"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SchedulerFieldInputComponent.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"2088b901116b0611b7aea4186f92cb548ed8dde2f19ba1721ba4cd29c269b474"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringGeneratorFieldComponent.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fc71c902c309b5a76c461f14942037e345f0d7851f95075d030afff54a8607d"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StylePresetFieldInputComponent.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc2abcb6d4b78720be4da9689ffc88f173722b0655b8dec29990672d38d6f473"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SystemPromptFieldInputComponent.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"54b3127f6455588473568d91c2e2ed52029b96493b0b77ea4ba277f4388ae913"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Notes/NotesNode.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"109fd50a9cce8ecb58c82159f2dc315ff80bc4fb1bc9ea6322ddacbbddc48b25"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/AutoLayoutPopover.tsx"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"1117e17c500c8a05d502c24678e8098e6a83affece2ff14e7fa1cdce56034895"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/AutoLayoutPopover.tsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b62805ac4d8497186dd3a8092710709d362abadf7ef4dd0b478b9b1b7f5dfb9"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/AutoLayoutPopover.tsx"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bb9228f7cd743d85c731eb0520c70e2a50ac88de16bedcef0ccf20944ac9b13"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementFloatSettings.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"95febb7dc4ee56cf5431e3d7d45e091bcc97cf5ab6a963b961a28cf246c20f4c"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementIntegerSettings.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a00642c40c27691e41273a3373e58c07a5b50f7a5b2fc80977d470b6dcbeb82"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementStringSettings.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"abfd3369b50d7240470f24d6d7176db7355248e1be049f84e42e6f0a41672d5d"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowGeneralTab.tsx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfa35f57ee58df157a5f84344a94bde61d52d05c06b7be08dfd03a2ec89033b6"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowGeneralTab.tsx"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"f46668e97ff7337c8ca431a639b7c64fc5cae6f9fe4ef84607b4aa1e8dbeec5e"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowSortControl.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f277eacd8950a09ebeacdda5f17b4acf6a0121c36d6a4d522f73912e3b74e91"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowSortControl.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"44b17e00dfabaf16ae61c147d1c7dfb6384303247281c5b6870af4a5c36ece23"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"2572e5f1432c2a16aa9aae7c959d9f1df38fdec7f2177ebaeb6ec679c350e5d3"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"a53717791ecda40dcb32d3f527adb39c11694aaa3a796bc7ed36a2532ef3f974"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ce937567421c12fe559533af9c37a031e2d093ab97f45f34041a2b080fd0d9b"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPEmbedModelSelect.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"daf70a6ec0af7c321283d53860037b8b9d4264141171f1e908801fbb904e713a"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPGEmbedModelSelect.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"71fbf762f74b9c74d60afab854c2be28e4d332de393365f33dffdf10cf1738aa"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPLEmbedModelSelect.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"f41259519c01511b8022993984147243f093eb51a92623427813aabe2dfeb50b"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"01b0b7ff34c79f299685e496a74f9e424d8b68b0fc81a2f05a2d0823dd6f1ee8"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e5d30f4f3e619824ba01f0a5f057d497f847d85c548e8946e49f2356302727b"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"1be6eaf47c7b3c6b19dec1a6cd0a265050b2aaef3eaa30449fa6f048ee4b81b9"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"37e3d11060fd2b60f84e39023251acf82737cb1a2447d8c530ea32ae7d3289fb"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"33d8e011ddbc736dc15794b1115a635c786661d0c9d7c46dd3025907cd644810"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"11f6328d06f925ac980ed94a3e64d4b610eab231fdf5714b81a447f42db7674c"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamMiniMaxH3ModelSelects.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"5df4b20034729f9d8725cbdb99a9f9ad9c5035aace71046e5b16e2ad0c78fafd"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamMiniMaxH3ModelSelects.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba39cf46ee17287857f8826c379952d5fe4fcd90bd92f50760e5fa5f46ec4521"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageComponentSourceSelect.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"773ef38cc8440b1c98a8b9078f8d4a496fe2e8aa8d4036983967118e8991c4b3"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageComponentSourceSelect.tsx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf2f11c0962bee7b00f8105d6eb490f16197dea3fc76368bcb8e99c517a4c93a"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageComponentSourceSelect.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"83dd6c498ef6eb53853b45d8b628247a46af7b56f085ec58b2a619ed38a336a5"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageQuantization.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"6afc2d4fa34d79bd5c6272ffc5e20ca6a56f59d7594e3bd6175c9a4086905ea6"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamT5EncoderModelSelect.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"c82a222b073a12711144a7370e02a4882d6ebf0c7c18f8acf5f3a9f5e9ba2ecc"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"44f8d371cf328eb6bc2f8ce71fdd26086c07655ce68a1c86bebde36ae585d965"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bf44175c23f82cd1e1fcfc91d585b2e7e06bfd996876e6b2386e7d1981c11a1"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4eb895e3f9e7fd61629334a9dbed1b75903931faff7c7caf6ca93853e7cf2ce"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"d516d4f7ad35cd6b54b21a28e4fc98a36f05ca252c22e00376a9147c43b9a77a"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"a14a35cf7f77d32c412c9a1c70e34eeedc8d05d8ed94131c9f735b25b5f2c824"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4f0e1dc38a5b796b281665fd56169a9f9fc8b6bdd67002e01aa17bbb5acb25e"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ea38e278c843e68d7cefb8a73b9e48d1688e1d281b2958ba1a0f46d95870b65"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"21315d50b5194d5112b3e7123502df7ce02085248241c71d3dcd96b75ee90247"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"93c3a96fb8912781aae78eb6e31f3563efc29be1e96a0367e87f51acccab5c23"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"d834b90f3729f2432eacfe7fcea069ea91441ec1e40b15fe4e284d8bc4e670e0"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9116e9830abc674fc79c0c5db3a57777cd0b05c79580489bb1da258f865c0d2"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaleMethod.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"a899983082dcf175b042bac7b7c83ea8032c78f29fdadf2b008f18f9a8932aaf"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMode.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"e07dde1f242053b3de00bdec2bd926fa897e501025360a69a24852b1237d2aa2"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillMethod.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebd3309eee32ea9fe409f2df76aa22ab9bfc87cf7a269f7ce7de1a8d23a9eff1"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamAnimaScheduler.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"abf28177e34755ae84bc2ba74bcc13782a601eae6f9ad090eb378a3eb53d505c"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImageScheduler.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1c7c015e32688199003b03e60f0aa92f83b9caf305a562d3389e9a5c2bc0cf1"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypePreset.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfecbe5ec529dbd40b7c2cc98f494121c2fe024f3a19bffa8ae132cbb562a4bf"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxScheduler.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"1eaa42b97fa8b45422df23030c765584759ee3260bf5e7d5941d5d2af64d4f40"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4SamplerPreset.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"71f26b4132d0699e0898d9569645410f818322b5ae1e6fd9ef34723e6c21d00e"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamScheduler.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b0c0e0fe2f3c9c18160c59fd03be257fecf7a94092089ccaada405cd6aea0b6"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamZImageScheduler.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"63ce1806b2e06171471e5314b76703f24cc58cba5ce68bd63f2595d790445d17"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"a673db34364907ad2f7e71284994fb690f5a23f109182d6bb59fbf9b1bdcc26f"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelImageSizeSelect.tsx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef2b8908807720506be13f95c282e4d017781f1f7a3f9844e10d3dff26167c04"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelResolutionSelect.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff438fbc3df4723b778619921af70feae2aff0d7f3322b60c8d1c7336cf94718"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/GeminiProviderOptions.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd03ae68cae139c6fb8e6ab7719be0bef48e9ebe20b81620c0a4ddf7b52e393d"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/OpenAIProviderOptions.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"27835fd949a166fb2e8956f4cad57a2d3c2c10dcbf5e0ec738bcde69f0c06b24"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/OpenAIProviderOptions.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a257a16539e25282a41950be9d35492269f9f48e52511891b0f0fcae964f6a6"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id, and nothing it renders carries one either (a name prop is the form-submission key, not a label). The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/OpenAIProviderOptions.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"43f09333c62af31db32010d852bdd6368d37694ca66f771dc8d2be3ad7699065"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleScheduler.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b610d2017cab6e4f1930c4441b2819bf04fd85e755fe70491fcb755bd69ac25"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamFLUXVAEModelSelect.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"33a55e2298e823c3495c662809f11d6855e3760609834ae7d661e3cbd420c853"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEModelSelect.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"a343a0da76fbfd5e152e0eafc74e274c2688e791fa6345f85bc58cedf3dcf194"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEPrecision.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fb80788fac63148ab3192cfa3c1a3555465fae069900a30190bbe19070ae41f"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e6e9f4434978390e7a7d37a60d8022812c02b308199da7dcf724c0c6cafecf8"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/PromptTriggerSelect.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"1de4b98b756d61f051a7d0223690722db7e915e8d2b3031ac41fad6bf5565493"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerModelSelect.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"67adc4fadbe73e9ceba1bf3da30b2c4a4e5267b569fe10fa11bdb0e26b60e285"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerScheduler.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"1eb7e18e1cb080c0297a180eead9ad697ac852f7f8767e2c1e0d51ab6a804bca"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetForm/StylePresetPromptField.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ee11fe9857ec4fe1efed63d39cc317ed6ca9418c8a991daf8f0c450961a083b"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogLevel.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"892991a28d381683c241ff198056c68f66b74fce05430a0d37e4fc0865d2a5a2"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageSubfolderStrategySelect.tsx"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e2e021eede1ed76f551c454483cd9024b09a17ba02a482ae735dc1b9f2c287d"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CCombobox\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsLanguageSelect.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ba7fc78af93594fab55a8ecd789c1c3669a6c08aced58a8266cdf9bc0255401"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CNumberInput\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"311d9edfea6ea13e2ea74b5eb8222ee28349d3f34c12f52ab938173e158d9d13"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowFromGraphModal/LoadWorkflowFromGraphModal.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"098fab9707cdbd5b810988dc5c125cb8037f14c68720f1d7095f06e500a516ed"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowFromGraphModal/LoadWorkflowFromGraphModal.tsx"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"24770b52f056a8f7c7d67e4c4c42e680675fbee133602600c7e8e1f0f8996354"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageControls.tsx"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d24e1bd6c3599829dbab27c86f34c920f3bbc05d4db63af4b0d7c2c3772e59a"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageControls.tsx"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a0fcb3e97788d62047c70497df5851d452e86d97782cffc9077097e27b1cbd9"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id \u2014 and neither does anything it renders (a name prop is the form-submission key, not a label) \u2014 so it likely renders an unlabelled control. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/settings/SettingControl.tsx"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"e818443a55612d25a23bf2a6cbc340e67855e818f86b52a07ace97e20fff9c4b"}},{"ruleId":"AC4","level":"error","message":{"text":"Double-click handler on a non-interactive \u003Ccanvas\u003E: This \u003Ccanvas\u003E binds pointerdown, pointerup, pointermove and double-click \u2014 pointer gestures with no keyboard form, a double-click among them. No click, no key handler, and no tabIndex={0}, so it cannot even take focus. Nothing synthesises a double-click from the keyboard: Enter and Space fire a single click, and only on a native \u003Cbutton\u003E or \u003Ca href\u003E. So this behaviour has no keyboard path at all. Expose the same action on a real control, or add role \u002B tabIndex={0} \u002B a key handler alongside the double-click."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"31e8a368e6747f1028589c4e5ec594f208873585b630c0a99425a4d608b3fd51"}},{"ruleId":"AC6","level":"warning","message":{"text":"Focus outline removed inline: \u003Cvideo\u003E takes keyboard focus, and outline:none/0 in its inline style removes the focus ring with no chance of a :focus replacement (an inline style outranks every stylesheet rule). Keep a visible focus indicator."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f997b437f083242c3f49dc7bcbbac15b810d1cd041c2de01b3dfebf229d6887"}},{"ruleId":"AC6","level":"warning","message":{"text":"Animation without a prefers-reduced-motion guard: \u0060.site-title\u0060 moves (\u0060transition: transform 100ms ease-in-out\u0060) and nothing reads prefers-reduced-motion for it \u2014 no @media (prefers-reduced-motion) rule for this element, no reset this project loads \u2014 so a motion-sensitive user cannot turn it off (WCAG 2.3.3). Declare it under @media (prefers-reduced-motion: no-preference), or neutralise it under reduce."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/styles/custom.css"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"c00c64095a1c91ba255cfb5800054cfeb3674d34b7f2d09c4d477cce16536cd6"}},{"ruleId":"AC6","level":"warning","message":{"text":"Animation without a prefers-reduced-motion guard: \u0060.sl-link-button\u0060 moves (\u0060transition: transform 100ms ease-in-out\u0060) and nothing reads prefers-reduced-motion for it \u2014 no @media (prefers-reduced-motion) rule for this element, no reset this project loads \u2014 so a motion-sensitive user cannot turn it off (WCAG 2.3.3). Declare it under @media (prefers-reduced-motion: no-preference), or neutralise it under reduce."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/styles/custom.css"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2467e162be9b844ae3c7da67dd1b1c20575c833577c62dc4553c8e1d86f4a24"}},{"ruleId":"AC6","level":"warning","message":{"text":"Animation without a prefers-reduced-motion guard: \u0060.splash-img::before\u0060 moves (\u0060animation: splash-animate 6s ease-in-out infinite\u0060) and nothing reads prefers-reduced-motion for it \u2014 no @media (prefers-reduced-motion) rule for this element, no reset this project loads \u2014 so a motion-sensitive user cannot turn it off (WCAG 2.3.3). Declare it under @media (prefers-reduced-motion: no-preference), or neutralise it under reduce."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/styles/custom.css"},"region":{"startLine":401}}}],"partialFingerprints":{"codehealthFindingId/v1":"9522d901fa300c074cac9cb72420bbe0e5d52b36d8164700716fd5d4375aae1d"}},{"ruleId":"AC7","level":"note","message":{"text":"Accessibility enforcement below the top rung: Accessibility checks run in tests (Verified) but aren\u0027t gated in CI \u2014 run the suite that holds those checks in your pipeline so an accessibility regression blocks the merge (Prevented). What was searched, so you can tell an absence from a miss: the 1502 markup file(s) this pass actually assessed, the linter configuration checked in beside them, and this repository\u0027s test and CI files \u2014 matched by name against the accessibility checkers this dimension carries. An audit run outside the repository, a hosted scanner, or a check whose name is not one of those, is not seen here."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d46019b86eff5ddad9db289e6802ac158899e980df54c34f67722442787ead62"}},{"ruleId":"AX6","level":"note","message":{"text":"Fat interface: GalleryCommandsPort (19 required operations): \u0060GalleryCommandsPort\u0060 declares 19 required operations: \u0060clearSelection\u0060, \u0060reconcileDeletedBoardOutcome\u0060, \u0060selectBoard\u0060, \u0060selectItem\u0060, \u0060selectImage\u0060, \u0060setCompareItem\u0060, \u0060setCompareImage\u0060, \u0060setItemMultiSelection\u0060, \u0060setPage\u0060, \u0060setPageInfo\u0060, \u0060setSearchTerm\u0060, \u0060setStarredOnly\u0060, \u0060setSemanticSearchMode\u0060, \u0060setSemanticSearchText\u0060, \u0060commitSemanticSearch\u0060, \u0060clearSearch\u0060, \u0060setView\u0060, \u0060toggleItemSelection\u0060, \u0060updateSettings\u0060. Counted over its REQUIRED operations \u2014 a method signature or a function-typed property with no \u0060?\u0060, once per signature; optional members and data properties are not counted, because no implementer is forced to write them. A wide interface forces every implementer and caller to depend on methods they don\u0027t use (the Interface-Segregation \u0027I\u0027 in SOLID). Split it into focused role-interfaces."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryUiContext.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"06c6e94164e16fbec34bc97a2083e792582b9d792de69d46a45b36bd3a1344a4"}},{"ruleId":"AX6","level":"note","message":{"text":"Fat interface: GalleryActions (25 required operations): \u0060GalleryActions\u0060 declares 25 required operations: \u0060archiveBoard\u0060, \u0060createBoard\u0060, \u0060deleteBoard\u0060, \u0060downloadBoard\u0060, \u0060exportProject\u0060, \u0060loadMore\u0060, \u0060moveBoard\u0060, \u0060refresh\u0060, \u0060renameBoard\u0060, \u0060setBoardGeneralAccess\u0060, \u0060selectBoard\u0060, \u0060selectItem\u0060, \u0060selectItemRange\u0060, \u0060setCompareItem\u0060, \u0060setSearchTerm\u0060, \u0060setStarredOnly\u0060, \u0060clearSearch\u0060, \u0060commitSemanticSearch\u0060, \u0060setSemanticImageQuery\u0060, \u0060setSemanticSearchMode\u0060, \u0060setSemanticSearchText\u0060, \u0060setView\u0060, \u0060toggleItemInSelection\u0060, \u0060updateSettings\u0060, \u0060uploadFiles\u0060. Counted over its REQUIRED operations \u2014 a method signature or a function-typed property with no \u0060?\u0060, once per signature; optional members and data properties are not counted, because no implementer is forced to write them. A wide interface forces every implementer and caller to depend on methods they don\u0027t use (the Interface-Segregation \u0027I\u0027 in SOLID). Split it into focused role-interfaces."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryWidgetContext.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"070ad7ae0311d3d8513712bdffd5362a51002e7913ea796eebef6ba6e7cd8f96"}},{"ruleId":"AX6","level":"note","message":{"text":"Fat interface: QueueBackendPort (20 required operations): \u0060QueueBackendPort\u0060 declares 20 required operations: \u0060claimItemDelivery\u0060, \u0060cancelQueueItems\u0060, \u0060cancelQueueItemsByBatchIds\u0060, \u0060enqueueGenerate\u0060, \u0060enqueueWorkflow\u0060, \u0060getItem\u0060, \u0060getResultImages\u0060, \u0060getResultVideoNames\u0060, \u0060getResultVideos\u0060, \u0060listItems\u0060, \u0060readCurrent\u0060, \u0060readItemIds\u0060, \u0060readItemsById\u0060, \u0060readNext\u0060, \u0060readStatus\u0060, \u0060readItemDetail\u0060, \u0060retryItems\u0060, \u0060emit\u0060, \u0060on\u0060, \u0060onConnectionChange\u0060. Counted over its REQUIRED operations \u2014 a method signature or a function-typed property with no \u0060?\u0060, once per signature; optional members and data properties are not counted, because no implementer is forced to write them. A wide interface forces every implementer and caller to depend on methods they don\u0027t use (the Interface-Segregation \u0027I\u0027 in SOLID). Split it into focused role-interfaces."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/core/types.ts"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3596c543e6931f79cb7b3ec46146b17468c1e19f079b71adeac2f76a2b087e4"}},{"ruleId":"AX6","level":"note","message":{"text":"Fat interface: ProjectDraftStore (24 required operations): \u0060ProjectDraftStore\u0060 declares 24 required operations: \u0060adopt\u0060, \u0060acknowledgeRetarget\u0060, \u0060claimWriter\u0060, \u0060close\u0060, \u0060delete\u0060, \u0060deleteCorrupt\u0060, \u0060discardUnloadJournal\u0060, \u0060get\u0060, \u0060journalBeforeUnload\u0060, \u0060list\u0060, \u0060listForProject\u0060, \u0060listRetargets\u0060, \u0060peekUnloadJournalProjectIds\u0060, \u0060reconcileUnloadJournal\u0060, \u0060reserveCopyIdentity\u0060, \u0060resumeDraft\u0060, \u0060rebaseDraft\u0060, \u0060retargetAcknowledgedCopy\u0060, \u0060settleAcknowledgement\u0060, \u0060settleConflict\u0060, \u0060settleSchemaRefusal\u0060, \u0060settleUnloadJournal\u0060, \u0060stage\u0060, \u0060startFreshWriter\u0060. Counted over its REQUIRED operations \u2014 a method signature or a function-typed property with no \u0060?\u0060, once per signature; optional members and data properties are not counted, because no implementer is forced to write them. A wide interface forces every implementer and caller to depend on methods they don\u0027t use (the Interface-Segregation \u0027I\u0027 in SOLID). Split it into focused role-interfaces."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc6dc10acdfb437fb2056e51cc9a1de7b15ecbff6c3dc565d1647d428b7366a5"}},{"ruleId":"AX6","level":"note","message":{"text":"Fat interface: DurableSyncedWorkbenchPersistence (29 required operations): \u0060DurableSyncedWorkbenchPersistence\u0060 declares 29 required operations: \u0060acknowledgeProjectResolution\u0060, \u0060abortProjectResolution\u0060, \u0060adoptProjectRecord\u0060, \u0060clearWorkbench\u0060, \u0060close\u0060, \u0060deleteRecoverableDraft\u0060, \u0060deleteProjectOnServer\u0060, \u0060ensureProjectOnServer\u0060, \u0060flushProjectToServer\u0060, \u0060getProjectDraftDocument\u0060, \u0060getRecoverableDraftDocument\u0060, \u0060hasClosedSession\u0060, \u0060journalBeforeUnload\u0060, \u0060hasPendingChanges\u0060, \u0060hydrateProjectFromServer\u0060, \u0060loadWorkbench\u0060, \u0060listRecoverableDrafts\u0060, \u0060markProjectDeleted\u0060, \u0060persistEmptySession\u0060, \u0060releaseMutationLocks\u0060, \u0060reopenSession\u0060, \u0060subscribeSessionReopened\u0060, \u0060resolveConflictDiscard\u0060, \u0060resolveConflictSaveAsNew\u0060, \u0060resolveConflictUseServer\u0060, \u0060releaseProjectSync\u0060, \u0060retain\u0060, \u0060saveWorkbench\u0060, \u0060unmarkProjectDeleted\u0060. Counted over its REQUIRED operations \u2014 a method signature or a function-typed property with no \u0060?\u0060, once per signature; optional members and data properties are not counted, because no implementer is forced to write them. A wide interface forces every implementer and caller to depend on methods they don\u0027t use (the Interface-Segregation \u0027I\u0027 in SOLID). Split it into focused role-interfaces."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":508}}}],"partialFingerprints":{"codehealthFindingId/v1":"0071d4671b889561841564e73cb99d44d37a4c68769753f139d7aaf848a89aeb"}},{"ruleId":"AX6","level":"note","message":{"text":"Fat interface: PersistenceAggregatePort (17 required operations): \u0060PersistenceAggregatePort\u0060 declares 17 required operations: \u0060assignProjectBoard\u0060, \u0060getPersistedRevision\u0060, \u0060getState\u0060, \u0060hydrate\u0060, \u0060notifyProjectNotFound\u0060, \u0060reportLoadAvailable\u0060, \u0060reportLoadError\u0060, \u0060reportLoadUnavailable\u0060, \u0060reportRefusedProjects\u0060, \u0060saveFailed\u0060, \u0060saveNeedsAttention\u0060, \u0060savePending\u0060, \u0060saveScheduled\u0060, \u0060saveStarted\u0060, \u0060saveSucceeded\u0060, \u0060setHasHydrated\u0060, \u0060subscribe\u0060. Counted over its REQUIRED operations \u2014 a method signature or a function-typed property with no \u0060?\u0060, once per signature; optional members and data properties are not counted, because no implementer is forced to write them. A wide interface forces every implementer and caller to depend on methods they don\u0027t use (the Interface-Segregation \u0027I\u0027 in SOLID). Split it into focused role-interfaces."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/persistenceRuntime.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"615ce8f88d4cb64bd623c1fe43ea9108f84be2c7cf3d021b50afda110432c815"}},{"ruleId":"AX6","level":"note","message":{"text":"Fat interface: LayerRowCommands (22 required operations): \u0060LayerRowCommands\u0060 declares 22 required operations: \u0060select\u0060, \u0060focus\u0060, \u0060toggleExpanded\u0060, \u0060setEnabled\u0060, \u0060setHidden\u0060, \u0060setLocked\u0060, \u0060startRename\u0060, \u0060rename\u0060, \u0060endRename\u0060, \u0060openMenu\u0060, \u0060openStackMenu\u0060, \u0060toggleCollapse\u0060, \u0060toggleChildren\u0060, \u0060selectChild\u0060, \u0060setChildEnabled\u0060, \u0060removeChild\u0060, \u0060renameChild\u0060, \u0060moveChild\u0060, \u0060moveChildToLayer\u0060, \u0060duplicateChild\u0060, \u0060openChildMenu\u0060, \u0060keyDown\u0060. Counted over its REQUIRED operations \u2014 a method signature or a function-typed property with no \u0060?\u0060, once per signature; optional members and data properties are not counted, because no implementer is forced to write them. A wide interface forces every implementer and caller to depend on methods they don\u0027t use (the Interface-Segregation \u0027I\u0027 in SOLID). Split it into focused role-interfaces."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerRowCommands.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac003da32d42703affdaae5aee5c80db01e04390812689f18eadf9212b1f0b1c"}},{"ruleId":"AX6","level":"note","message":{"text":"Fat interface: LayerContextActionEffects (31 required operations): \u0060LayerContextActionEffects\u0060 declares 31 required operations: \u0060reorder\u0060, \u0060duplicate\u0060, \u0060mergeSelected\u0060, \u0060group\u0060, \u0060openRename\u0060, \u0060openRunWorkflow\u0060, \u0060startSelectObject\u0060, \u0060startFilter\u0060, \u0060transform\u0060, \u0060fitToBbox\u0060, \u0060openProperties\u0060, \u0060saveToBoard\u0060, \u0060copyToClipboard\u0060, \u0060cropToBbox\u0060, \u0060extractMaskedArea\u0060, \u0060booleanMerge\u0060, \u0060copyTo\u0060, \u0060rasterize\u0060, \u0060convertTo\u0060, \u0060patchConfig\u0060, \u0060addReferenceImage\u0060, \u0060addMaskModifier\u0060, \u0060addAdjustment\u0060, \u0060addLayerRegion\u0060, \u0060setColorLabel\u0060, \u0060mergeDown\u0060, \u0060toggleVisibility\u0060, \u0060toggleHidden\u0060, \u0060toggleLock\u0060, \u0060toggleQuickSwitchBookmark\u0060, \u0060delete\u0060. Counted over its REQUIRED operations \u2014 a method signature or a function-typed property with no \u0060?\u0060, once per signature; optional members and data properties are not counted, because no implementer is forced to write them. A wide interface forces every implementer and caller to depend on methods they don\u0027t use (the Interface-Segregation \u0027I\u0027 in SOLID). Split it into focused role-interfaces."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerContextActions.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"b36233dc4caa03987384b897b11514e6b7d642173e0b38065c2e8aeb98329503"}},{"ruleId":"AX6","level":"note","message":{"text":"Fat interface: LayerCacheStore (21 required operations): \u0060LayerCacheStore\u0060 declares 21 required operations: \u0060peek\u0060, \u0060layerIds\u0060, \u0060get\u0060, \u0060getOrCreate\u0060, \u0060getOrCreateRect\u0060, \u0060growToRect\u0060, \u0060shrinkToRect\u0060, \u0060prepareReplacement\u0060, \u0060installReplacement\u0060, \u0060publishRasterized\u0060, \u0060captureState\u0060, \u0060restoreState\u0060, \u0060publishPixels\u0060, \u0060damageSince\u0060, \u0060invalidate\u0060, \u0060delete\u0060, \u0060version\u0060, \u0060revision\u0060, \u0060byteSize\u0060, \u0060evict\u0060, \u0060dispose\u0060. Counted over its REQUIRED operations \u2014 a method signature or a function-typed property with no \u0060?\u0060, once per signature; optional members and data properties are not counted, because no implementer is forced to write them. A wide interface forces every implementer and caller to depend on methods they don\u0027t use (the Interface-Segregation \u0027I\u0027 in SOLID). Split it into focused role-interfaces."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerCache.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"327ac9f59266f5ef6aa46b5213d8668cba0015e55c731624b6bc32c694174f6a"}},{"ruleId":"AX6","level":"note","message":{"text":"Fat interface: CanvasEngineLayerCapability (24 required operations): \u0060CanvasEngineLayerCapability\u0060 declares 24 required operations: \u0060applyTransform\u0060, \u0060booleanMergeRasterLayers\u0060, \u0060cancelTextEdit\u0060, \u0060cancelTransform\u0060, \u0060clearMask\u0060, \u0060commitLayerConversion\u0060, \u0060commitLayerCopy\u0060, \u0060commitMaskImageResult\u0060, \u0060commitOpenTextSession\u0060, \u0060commitRasterFilterResult\u0060, \u0060commitTextEdit\u0060, \u0060copyLayerToRaster\u0060, \u0060cropLayerToBbox\u0060, \u0060duplicateLayers\u0060, \u0060mergeLayerDown\u0060, \u0060mergeSelectedRasterLayers\u0060, \u0060mergeVisibleRasterLayers\u0060, \u0060nudgeSelectedLayer\u0060, \u0060openTextCreate\u0060, \u0060openTextEdit\u0060, \u0060rasterizeLayer\u0060, \u0060setTextEditContentReader\u0060, \u0060updateTextEditStyle\u0060, \u0060updateTransformSession\u0060. Counted over its REQUIRED operations \u2014 a method signature or a function-typed property with no \u0060?\u0060, once per signature; optional members and data properties are not counted, because no implementer is forced to write them. A wide interface forces every implementer and caller to depend on methods they don\u0027t use (the Interface-Segregation \u0027I\u0027 in SOLID). Split it into focused role-interfaces."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/capabilities.ts"},"region":{"startLine":579}}}],"partialFingerprints":{"codehealthFindingId/v1":"916d735350363be081e52a2068050a541834471629b287eb89e6fb5b6eff7a86"}},{"ruleId":"AX6","level":"note","message":{"text":"Fat interface: CanvasApplicationHost (27 required operations): \u0060CanvasApplicationHost\u0060 declares 27 required operations: \u0060captureGuard\u0060, \u0060clearFilterPreview\u0060, \u0060clearSamPreview\u0060, \u0060commitFilter\u0060, \u0060commitGenerated\u0060, \u0060commitMask\u0060, \u0060decodeSelectObjectPreview\u0060, \u0060encodeSurface\u0060, \u0060exportBakedLayerBlob\u0060, \u0060exportLayerPixels\u0060, \u0060getCompositeExecutorDeps\u0060, \u0060getDocument\u0060, \u0060isGuardCurrent\u0060, \u0060isInteractionLocked\u0060, \u0060isSamToolActive\u0060, \u0060prepareSelectObjectStart\u0060, \u0060publishFilterPreview\u0060, \u0060publishSamPreview\u0060, \u0060replaceSelection\u0060, \u0060replaceTemporaryRestoreTool\u0060, \u0060selectLayer\u0060, \u0060setSamInputHandler\u0060, \u0060setEscapeHandler\u0060, \u0060setSamInteraction\u0060, \u0060setSamTool\u0060, \u0060setViewTool\u0060, \u0060subscribeToolChanges\u0060. Counted over its REQUIRED operations \u2014 a method signature or a function-typed property with no \u0060?\u0060, once per signature; optional members and data properties are not counted, because no implementer is forced to write them. A wide interface forces every implementer and caller to depend on methods they don\u0027t use (the Interface-Segregation \u0027I\u0027 in SOLID). Split it into focused role-interfaces."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/applicationHost.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"015640ebaf1c3fccca5a28f54867aaf266ec49b070dbde9d7a874e1babff8adb"}},{"ruleId":"AX6","level":"note","message":{"text":"Fat interface: CanvasOperationCapability (22 required operations): \u0060CanvasOperationCapability\u0060 declares 22 required operations: \u0060composeForGeneration\u0060, \u0060uploadIntermediate\u0060, \u0060getOperationState\u0060, \u0060subscribeOperation\u0060, \u0060getFilterSessionState\u0060, \u0060subscribeFilterSession\u0060, \u0060getSamSessionState\u0060, \u0060subscribeSamSession\u0060, \u0060startSelectObject\u0060, \u0060startFilterOperation\u0060, \u0060updateFilterOperation\u0060, \u0060setFilterOperationAutoProcess\u0060, \u0060processFilterOperation\u0060, \u0060resetFilterOperation\u0060, \u0060commitFilterOperation\u0060, \u0060cancelFilterOperation\u0060, \u0060updateSelectObjectSession\u0060, \u0060processSelectObjectSession\u0060, \u0060applySelectObjectSession\u0060, \u0060saveSelectObjectSession\u0060, \u0060resetSelectObjectSession\u0060, \u0060cancelSelectObjectSession\u0060. Counted over its REQUIRED operations \u2014 a method signature or a function-typed property with no \u0060?\u0060, once per signature; optional members and data properties are not counted, because no implementer is forced to write them. A wide interface forces every implementer and caller to depend on methods they don\u0027t use (the Interface-Segregation \u0027I\u0027 in SOLID). Split it into focused role-interfaces."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/contracts.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2f9907022031d36ee9d85acbd68c7201e27cca997131a306881c89183659497"}},{"ruleId":"AX6","level":"note","message":{"text":"Fat interface: CanvasSelectObjectCoordinatorDeps (20 required operations): \u0060CanvasSelectObjectCoordinatorDeps\u0060 declares 20 required operations: \u0060isInteractionLocked\u0060, \u0060prepareStart\u0060, \u0060selectLayer\u0060, \u0060clearOtherOperation\u0060, \u0060setSamTool\u0060, \u0060setViewTool\u0060, \u0060replaceTemporaryRestoreTool\u0060, \u0060isSamToolActive\u0060, \u0060captureGuard\u0060, \u0060isGuardCurrent\u0060, \u0060exportSource\u0060, \u0060uploadIntermediate\u0060, \u0060runGraph\u0060, \u0060decodePreview\u0060, \u0060publishPreview\u0060, \u0060clearPreview\u0060, \u0060invalidateOverlay\u0060, \u0060commitGenerated\u0060, \u0060commitMask\u0060, \u0060replaceSelection\u0060. Counted over its REQUIRED operations \u2014 a method signature or a function-typed property with no \u0060?\u0060, once per signature; optional members and data properties are not counted, because no implementer is forced to write them. A wide interface forces every implementer and caller to depend on methods they don\u0027t use (the Interface-Segregation \u0027I\u0027 in SOLID). Split it into focused role-interfaces."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/contracts.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4505eea9d0d14d5a4a181a944a9bc4f4ad15ee54f13d0207e556e1b1891b6e7"}},{"ruleId":"AX6","level":"note","message":{"text":"Fat interface: ImageActions (23 required operations): \u0060ImageActions\u0060 declares 23 required operations: \u0060copyImage\u0060, \u0060createCanvasFromImages\u0060, \u0060deleteImages\u0060, \u0060deriveImageRecallCapabilities\u0060, \u0060downloadImage\u0060, \u0060downloadImages\u0060, \u0060getImageRecallCapabilities\u0060, \u0060loadImageWorkflow\u0060, \u0060getVideoRecallCapabilities\u0060, \u0060hasVideoWorkflow\u0060, \u0060loadVideoWorkflow\u0060, \u0060moveImagesToBoard\u0060, \u0060openImageInPreview\u0060, \u0060recallImageData\u0060, \u0060recallVideoData\u0060, \u0060sendToInitialVideo\u0060, \u0060savePromptAsTemplate\u0060, \u0060selectForCompare\u0060, \u0060sendToCanvas\u0060, \u0060setImagesStarred\u0060, \u0060useAsReferenceImage\u0060, \u0060useAsReferenceVideo\u0060, \u0060useAsConditioningClip\u0060. Counted over its REQUIRED operations \u2014 a method signature or a function-typed property with no \u0060?\u0060, once per signature; optional members and data properties are not counted, because no implementer is forced to write them. A wide interface forces every implementer and caller to depend on methods they don\u0027t use (the Interface-Segregation \u0027I\u0027 in SOLID). Split it into focused role-interfaces."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ecf8f8a2cedb45869e20758e6f2c76a59d664c04b55d13a83175e10744840cd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: auth \u2192 toast: \u0060UserMenu\u0060 (slice \u0027auth\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/UserMenu.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"fed311cc415deb52eecd9f0eebc448c95dd6333aa922f7b81f3134e0c4010162"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: changeBoardModal \u2192 gallery: \u0060ChangeBoardModal\u0060 (slice \u0027changeBoardModal\u0027) depends on \u0060selectSelectedBoardId\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"8deccf406adf4348df6341c33ea3e987385eaa7a03602833a263f9d0f913afe0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: changeBoardModal \u2192 auth: \u0060ChangeBoardModal\u0060 (slice \u0027changeBoardModal\u0027) depends on \u0060selectCurrentUser\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"8481b589a02a7e2e79392adb3b07f9695805ac6ec29dd804292fd15fc3d6db33"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: changeBoardModal \u2192 auth: \u0060ChangeBoardModal\u0060 (slice \u0027changeBoardModal\u0027) depends on \u0060captureAuthContext\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c89d28b07c9a83105560b5c3e64743ac14e52a70c0921a61d99e782cb47982a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: changeBoardModal \u2192 auth: \u0060ChangeBoardModal\u0060 (slice \u0027changeBoardModal\u0027) depends on \u0060isSameAuthContext\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"42e4d2594f28efb203aeeb3fcabe987d4fd89b29ac42f6f2619f5dd43366f0c3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: changeBoardModal \u2192 toast: \u0060ChangeBoardModal\u0060 (slice \u0027changeBoardModal\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8bdeb3c9d49907f60b049f53e99460a13def49a4155c38c6a5496ae28c7715c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060CanvasAlertsInvocationProgress\u0060 (slice \u0027controlLayers\u0027) depends on \u0060selectSystemShouldShowInvocationProgressDetail\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsInvocationProgress.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e03273f372aa31c15b56d1bca2c0595fd935f01662e79f33035b3acbf0c6922"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060addRasterLayerFromImageDndTargetData\u0060 (slice \u0027controlLayers\u0027) depends on \u0060newCanvasEntityFromImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasDropArea.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"28b66b2ad81b6d864af1f8633526b9d998ce5c47644051c5d73784352d13c3be"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060CanvasDropArea\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasDropArea.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"806691f516f209a286f3616e05761a1d58c3233049b559d10b38b6fa9a48a88c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060CanvasEntityContainer\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndListDropIndicator\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityContainer.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee2196be1786bfa2fb280aaa4bb7e60a595d367e6a32b21bc31e604a4d449f28"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060CanvasEntityGroupList\u0060 (slice \u0027controlLayers\u0027) depends on \u0060singleCanvasEntityDndSource\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityGroupList.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b5ae8d22210222fc4f6b6a471e25647c2e08efc7ad28b7ac1ac4ec4b4465af2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060CanvasEntityGroupList\u0060 (slice \u0027controlLayers\u0027) depends on \u0060triggerPostMoveFlash\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityGroupList.tsx"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"55ef2dba99f2062abaeca2b868fd4ddd5c97902272225338034e29f2ebc35889"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060useCanvasEntityListDnd\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndListTargetState\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/useCanvasEntityListDnd.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"e15bfea0e1d1e4287f1cb014b0762258da20bfa22f8a1a0090728897805c1207"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060useCanvasEntityListDnd\u0060 (slice \u0027controlLayers\u0027) depends on \u0060idle\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/useCanvasEntityListDnd.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa33404cd83f8461f656f88a4686b6b1280bfa1b6f3fd5b3b94efeefc0435b03"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060useCanvasEntityListDnd\u0060 (slice \u0027controlLayers\u0027) depends on \u0060dndInputFix\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/useCanvasEntityListDnd.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"8148cf89ab63c09285054d1e1bf9128618774200f8c67ca1ad68ab05d8317921"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060useCanvasEntityListDnd\u0060 (slice \u0027controlLayers\u0027) depends on \u0060singleCanvasEntityDndSource\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/useCanvasEntityListDnd.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"82383b0f2a41f3e3af67d6e917d8df66d57be617f8762726ce967f323c0c0439"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 gallery: \u0060CanvasPasteModal\u0060 (slice \u0027controlLayers\u0027) depends on \u0060selectAutoAddBoardId\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasPasteModal.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"19cd63a9a4c9de31c3a1ba298576a2a836091355911938aa667f8ff0fd48dbf1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 imageActions: \u0060CanvasPasteModal\u0060 (slice \u0027controlLayers\u0027) depends on \u0060createNewCanvasEntityFromImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasPasteModal.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ad0ff4b0cba41c7bd8943673685697f8d5bffd3e343996ef46a5e18c2542b26"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060CanvasPasteModal\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasPasteModal.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"01e1eeeea4037b7c300c71434782dbbd93c3bb84f20bcc875e6d0457c189f6a0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060WorkflowFieldRendererProps\u0060 (slice \u0027controlLayers\u0027) depends on \u0060NodeFieldElement\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"84d313335b4ff6e9f63a832edae0ba77f41aee1ef86cee70da62856e5dcdfcbc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060WorkflowFieldRenderer\u0060 (slice \u0027controlLayers\u0027) depends on \u0060$templates\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f37ccff9f3a9c63828de44b6523b8d0b645df8f4544df14c4c324da9ab54dbc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060WorkflowFieldRenderer\u0060 (slice \u0027controlLayers\u0027) depends on \u0060isParameterScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d94fc5b8e46bb24f07b95e205b7f2b9af32c3df138f9892335af5967a25d4b0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060WorkflowFieldRenderer\u0060 (slice \u0027controlLayers\u0027) depends on \u0060SCHEDULER_OPTIONS\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"074fff8f393a89f88e5faca1c2b3fd2485d7385cb6608746ce496e4f9c35c937"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060WorkflowFieldRenderer\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ModelFieldCombobox\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"d00376d4d62892ba77e1b17c666cbdf10beb3f947f51816d88f5753b45b8e242"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060ImageFieldComponent\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndImage\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":518}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fcbe4eed1324ce90adaa59c2f7ea8599f509c3fc072455e07c392c439dc56dc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060WorkflowFormPreview\u0060 (slice \u0027controlLayers\u0027) depends on \u0060$templates\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"6628582b0f8ae4aa8b61285c3676879cbf8cf0a5f6238b7593b61fb57eb4aaf0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060WorkflowFormPreview\u0060 (slice \u0027controlLayers\u0027) depends on \u0060FormElement\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"f047e3434bc3e7e4108238d89cbcb161479c54b76675b12c243381023965fa01"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060WorkflowFormPreview\u0060 (slice \u0027controlLayers\u0027) depends on \u0060isNodeFieldElement\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f3ee9c8076bcb42af8a658539d73ba3aadb48650a026c5d7c54c46d946b2d94"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060WorkflowFormPreview\u0060 (slice \u0027controlLayers\u0027) depends on \u0060isContainerElement\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"958a57a441bd9f1b82ed97e4de17961a823740739b57cb3dc93ee3608d9ab59a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060WorkflowFormPreview\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DepthContextProvider\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"11c4ae06d0222c23b3d87d7cae688cbf4f2c842bbb4397823838ced11127ca32"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060WorkflowFormPreview\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ContainerContextProvider\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4aa7ce390b0b26db724361f74c570401a397b5ab487be15904ec8aba55638c6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060WorkflowFormPreview\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ROOT_CONTAINER_CLASS_NAME\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"2edbfef29a61ee647573df62601a30d4c90544d7a0a29ddab481c9795a7f09ae"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060FormElementComponentPreview\u0060 (slice \u0027controlLayers\u0027) depends on \u0060isDividerElement\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec4f1d4c36dff61917aa7d15cd6437cbd50ab102ec085a25d7d7182fb7f36937"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060FormElementComponentPreview\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DividerElement\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ef8cea892312c17c7e9ae61b0e81f80d734bfbd29ffde67c3ea00728388a8fe"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060FormElementComponentPreview\u0060 (slice \u0027controlLayers\u0027) depends on \u0060isHeadingElement\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef9575a4e665bea1ad15588ec5e2cf1291e6a3dc5e8a44b88c7e0b4da17005a3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060FormElementComponentPreview\u0060 (slice \u0027controlLayers\u0027) depends on \u0060HeadingElement\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d28509030f15bbcf74f274703184c7334e7636a68c4641fa11c14316db07100"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060FormElementComponentPreview\u0060 (slice \u0027controlLayers\u0027) depends on \u0060isTextElement\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ba5d7a9858193857b18ff5f9764942ac2f702c349e41b90664e26634f972b7f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060FormElementComponentPreview\u0060 (slice \u0027controlLayers\u0027) depends on \u0060TextElement\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"87126496036c8a2ae24457c4d229cf97b71981a85760f8b462c62b7524773bd2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060ContainerElementPreview\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useDepthContext\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"a59958e0aa0d3fba2e4987f7533a516bd35b9b23d6ab855c734b4686a038d5c9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060ContainerElementPreview\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useContainerContext\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a76f0e34baac43f7a064e375a148d114c362e8307220ce2c4eda2028ff448dc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060ContainerElementPreview\u0060 (slice \u0027controlLayers\u0027) depends on \u0060CONTAINER_CLASS_NAME\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dd55e2174527ac53cbdf1c6722b0651b44bab3df23cc7f4dc27b80ceeb0d9e3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060useCanvasWorkflowIntegrationExecute\u0060 (slice \u0027controlLayers\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8e9f476733faf9b74deec28dfd45fb8918d6c20917e10ae473141727904d873"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060useCanvasWorkflowIntegrationExecute\u0060 (slice \u0027controlLayers\u0027) depends on \u0060CANVAS_OUTPUT_PREFIX\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad0100a1bff163d44523d5d838912abe3ddb41c24e16961444f2f442ca9a86d9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060useCanvasWorkflowIntegrationExecute\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecf28d2f461283981dc5e9338199513be6403382981d588cec9161ae9d6f0ae5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060workflowHasImageField\u0060 (slice \u0027controlLayers\u0027) depends on \u0060$templates\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/workflowHasImageField.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"954bd53e04e3a0975a8c752b04c38ffec374f8752ea7160cbf1cbe5b70e82a16"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060workflowHasImageField\u0060 (slice \u0027controlLayers\u0027) depends on \u0060isNodeFieldElement\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/workflowHasImageField.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cd53d41e19b834589906c5490a63b060223c5d8ee3db25367040c3befd1f609"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060ControlLayer\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ReplaceCanvasEntityObjectsWithImageDndTargetData\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"07324c8a1650dca7ce35539cad9cbc775c56f568c286795c16adaa203375ffdd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060ControlLayer\u0060 (slice \u0027controlLayers\u0027) depends on \u0060replaceCanvasEntityObjectsWithImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed7d60485154c5a960fceb25bc8b36d0c4c6f0339b0ecd23ce7d4ed0f8024f89"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060ControlLayer\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9a7a68e938a44044bcd3b5e47c7e236660063653fd0af3e59fe3e37caa2cb8f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 imageActions: \u0060ControlLayerControlAdapter\u0060 (slice \u0027controlLayers\u0027) depends on \u0060replaceCanvasEntityObjectsWithImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapter.tsx"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f1c369d5d3bafdd13ffdd647f506d7a17db47903d610348bdbe51ced6ca0671"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 imageActions: \u0060ControlLayerSettingsEmptyState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060replaceCanvasEntityObjectsWithImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerSettingsEmptyState.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f3efbeac8d3bc54eac6f6b8e0fbaf98869960196f15d97b26ccf5b0a0524c2d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060FilterContent\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cf9d7238313fda4e006cce8a6821eb9b4b4100ff81e89eb648d302308212f04"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060InpaintMaskMenuItemsExtractMaskedArea\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsExtractMaskedArea.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"5abc3835b3524343f3848dbe0d10026662efc82e1150f01bb8685a8e6b7ab6f5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RasterLayer\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ReplaceCanvasEntityObjectsWithImageDndTargetData\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayer.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"a61e597d239883771f14eb6b32989e02e6b5ca58aca2bfe5556d2e4920f0f3f9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RasterLayer\u0060 (slice \u0027controlLayers\u0027) depends on \u0060replaceCanvasEntityObjectsWithImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayer.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"47f093285d8ce02beac67db4d5d3d913a75af8f52cf3f2a88452305f3950f873"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RasterLayer\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayer.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fb5e2492ebc0c8933685d185c8227a26b5c73f9def9cb049cef67571449d84a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060IPAdapterMethod\u0060 (slice \u0027controlLayers\u0027) depends on \u0060selectSystemShouldEnableModelDescriptions\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/IPAdapterMethod.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cd70269f6ca8a9379d721ccf6bb5c8c6d9b36a6e46b3406e57371d892ccaab5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060Props\u0060 (slice \u0027controlLayers\u0027) depends on \u0060setGlobalReferenceImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"b59aeba7919ed044f5c4be8b4931dd1a4baab375fd86366059192b382b3b6e53"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060Props\u0060 (slice \u0027controlLayers\u0027) depends on \u0060setRegionalGuidanceReferenceImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"32501ea9a51e596ac7a7efb2a088606679353e507f96400f7c23b7997aa4fc75"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 ui: \u0060RefImageImage\u0060 (slice \u0027controlLayers\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"16456418b88496a4911e934be6a41067052c447c6369ed663fd1819f0e8fbc6a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 cropper: \u0060RefImageImage\u0060 (slice \u0027controlLayers\u0027) depends on \u0060Editor\u0060 from slice \u0027cropper\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c180c145907238639374244a368d3cd97b03dae2f52100c59e593c8899c8e97"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 cropper: \u0060RefImageImage\u0060 (slice \u0027controlLayers\u0027) depends on \u0060cropImageModalApi\u0060 from slice \u0027cropper\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"fde63ce8d37b046e4a2f98ef0a4e93cfa8219351b9502f0bdca370eba54f2242"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RefImageImage\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndImage\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"c46bebd36f2983bfb0e0cf3bb25673f4db6eb5640951e0c9005f6431f4b206ec"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RefImageImage\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndImageIcon\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c0c64a94028aa9d033e1a419eb2007cc5463ac50b57f3eb20fe2466d6f2d6f8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RefImageImage\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"6571e1cb6474ef36dbcaa31609859e393bf65e894dfae551430870d4ddab5794"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RefImageList\u0060 (slice \u0027controlLayers\u0027) depends on \u0060singleRefImageDndSource\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"41d799905c0060eb3f24751c6fef430e8facb70c00c517cc1d3c33e7e8fc4f70"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RefImageList\u0060 (slice \u0027controlLayers\u0027) depends on \u0060triggerPostMoveFlash\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"c757c5eb130adcbf024b12e80305e8a167485f8a5ec94cf432c89e00ffa2d1b2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060dndTargetData\u0060 (slice \u0027controlLayers\u0027) depends on \u0060addGlobalReferenceImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"f10b163a6552c0b14420e22495ea61bd35e1236f107873524fa91925f4736753"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 ui: \u0060AddRefImageDropTargetAndButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ed6fb7ece54dcb84150358b6dca6f04132388e49e4c064319bae97bfaec3178"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060AddRefImageDropTargetAndButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"46fe33f8fe43eacb2b18629f54bfd7ff6932b3041384a5af31f30813ff46f349"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 imageActions: \u0060RefImageNoImageState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060setGlobalReferenceImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageState.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"02cf3d8d6ab64362bd885fe6f9b85d134c67153e1e7989b55ea95e0170a05416"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RefImageNoImageState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060SetGlobalReferenceImageDndTargetData\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageState.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"905b41edb9a1b2019e25b2d26a1dbf65ea21a7963da093def6327468f48dc053"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RefImageNoImageState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060setGlobalReferenceImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageState.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"84274bc51a51135de22ba63c639771e00f2ab8947cd301853837065a3aa78fde"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RefImageNoImageState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageState.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"60932e0879671470276526a2519dd6a34335629a370f14997ab51bcc6103a85d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 imageActions: \u0060RefImageNoImageStateWithCanvasOptions\u0060 (slice \u0027controlLayers\u0027) depends on \u0060setGlobalReferenceImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageStateWithCanvasOptions.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbd6c6c6c7906548b91d348e5792ca289f05f5f8ec4fb15e9b4fc13035fb4402"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RefImageNoImageStateWithCanvasOptions\u0060 (slice \u0027controlLayers\u0027) depends on \u0060SetGlobalReferenceImageDndTargetData\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageStateWithCanvasOptions.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef260fef9baaec067a923dda205cf0b3c17a386fac636aa1f000bd2cecb4e2f1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RefImageNoImageStateWithCanvasOptions\u0060 (slice \u0027controlLayers\u0027) depends on \u0060setGlobalReferenceImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageStateWithCanvasOptions.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"87f5fc3a7092280cbfc6ba0069da771faa75b0264a8bded1f2331a2f0f6e9fca"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RefImageNoImageStateWithCanvasOptions\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageStateWithCanvasOptions.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"8220746a98f6d532bbbd2e78a6973c7549126dcd78da14edfc6ab6d5945e7678"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 auth: \u0060RefImagePreview\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useMediaUrl\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImagePreview.tsx"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"bab03efd95de5c69f87f44ab450b69bd58f5abd09e8d0f5b2069664c7484d2de"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RefImagePreview\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndListDropIndicator\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImagePreview.tsx"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"1df68fb870ee138b2c7c65630c0cc2c38f4dc94cf9d1e4292bbc7606c9f22fe1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 ui: \u0060RefImageSettingsContent\u0060 (slice \u0027controlLayers\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecc5a2fb0d7435cf6b2ed55c59c047327072792c1a6593078df760595ba78233"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RefImageSettingsContent\u0060 (slice \u0027controlLayers\u0027) depends on \u0060SetGlobalReferenceImageDndTargetData\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8e81d737133c2c1cb834ecb85abd847fa0b0efd0c101a91557e43efd5354943"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RefImageSettingsContent\u0060 (slice \u0027controlLayers\u0027) depends on \u0060setGlobalReferenceImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"bda1426c94cedb751757c36928b502fa7f4a68c62acdd6224883846cf474f964"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060useRefImageDnd\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndListTargetState\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/useRefImageDnd.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"b898b9d16646f6d63d79806d256fab3b03bb80ad053fc128adf9103becaf32b7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060useRefImageDnd\u0060 (slice \u0027controlLayers\u0027) depends on \u0060idle\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/useRefImageDnd.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3f7bdd51edd1ce7e3fe67c1fbdb52d7d2c86037414b31704801941d79593b21"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060useRefImageDnd\u0060 (slice \u0027controlLayers\u0027) depends on \u0060dndInputFix\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/useRefImageDnd.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"93d9353743f7885802c94f0dffd7d36bf0345a6281074ba8e94b2cac77b3f516"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060useRefImageDnd\u0060 (slice \u0027controlLayers\u0027) depends on \u0060singleRefImageDndSource\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/useRefImageDnd.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"6726a0b5d10fa5ee8d60f59f826ad35d7d485eca8a8afe3a249e7eb666c20b9f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RegionalGuidanceIPAdapterSettingsContent\u0060 (slice \u0027controlLayers\u0027) depends on \u0060SetRegionalGuidanceReferenceImageDndTargetData\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettings.tsx"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"124305b12ad54fad99851464baa95ec8fddd50355e00a1b9368d31128e093847"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RegionalGuidanceIPAdapterSettingsContent\u0060 (slice \u0027controlLayers\u0027) depends on \u0060setRegionalGuidanceReferenceImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettings.tsx"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"df848cda15fb7f00ecd27388db4e078b8939b3d07de40185fef9b0dcd55fa922"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 imageActions: \u0060RegionalGuidanceIPAdapterSettingsEmptyState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060setRegionalGuidanceReferenceImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettingsEmptyState.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"73bd13a1c00600887dcb3d7633a0a6b92265cae5badd914f60d069080573e476"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RegionalGuidanceIPAdapterSettingsEmptyState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060SetRegionalGuidanceReferenceImageDndTargetData\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettingsEmptyState.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3e06346e70065c043caea9c5ae116c9401839320a32e58261bb67d09c0be00f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RegionalGuidanceIPAdapterSettingsEmptyState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060setRegionalGuidanceReferenceImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettingsEmptyState.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"24496a21c2f56ae277b1c9db32c031b0f0c33baf72f19d3b6e7c750e9ddb5d54"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RegionalGuidanceIPAdapterSettingsEmptyState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettingsEmptyState.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"0272ba1d28e98f513f3def68aa0cb0e5d5af8496cd7d12396f5553f4f8346b61"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 prompt: \u0060RegionalGuidanceNegativePrompt\u0060 (slice \u0027controlLayers\u0027) depends on \u0060usePrompt\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceNegativePrompt.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d63c8922894f07f1f2e522718b4070496f29f6b4c39173a2f692f69089ca998"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 prompt: \u0060RegionalGuidanceNegativePrompt\u0060 (slice \u0027controlLayers\u0027) depends on \u0060usePromptAttentionHotkeys\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceNegativePrompt.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"18ae53624d181ff4dd951a136b85f472fabd999ea052ce597e7a40a7b6d65ab3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 prompt: \u0060RegionalGuidanceNegativePrompt\u0060 (slice \u0027controlLayers\u0027) depends on \u0060PromptPopover\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceNegativePrompt.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"898bf0ba89de69af311695c4840514d3dbece2137b0320902dbe37bbe2bfa420"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 prompt: \u0060RegionalGuidanceNegativePrompt\u0060 (slice \u0027controlLayers\u0027) depends on \u0060AddPromptTriggerButton\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceNegativePrompt.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"e820b890dc248fec2df9bc1304b60d2e6c893e63560d270209fc3fb78ae91973"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 prompt: \u0060RegionalGuidancePositivePrompt\u0060 (slice \u0027controlLayers\u0027) depends on \u0060usePrompt\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidancePositivePrompt.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b9b12fe547b0ccbfc48009e5010fe9df44151f54d47069353ca131d8c7ae799"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 prompt: \u0060RegionalGuidancePositivePrompt\u0060 (slice \u0027controlLayers\u0027) depends on \u0060usePromptAttentionHotkeys\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidancePositivePrompt.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c265e1fcb504c743e0b9d6bdc6a5f3bfad700e20178681356a3616702d900ab"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 prompt: \u0060RegionalGuidancePositivePrompt\u0060 (slice \u0027controlLayers\u0027) depends on \u0060PromptPopover\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidancePositivePrompt.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e4938a4805ff8dcc62f1439e5b326bbf712a04c18ad71a2f890b85d68a11e22"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 prompt: \u0060RegionalGuidancePositivePrompt\u0060 (slice \u0027controlLayers\u0027) depends on \u0060AddPromptTriggerButton\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidancePositivePrompt.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfdd857a4d00e7c7c18b7c75bb5795140fb87176ed94f9fe6452a537db732d09"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060Props\u0060 (slice \u0027controlLayers\u0027) depends on \u0060setRegionalGuidanceReferenceImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd56f30396618d4e5891877c1f71a05fb9d01d34d835dd6c3d046239e89a245c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 ui: \u0060RegionalGuidanceRefImageImage\u0060 (slice \u0027controlLayers\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b448defe2dc556791c495a72a24aaf6ec8ff0de6e10382be832c9e090be7968"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RegionalGuidanceRefImageImage\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndImage\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef1d225b949c36456f103c6dc6c083f4e3e0b80f0345708b318c8bcb1c1b90fe"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RegionalGuidanceRefImageImage\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndImageIcon\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"be54df33bbbc8fbe6dc8fee9c70b654b98c3b41aa0d42c1ae966aa775f3ca4e8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060RegionalGuidanceRefImageImage\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"492648b643cd23f13156b6ae87c540a7dc93b45f1a4c2ebfcdc3df2d22957041"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060SelectObjectContent\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObject.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"945a911f55daad097bc4955c30a6949672568f400dc960ebc96dd8c29c135b46"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060QueueItemPreviewMini\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/QueueItemPreviewMini.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bd35b6e72c222b2aed7e1f9c0dfa593e6b7ae34282937139dd9d9caf44ac2ab"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 dnd: \u0060QueueItemPreviewMini\u0060 (slice \u0027controlLayers\u0027) depends on \u0060DndImage\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/QueueItemPreviewMini.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"883a780e3698d10e49808b0de985eaea2fcc448096d40152b19bbcbbbf3867cb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 queue: \u0060StagingAreaToolbarAcceptButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useCancelQueueItemsByDestination\u0060 from slice \u0027queue\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarAcceptButton.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a93514da45b969792038520fed7656f35105c08b57a1b3061b155b470068fdc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 queue: \u0060StagingAreaToolbarDiscardAllButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useCancelQueueItemsByDestination\u0060 from slice \u0027queue\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarDiscardAllButton.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"437b17a0a97983dd84251e8d127db207d722564a716dcddf29f10aa6d308bd25"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 queue: \u0060StagingAreaToolbarDiscardSelectedButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useCancelQueueItem\u0060 from slice \u0027queue\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarDiscardSelectedButton.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"87f02034f50061e260f23e47a99cb44a6ef95180ff2df4608b42a78c2498ce8f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060StagingAreaToolbarNewLayerFromImageMenuItems\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenuNewLayerFromImage.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"4766f58d537a85a2e3b8f1397a0c37584adafa7383d69f8b752609346c5ee632"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 imageActions: \u0060StagingAreaToolbarNewLayerFromImageMenuItems\u0060 (slice \u0027controlLayers\u0027) depends on \u0060createNewCanvasEntityFromImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenuNewLayerFromImage.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"906a43f045031718a923188d41cfee050a7aa6b4df0a082294605889d61e4458"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 gallery: \u0060StagingAreaToolbarSaveSelectedToGalleryButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060selectAutoAddBoardId\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarSaveSelectedToGalleryButton.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6f471563f004dee6c7cbf1c8db3338ed0489ad7e734b4dc722c100aedc04a4e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060StagingAreaToolbarSaveSelectedToGalleryButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarSaveSelectedToGalleryButton.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b1a6b7fe26a187fe9f4ee25aaed91b3f6701cf22fd617e9343c9c66d6d443ae"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060getOutputImageNames\u0060 (slice \u0027controlLayers\u0027) depends on \u0060isCanvasOutputNodeId\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/shared.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"52b99353c65292613f0ce35c0c6f3fc5b4d3db30e70c01650cc3aaeee8bd3572"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060getOutputImageNames\u0060 (slice \u0027controlLayers\u0027) depends on \u0060isImageField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/shared.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"c74d728521ca10e4afb74aa910cfd491d22569b79108106213ace7cce9cd086e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060getOutputImageNames\u0060 (slice \u0027controlLayers\u0027) depends on \u0060isImageFieldCollection\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/shared.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"40a3d53990bd45bb6d99144748db20e213041aa7a7793ff78fd2cd7562474d97"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060ProgressData\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ProgressImage\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/state.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"f509b62a3f18635656ffd06dcd223d8c4e51ff1d5aa6d044a092e522719b0110"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 auth: \u0060FontSelect\u0060 (slice \u0027controlLayers\u0027) depends on \u0060selectAuthToken\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a42cb21ca5c635c97da8bfbf6c5f97b216ddbfb45ed35408ac14038e6df6cfa"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060FontSelect\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a4827c9e8759c21b3abb428214c1230abc735db80f96454ea2c8f9305a6b7e3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060ToolBrushButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolBrushButton.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"e68ada23e7e7ba4f1e92dc6e81218a2a2b34d2dbedccbff08f3ac12877b6cf96"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060ToolColorPickerButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useSharedInfoHotkeyTarget\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolColorPickerButton.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b0540aad4a4b50cfa6688bf3fc4acb8745438c6ea32ffdbe3c1c11dac2e0ba4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060ToolColorPickerButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolColorPickerButton.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2ed116111affa3178e3256a64437504ecaf56803d4ef3765ba6fd5c9a85730d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060ToolEraserButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolEraserButton.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a6959e048648d047182d45950788a4eea84e8ca177997d2a2aaf158dd4edb3d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060ToolFillColorPicker\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolFillColorPicker.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9aa3f82b98174274640ba091309c0d84d594c46844850c12e45487f6f70c587"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060ToolLassoButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolLassoButton.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"0020ef9a7ec1d36ca4266434c71b7406924f355afd7570d102751f6cff2e6de7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060ToolMoveButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolMoveButton.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdcadcf30bea14d7eb41edb4d8b47e352a03de0380d0332ff22cad760495bc49"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060ToolShapesButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolShapesButton.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"b375167e639a2ed288b45e33c92cbde96f2a87eda934094c942940a6ddcd98e6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060ToolViewButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolViewButton.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"013a0a19c7ceb22968b9b9843c5fe0f55169113f7c8903ec5bf48332135c85b4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060ToolWidthPicker\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolWidthPicker.tsx"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"931330d4d283cab854314b38ca16695f27f7be5a8610db412f005ce5531fb729"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060CanvasToolbarFitBboxToLayersButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarFitBboxToLayersButton.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ad5c830d0b42c97bd8654e814dd39813f73cdf5e86171d2bdf29b1186d7aa6a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060CanvasToolbarFitBboxToMasksButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarFitBboxToMasksButton.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b2cbdc1342649c10c3101962164ffb6d057d4a4a04d30debffb8978559097e8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060CanvasToolbarResetViewButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarResetViewButton.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfcefb8f177424ca3b1948789a3c88f96506dcb8fe8eba26f04f1918b3c03af9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060CanvasToolbarSnapshotMenuButton\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarSnapshotMenuButton.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"c625ed33f8884fd0363a83e3daaed23eb05f1bdaa549507cca90537ebc996ee9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060TransformContent\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Transform/Transform.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"c72305e7f4802e584197fd3eebb3e1c4431fec816e7b9af9d8ee8d7e1d5cdd5f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060selectDefaultControlAdapter\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/addLayerHooks.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"118493b3f18ca893cc2c122edc15ba347fe3346a97aeac4bae279d12240a41af"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060useCopyLayerToClipboard\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/copyHooks.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"5586d78a305985b58af71dd25c2828c84fd313fd1e6804aeffd9e3bef64d728f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060useSaveCanvas\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"35a6f4840d2e855ed9a4e86bc22e111a3de63c248ca9294fadfea0fca8090aa5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060useSaveCanvas\u0060 (slice \u0027controlLayers\u0027) depends on \u0060Graph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ed8c627c7e104bf3affe1f4443f18c0125da1aa10cb740fc956c0e1228a6513"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 gallery: \u0060useSaveCanvas\u0060 (slice \u0027controlLayers\u0027) depends on \u0060BoardId\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f9ca55d9923de1c8f4cdc362f8b58f9d51fdd62385b7617b4d83f99bdb8bbf7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 gallery: \u0060useSaveCanvas\u0060 (slice \u0027controlLayers\u0027) depends on \u0060selectAutoAddBoardId\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"4312f4611771d09e4ac6492b3e29e37d672aca177c3021829ef89c4fc88a4c59"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060useCanvasDeleteLayerHotkey\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasDeleteLayerHotkey.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f48f538112aa67264edfd891ca2f5c5d35fa9c6f826b00f240918e2a881fd73"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060useCanvasEntityQuickSwitchHotkey\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasEntityQuickSwitchHotkey.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"f067b0e47dde64bd55f2ca7f01d490b6f1b0a36286ada69aa68ad1921daee6cf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060useCanvasFilterHotkey\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasFilterHotkey.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"476fa3ae050f6537602d87c18bdef06e6e4dd7dbf8b03bc097158088b8b50863"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060useCanvasInvertMaskHotkey\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasInvertMaskHotkey.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"532b93700d1387dd596e90dcf891990798e0c743fc368365d84469f2a8bbe4fc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060useCanvasMergeDownHotkey\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasMergeDownHotkey.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"c26e5b20aa10e917287b03d71ee63e29056c01c09d21b5a7ba64edd6ec8cc1d8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060useCanvasMergeVisibleHotkey\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasMergeVisibleHotkey.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"b62b8b2affd12d7453767c804ca78afde14c000ee1f1608041dcb4295de81d0b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060useCanvasProjectLoad\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectLoad.ts"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"04fbdd277c8d74a39183487e449e772b45331fb8fde04b7972ba1c7a59aee22a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060useCanvasProjectSave\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectSave.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c306a19a00b8e9aaff6427c3e637e8d8c78b16e4c97c6500a60c08af082ae1e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060useCanvasResetLayerHotkey\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasResetLayerHotkey.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"1212324e5367781f4b9a526863758a225cdc3b75b64c49be268471b893e8c5f0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060useCanvasSelectBboxToolHotkey\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasSelectBboxToolHotkey.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3fbf9570bf96bb46c8cead11f9a83e615ef2225f5cb4a89063d69eaeff79cdf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060useCanvasToggleBboxHotkey\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasToggleBboxHotkey.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"1172db73dffd20942ae7d6eef5cdf3cbe1469e11314d11759503000a0ca2b246"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060useCanvasToggleNonRasterLayersHotkey\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasToggleNonRasterLayersHotkey.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"09fba052ba05df8abe801377f362521b8e6376b3fb4ff29dbb9bf6c2f90635d4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060useCanvasTransformHotkey\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasTransformHotkey.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f0fc888e3d2f1cd76212c91cc5f9f1a86a98258f6d9eb8decea912cef2c12cc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060useCanvasUndoRedoHotkeys\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasUndoRedoHotkeys.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"adc47a886be44c8045d1dbe97372149a8ff89e06f7f3da53b521190e63a42cf5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060useExportCanvasToPSD\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useExportCanvasToPSD.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a7e95e0ea35aa9a44823aac12f3a33a8e428cfdbb8600b197eefdd5e73e995e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060useInvertMask\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useInvertMask.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"654450c68ce72cb402c3a310b04621f40458bcba779536289bde55d21aa49246"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 system: \u0060useNextPrevEntityHotkeys\u0060 (slice \u0027controlLayers\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useNextPrevEntity.ts"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1a29853af62b5da6397d68a86f8cb12506a081788f9b466b4ad86f0475c8a3d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 gallery: \u0060useSaveLayerToAssets\u0060 (slice \u0027controlLayers\u0027) depends on \u0060selectAutoAddBoardId\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useSaveLayerToAssets.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed2e564116fea3b9b07cd31182d942a164d731102527ac3178c3f0d467bdc2b1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060useSaveLayerToAssets\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useSaveLayerToAssets.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfa88803af43b90bcfb7a695d76f2708e169fe6476c17ec7ef21a80feb179ac8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060CanvasCompositorModule\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"8360a17e7df865e3387531f893f505fac6ab53515a3d1b0e9ca1eb6fd02db30c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060CanvasEntityAdapterBase\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts"},"region":{"startLine":598}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0a9a4bc1acc1f27ade905f467a646fb190d8e27f75b0aecedfd3f9969ffcca5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060CanvasEntityFilterer\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"20387046f749620b61713eaa022e2cab2cb389abbb020addac6560d375d20260"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060CanvasEntityTransformer\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":829}}}],"partialFingerprints":{"codehealthFindingId/v1":"79030054c732ad655da6970b9b3af23b5edf361080c397e8643e66650bc5be0a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060CanvasEntityTransformer\u0060 (slice \u0027controlLayers\u0027) depends on \u0060Graph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":902}}}],"partialFingerprints":{"codehealthFindingId/v1":"765535df2f6dc67a08d5bc2ef3aebcbf59f00c35205a457030d674f62a8dd29a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060CanvasSegmentAnythingModule\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts"},"region":{"startLine":1157}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2b61df42e96442efbe3344eebbe292af2ef903838223b5bcbdac86374f861d4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060CanvasSegmentAnythingModule\u0060 (slice \u0027controlLayers\u0027) depends on \u0060Graph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts"},"region":{"startLine":1458}}}],"partialFingerprints":{"codehealthFindingId/v1":"42e3d0a42a400b79efc18afb7207559b02e2e8ae962ce605148ed51900a8aabc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060CanvasStateApiModule\u0060 (slice \u0027controlLayers\u0027) depends on \u0060Graph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStateApiModule.ts"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"ceaca38aa01933fbe9ec28d1f61516c155cb9a8ea5c280a1b719eccfe47ad5da"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060CanvasStateApiModule\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zImageOutput\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStateApiModule.ts"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"ced8450fab027daefcad675ef61dd94055e26c3a940ba85d2e32ca48abffe047"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 ui: \u0060CanvasTextToolModule\u0060 (slice \u0027controlLayers\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasTextToolModule.ts"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"eadefdd463e81ef387c8f6f439270ce203b0436d5eecd7a8299f27fcfad927f4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 toast: \u0060CanvasTextToolModule\u0060 (slice \u0027controlLayers\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasTextToolModule.ts"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2560a033951570c6ab8d66f28394eefffcf9ac569f35d075ea34bd16a37d415"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":613}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba2a0026c1edc502f4505a2bf94ebb588bfc7bb0715a77a254b94b3239fa6148"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060getGridSize\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1215}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e39cfbb56a4f11046a49c105432dac24843a0882eb13453bcc2ca1a84e414f4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060getOptimalDimension\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1370}}}],"partialFingerprints":{"codehealthFindingId/v1":"90793d86cd1c6871d0c6da4bc17b6cb9cefb58c1bae09f00049a89a220b9a3b3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060getIsSizeOptimal\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1390}}}],"partialFingerprints":{"codehealthFindingId/v1":"82814db8fedd4cf10e8cde917c0b37b7a75afba3a8d5fab7db3496dc6cc0b860"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 auth: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060logout\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1846}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb517c10bca20b9124479e351fa4022d2625db4f49949c11bbadd47b06901e2b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060isMainModelBase\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1870}}}],"partialFingerprints":{"codehealthFindingId/v1":"63ca23128333d238ac4297b23ffbc47966dc196a1bc4cde006fb6cd808f09c17"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060zSpandrelFilterConfig\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/filters.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9eacf627484e41f5b19769f7773ec03bdd222d05c44eb4d1b518d2c743dc9ea"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060ImageFilterData\u0060 (slice \u0027controlLayers\u0027) depends on \u0060Graph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/filters.ts"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b1920d5a9e3638e3de3571729a4489f5568e62ff7bd0a9a2c485e4dba433b9d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b9ec8c3edf0a5d856bc6569375869a4da1d462df271c9257203c7c0b58011d4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ParameterCFGScale\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"40e68e6f1463a09b64f5857173926f3e0d6643f1e3fee3375c133fb8599c8ac2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ParameterGuidance\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"933c55ee7bbb5ef831bd1c149c25ef515330c259debc6986503d8d10096e474f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ParameterCFGRescaleMultiplier\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"10528458c0d128b20c68abe346caeb49f7fd07c5a25aa0bdb025b062a64c7ed2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ParameterScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"27642125e14372b92ad12d0962067b27844f72d64721a791940fcac4f857c7b9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ParameterFluxDypePreset\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"b708cb27f0452d7f278e6563d28b1503448c7a3a50c536ba53ed266eb8aa017c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ParameterIdeogram4SamplerPreset\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d3a8b69d4fe9e006464ae85482b765f36449cd470b8520dfde0eb18b4b40f39"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ParameterModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"76c4efc2c5a1e4b70f1cf0aff06ec23e7b21bdd9ebb04393dbcb44f45d51e820"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060getPidDecoderBaseForMainBase\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccaffe7c3f8929cbb930d64a7af5b29e7d56b978f615cf392ce2a2abbc2d7d23"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060getPidScale\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"37e71ea457d86c13469fbd919c6511a0a3fa841cc94c2b3ebae554b3ca9569c3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060getOptimalDimension\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"04643d0d8a6f20e4663dcd9005f23e106b2019973cc723bb183f4478f8b3e339"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ParameterVAEModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"beb7ea93b66f6fe92e419ed435a5d9220453a665483651a3daf03315ca9db92f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ParameterT5EncoderModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f3e336fee66589ef24d5e052bb3a3a0cd71623787a02c370acf4ea9792b4aed"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ParameterControlLoRAModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e06727442a0b0f33f902eca0b5be1036d682f1e7a1a98ea015d77c012a9bfce"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ParameterCLIPEmbedModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ef58dcab83651b36cf425e8049c32104c826053829db98b187270981c03da65"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ParameterCLIPLEmbedModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"69e576138f3d12f248a15cefc2da26b3ff54ed3dc2b8b0b527abd0eba6dc4f35"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ParameterCLIPGEmbedModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"640c3d90edef18735325978fc985466a43d5b12ab412f5a1d04bd7d634a4eb53"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":303}}}],"partialFingerprints":{"codehealthFindingId/v1":"aba3235d8229334c0b7bdd4af507fe4f7a9df0e9d35427582b01d52f0eac0cb7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060BaseModelType\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"19b3eb93b217426a52a9827fd62cdf8e9258edb9e1fa67e351e6331af9459203"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ParameterPrecision\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":524}}}],"partialFingerprints":{"codehealthFindingId/v1":"74983874d610c169860f1c84042c936b2918b29d879a448131734996a58d7e5d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ParameterPositivePrompt\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":536}}}],"partialFingerprints":{"codehealthFindingId/v1":"be2de97bbf4bd387b0e26bff8e071ca6fc3eb83b3bdb5d104f911464ab2d220c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ParameterNegativePrompt\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":570}}}],"partialFingerprints":{"codehealthFindingId/v1":"087f43213997e776093ba1b77c491afbae19a431cfb86a0830577998dfb59b13"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ParameterSDXLRefinerModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":573}}}],"partialFingerprints":{"codehealthFindingId/v1":"69b109ffa411aa6f8233e461345c5239bdf6ad6e63b284d73ca2931dc8d0ef3f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ParameterCanvasCoherenceMode\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":613}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1b8e13e869a6bfccc1d8ae2a0582ae27661791f837de66ea43cce8bc3044bb2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060getGridSize\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":626}}}],"partialFingerprints":{"codehealthFindingId/v1":"d62bf629af2d7dc2abaac0ff57f2c35b35d827bce3244de36bdfd1779584376a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060getIsSizeOptimal\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":741}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac7df323255221d0dba94d3c3bd424f68d5edf5a922698d17ba5f5a83978c0d5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 auth: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060logout\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":801}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6fa754467365acb18c9d1011071afb2cc2b0df5e727de3ae0c28d908761c4a2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060getModelMaxClipSkip\u0060 (slice \u0027controlLayers\u0027) depends on \u0060CLIP_SKIP_MAP\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":834}}}],"partialFingerprints":{"codehealthFindingId/v1":"95711cb78d5c4e403d380ec6a196651f76c8ed579a0c87720749d5531ea2ecfe"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 modelManagerV2: \u0060selectModelSupportsNegativePrompt\u0060 (slice \u0027controlLayers\u0027) depends on \u0060SUPPORTS_NEGATIVE_PROMPT_BASE_MODELS\u0060 from slice \u0027modelManagerV2\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":1383}}}],"partialFingerprints":{"codehealthFindingId/v1":"e045dd8a4fe7fc5d0b6f4028f0d340c0e15460b277c9172259685afc7da3f1d9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060selectModelSupportsRefImages\u0060 (slice \u0027controlLayers\u0027) depends on \u0060hasExternalPanelControl\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":1390}}}],"partialFingerprints":{"codehealthFindingId/v1":"f255c61c85f1b2d1ba29ef02858674dbe9259a60904cc98c6786d071c3840ab4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 modelManagerV2: \u0060selectModelSupportsRefImages\u0060 (slice \u0027controlLayers\u0027) depends on \u0060SUPPORTS_REF_IMAGES_BASE_MODELS\u0060 from slice \u0027modelManagerV2\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":1395}}}],"partialFingerprints":{"codehealthFindingId/v1":"5513e6ffd180c61d3b514bcd4843f6fce6b90bfb9d2e171c4ab4384be3b5a138"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 modelManagerV2: \u0060selectModelSupportsOptimizedDenoising\u0060 (slice \u0027controlLayers\u0027) depends on \u0060SUPPORTS_OPTIMIZED_DENOISING_BASE_MODELS\u0060 from slice \u0027modelManagerV2\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":1408}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b15d7ce7be327189188e099cf3fa542a9a15d6c950615524319a4008864f1a0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060selectSeedControl\u0060 (slice \u0027controlLayers\u0027) depends on \u0060getExternalPanelControl\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":1452}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1528b5682dc0b1db82813c6cb3250a61ec6414b8e943b99baaaa7b644bc569f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"c865606e30a7c89ed73b3d1961714fda7ea3fa9864792fd4a4598286de859740"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 auth: \u0060slice\u0060 (slice \u0027controlLayers\u0027) depends on \u0060logout\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe4b1940eca96a2305056afa1baa02fbef375fdddf046560f4c96bf81b61ab6f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060selectOptimalDimension\u0060 (slice \u0027controlLayers\u0027) depends on \u0060BaseModelType\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae6018b19e6bfb0eda50ed72e39bb47cf6b8026c96fb4063991e30a661e34796"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060selectOptimalDimension\u0060 (slice \u0027controlLayers\u0027) depends on \u0060getOptimalDimension\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce8ffe822c6ace485c83c6d67f6a63d733f9f3b07fb764ba6956c879114c5f6f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060selectOptimalDimension\u0060 (slice \u0027controlLayers\u0027) depends on \u0060getPidScale\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"19bf27fee7487a827ce2019023926e8df5b31b759f06462161009fd6b2fbf4e8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060selectGridSize\u0060 (slice \u0027controlLayers\u0027) depends on \u0060getGridSize\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"6634b78a70b31267d463fe3738ff3d690c28a28accd6b3065cbae9e3841cf20b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060zIPAdapterConfig\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"29b26187f0ef0177120cc68a6f589e63cc7cb51384ca689e35089ee362c4a3e2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zCanvasRegionalGuidanceState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterPositivePrompt\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"d76d10bcc8fa010b02a1883ba8fee17bf37b8153b0bbcc33ce696ee20cf9afb4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zCanvasRegionalGuidanceState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterNegativePrompt\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":536}}}],"partialFingerprints":{"codehealthFindingId/v1":"9418910d7611e4400bd9ab52723f6604247ca65e6e42e39092816f043de34245"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zBboxState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterImageDimension\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":810}}}],"partialFingerprints":{"codehealthFindingId/v1":"3da4c37f4be6fa1f692cdac9b9532e506b8bed116917e196f1053521d827cf75"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060zBboxState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zMainModelBase\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":819}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1b45ed7a4035823046ebdbcd596c7130a2993ddcd647b638b78ee4386144fd0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterMaskBlurMethod\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":850}}}],"partialFingerprints":{"codehealthFindingId/v1":"8199d8a6b9586be50eef068986b332450d66df2cc727836d3a82212cb4571c3e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterCanvasCoherenceMode\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":851}}}],"partialFingerprints":{"codehealthFindingId/v1":"574d13889b0165a08b8b68fe2454f023e75f6627f5a20d8af942ec5e0f2d39da"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterStrength\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":852}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f606d733b490f86cc16a00dcafca53ca54dce35f3ab335e43985efda74c1362"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterCFGScale\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":858}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e578e7612b70133901576601ce987b13a7e23aff46d1e7e464f0f563befbc79"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterCFGRescaleMultiplier\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":859}}}],"partialFingerprints":{"codehealthFindingId/v1":"cffa74c8bce6c219a319dec4dad735f978a491d2cae744ed99bc8da8785b07e7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterGuidance\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":860}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee8ab33b343ddb07712994263d08ce15045dba563f57fd74ea357ab374070211"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":873}}}],"partialFingerprints":{"codehealthFindingId/v1":"a978399dd781ee51204c339207a2c8490c984a644393507b4a67df17633f5ea2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterFluxScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":874}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf7bbf2ce48185a53afa4306d0c92b6d669a49f78000fe9dcfd295326778b8f1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterFluxDypePreset\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":875}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d18446c9fc58b8946381b5ba4ec107c6322d073fa1e61bcf3641dcbdc707be4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterFluxDypeScale\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":876}}}],"partialFingerprints":{"codehealthFindingId/v1":"7754287911a267fbe57a2bd193317e709debb9b00048e9230323d8d30bbbbb74"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterFluxDypeExponent\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":877}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc6f49d9ca98691fa30e0e2777a44fd031d5a3617c15304fff88784921a0c042"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterZImageScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":878}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ce4169d5054f07b8a971869db42a92fa02d9f27b2d7ea8ad7609b226361a99b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterErnieImageScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":881}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c324e10a4a6298c94417c526da52da4e2b5d504c6a68424a52253ba0bf49188"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterIdeogram4SamplerPreset\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":883}}}],"partialFingerprints":{"codehealthFindingId/v1":"609e8c981a454a3ad6c0eeb1408dd7e38bcf33f6e8c8a89b08f611866b80d165"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterSeed\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":895}}}],"partialFingerprints":{"codehealthFindingId/v1":"81b6139653b42889f090c4f5b63d548bf315e082de9c22b869e899b154450724"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterSteps\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":897}}}],"partialFingerprints":{"codehealthFindingId/v1":"3471f7e7a45004c0552c2679ad5dc842f5a83effcf0becf3563d6e0f30300577"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":898}}}],"partialFingerprints":{"codehealthFindingId/v1":"b35aeeb7d82604e76a53c94ddadf906b8f90ee2063f5cf9ec294db6c110eed3a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterVAEModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":899}}}],"partialFingerprints":{"codehealthFindingId/v1":"74af292ed4b81748daf2e4672b87e9318304d6af8cd52fce58ed044fecbf7da0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterPrecision\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":900}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9a8b97eeec5f813c12eccb6956b0a4ee762731ce52475962517d6963a3ee98e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterSDXLRefinerModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":910}}}],"partialFingerprints":{"codehealthFindingId/v1":"056ed12740657d5aba760e02d3453942b599118f08eb50596646fdcd3cb06f62"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterT5EncoderModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":917}}}],"partialFingerprints":{"codehealthFindingId/v1":"d047239ef3b03513c932f076fa4d4694c8408d177570dfc42a465906fe238d17"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterCLIPEmbedModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":918}}}],"partialFingerprints":{"codehealthFindingId/v1":"70e1bddd3cbb8e38ec01f854183897f3b4590426a57a46989a8486c0f81874ac"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterCLIPLEmbedModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":919}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7d12ef99edd968e2b1e8d7aa4e6e6487ef3b7e41e3b0d25f387e48fc92b1f2d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterCLIPGEmbedModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":920}}}],"partialFingerprints":{"codehealthFindingId/v1":"58ea2e3e5a29a6cf6045462113ab96b58619ee8f3c564340f99b70cc50637f45"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterControlLoRAModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":921}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2e1162a6782d904f7d7c49f8d3d8e9d740c3bf17d1ede720d75b9ef43626efa"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060zParamsState\u0060 (slice \u0027controlLayers\u0027) depends on \u0060zParameterAnimaScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":929}}}],"partialFingerprints":{"codehealthFindingId/v1":"311acfa4f456b1985648a0a72b32c11f27cdfebddc1c3130179fbe60daaa4bf8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060areBasesCompatibleForRefImage\u0060 (slice \u0027controlLayers\u0027) depends on \u0060ModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ad383e6311ebcdc5d5aff2ee925f091181c21ad114992e8348023c7df71e4c7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 nodes: \u0060getScaledBoundingBoxDimensions\u0060 (slice \u0027controlLayers\u0027) depends on \u0060BaseModelType\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/util/getScaledBoundingBoxDimensions.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fa10ae27f5fd90056956e48747fe18a300524858307ebaa4519833fbc8d92e4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060getScaledBoundingBoxDimensions\u0060 (slice \u0027controlLayers\u0027) depends on \u0060isInSDXLTrainingDimensions\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/util/getScaledBoundingBoxDimensions.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b725ebb18ea3dfb9e4ce9a12b129ed70002dc579167eacbd35f6cfe6e293641"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060getScaledBoundingBoxDimensions\u0060 (slice \u0027controlLayers\u0027) depends on \u0060getOptimalDimension\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/util/getScaledBoundingBoxDimensions.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"3770515e554aa4945e868dfac04755b5b597e201e3b4d23f3fba1191ce1ed6dd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: controlLayers \u2192 parameters: \u0060getScaledBoundingBoxDimensions\u0060 (slice \u0027controlLayers\u0027) depends on \u0060getGridSize\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/util/getScaledBoundingBoxDimensions.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"e523faf247845ace86b5e881391385c40a713442e1656fc926707be0d6da777b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: cropper \u2192 controlLayers: \u0060getAspectRatioString\u0060 (slice \u0027cropper\u0027) depends on \u0060AspectRatioID\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/cropper/components/CropImageEditor.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1e38ede8f3cc03a0789d5caba2564a5681f7ed792b0530a39354a7483b4e711"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: cropper \u2192 controlLayers: \u0060getAspectRatioString\u0060 (slice \u0027cropper\u0027) depends on \u0060ASPECT_RATIO_MAP\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/cropper/components/CropImageEditor.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"579870817cc3c7985ac11783df91532e8cada3d54c75a58b6972c6acd6da1a98"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: cropper \u2192 gallery: \u0060CropImageEditor\u0060 (slice \u0027cropper\u0027) depends on \u0060selectAutoAddBoardId\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/cropper/components/CropImageEditor.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7ea81f8006bdf4edd8c29fedb0de0b5d24b45d9363c7536b0156a7e024e8cba"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: cropper \u2192 controlLayers: \u0060CropImageEditor\u0060 (slice \u0027cropper\u0027) depends on \u0060isAspectRatioID\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/cropper/components/CropImageEditor.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d3310a8b49188493ccafae9c3bb1ff72d2d663f0b37330955bc78fbbbf36bc3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: cropper \u2192 controlLayers: \u0060Editor\u0060 (slice \u0027cropper\u0027) depends on \u0060TRANSPARENCY_CHECKERBOARD_PATTERN_DARK_DATAURL\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/cropper/lib/editor.ts"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"01723811f405f68c059dfcde1e5774a7408ff700a0b42e91186d5cd475d9a840"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: customNodes \u2192 toast: \u0060InstallFromGitForm\u0060 (slice \u0027customNodes\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/customNodes/InstallFromGitForm.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"b706b7b93c92342ba429216c43fdde04c176fa9d3a4de30abc75484e012f8c82"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: customNodes \u2192 auth: \u0060getIsCustomNodesEnabled\u0060 (slice \u0027customNodes\u0027) depends on \u0060getIsAdmin\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/customNodes/useIsCustomNodesEnabled.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"63feae00e37aa6d31baf71457a92c29720e6621274d6015713ebbbc3b78087d0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: customNodes \u2192 auth: \u0060useIsCustomNodesEnabled\u0060 (slice \u0027customNodes\u0027) depends on \u0060selectCurrentUser\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/customNodes/useIsCustomNodesEnabled.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe8686fead11dbb3ecbd13715e7799a903c1252e1187b62629e32f67a1545ba1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 gallery: \u0060DeleteImageButton\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060selectSelectionCount\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/components/DeleteImageButton.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"03d75604b266a14a7987dd4eb7cd5ab52bfb008c0fd5e9a51ee2127e42521de5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 system: \u0060DeleteImageModal\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060selectSystemShouldConfirmOnDelete\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/components/DeleteImageModal.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"65d8695e09b51151a6e3f1c37b0da66cbc667482889e1b5646696c9ef1f3c9fd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 system: \u0060DeleteImageModal\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060setShouldConfirmOnDelete\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/components/DeleteImageModal.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"72b01db65c1046a73da35c216184ab4bf3bb8d11d845493cadb2c7a0176eaefe"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 system: \u0060deleteImagesWithDialog\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060selectSystemShouldConfirmOnDelete\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e45bac2ef9350558bb4a73d31c4e4f2ed63d6f28222233666f047f492c79e90"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 gallery: \u0060handleDeletions\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060selectCachedGalleryItemNames\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb11e253c4962e5ddf41607b57a0ec53ef478fd5b926f5ac54736cdeac7c2125"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 gallery: \u0060handleDeletions\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060selectLastSelectedItem\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb880f9f00ae6f706a9f307b3e71d27403b2343acf3124c16d4e70d106eb7ce6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 gallery: \u0060handleDeletions\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060selectionChanged\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0a3253e50438ca679d9aad55e34d1ba427c64bd14a16096f4e2b9bf8000e3bf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 gallery: \u0060handleDeletions\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060pickSelectionAfterDelete\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"74396c0e1de94d8dadc6d233997d85b20bd81ca4d15cf8e9a3a28bc1a38c8aed"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 gallery: \u0060handleDeletions\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060imageSelected\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"b935987a5bd61e440f7bf91986c273833945934e41e71cbe745e1547e5de421c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 nodes: \u0060getImageUsageFromImageNames\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060selectNodesSlice\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ef3c5cbb1f76c5dd7e941792d719dda90562a7cf4550f9499a064ae5bd1f35b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 controlLayers: \u0060getImageUsageFromImageNames\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060selectCanvasSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e04a8e053321f12f1b4172eff15553b4ded5461fc5e492189ff8e88c67c2617"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 parameters: \u0060getImageUsageFromImageNames\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060selectUpscaleSlice\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"29b1f57d693a8bbb199d726f0e438c99b2f9c6cadaffe45f9dd34da3c3aac01c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 controlLayers: \u0060getImageUsageFromImageNames\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060selectRefImagesSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7623bb2329f1c90f597a9659f933c2384ee52606e25cc06b076f6bd551f5a44"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 nodes: \u0060deleteNodesImages\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060isInvocationNode\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"93eb8f9ae9c261b1d0caa98e9d6913b53fc3ba0251c716fb3a8d4292c7deb501"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 nodes: \u0060deleteNodesImages\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060isImageFieldInputInstance\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"37e65a96b17d2e21cdce5ecfade64f7a948cd63cbbe4166ba48b8ec24655d497"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 nodes: \u0060deleteNodesImages\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060fieldImageValueChanged\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3980c05b13aa5a1825a0670ce53b643fd30b8e655871e7f67a246c31400e52d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 nodes: \u0060deleteNodesImages\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060isImageFieldCollectionInputInstance\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"918e6afea01eaad0a025485107843a1b1d59fc692061ead1d37e340c1c676c1a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 nodes: \u0060deleteNodesImages\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060fieldImageCollectionValueChanged\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"85d04f32834ee411ef8ce2842f82647f9ef608fbe67495350ef22c95665a1412"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 controlLayers: \u0060deleteControlLayerImages\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060entityDeleted\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9d875c46b4ff134aad04ba58ae8a10934cd22d4bcc84bb36b2ba5f13538030e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 controlLayers: \u0060deleteReferenceImages\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060selectReferenceImageEntities\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1a756b1e11d4c17d7ac884214f139b135493178f565e6924e93c712ca31a8d1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 controlLayers: \u0060deleteReferenceImages\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060refImageImageChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"7657603c4cff69fe1e88168cbecde2dc137bdc93ac999cda1f4beac343f042fd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 nodes: \u0060getImageUsage\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060NodesState\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdd7b54db0cd005c1369143878430ba23936a1a19c7064287f1c0e43d1965969"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 controlLayers: \u0060getImageUsage\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060CanvasState\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"960afd8582a8d7adc4862e3ac3546c0e79a1c415b324f4529c66c2c02ee2d6ef"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 parameters: \u0060getImageUsage\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060UpscaleState\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5b2a022c9f9722e351d6976ecbe400bcafad145fa361ad8318bdb45cce0e223"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteImageModal \u2192 controlLayers: \u0060getImageUsage\u0060 (slice \u0027deleteImageModal\u0027) depends on \u0060RefImagesState\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":303}}}],"partialFingerprints":{"codehealthFindingId/v1":"81e752e941828bd5f86e9eb5219a76771ef5d8a2b58157967f9f82a89fd0d71d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteVideoModal \u2192 system: \u0060DeleteVideoModal\u0060 (slice \u0027deleteVideoModal\u0027) depends on \u0060selectSystemShouldConfirmOnDelete\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/components/DeleteVideoModal.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"e888615141a2b8268562fe1037bb4f1458734c6fb665af0a5b5717d1512519f5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteVideoModal \u2192 system: \u0060DeleteVideoModal\u0060 (slice \u0027deleteVideoModal\u0027) depends on \u0060setShouldConfirmOnDelete\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/components/DeleteVideoModal.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ab5b1880a10adc39c7c9130265ead344b623196d224ed01c70aae09526c6b11"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteVideoModal \u2192 system: \u0060deleteVideosWithDialog\u0060 (slice \u0027deleteVideoModal\u0027) depends on \u0060selectSystemShouldConfirmOnDelete\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3e5de1f34f655ea007a4546b7ba36c3b22fdf30331ca4d7dfff57ef9d628549"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteVideoModal \u2192 nodes: \u0060clearNodesVideoFields\u0060 (slice \u0027deleteVideoModal\u0027) depends on \u0060isInvocationNode\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a66dac0fbbf74d5451850b92ee450e656cce55a0bf85504e959fe858ad03b7f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteVideoModal \u2192 nodes: \u0060clearNodesVideoFields\u0060 (slice \u0027deleteVideoModal\u0027) depends on \u0060isVideoFieldInputInstance\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"26cda79d1dc6d994fdaa1552e438efb330cb20466046281efd49f3411a057b8d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteVideoModal \u2192 nodes: \u0060clearNodesVideoFields\u0060 (slice \u0027deleteVideoModal\u0027) depends on \u0060fieldVideoValueChanged\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"56299657dbbf8148a17ef725eef1d71ecbb21bdc0438f38b0bb9d24c5ade6c35"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteVideoModal \u2192 gallery: \u0060handleDeletions\u0060 (slice \u0027deleteVideoModal\u0027) depends on \u0060selectCachedGalleryItemNames\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea86fc5e1847d32a086054284dc098e8835ff6096968709f34cc9b103107c99e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteVideoModal \u2192 gallery: \u0060handleDeletions\u0060 (slice \u0027deleteVideoModal\u0027) depends on \u0060selectLastSelectedItem\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"7155b9919dc36fcd82db44ca69057b7a0227be4d6aa3a188d3c4f7d51f0402d8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteVideoModal \u2192 toast: \u0060handleDeletions\u0060 (slice \u0027deleteVideoModal\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0af75952cf0c1751bd9a802ee69781a1ace6beafa6415e532d9aee5ffec690f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteVideoModal \u2192 gallery: \u0060handleDeletions\u0060 (slice \u0027deleteVideoModal\u0027) depends on \u0060selectionChanged\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea820fbda212c306b9149e6b143610a019332cd4a8835656e06400e70eb568c1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteVideoModal \u2192 gallery: \u0060handleDeletions\u0060 (slice \u0027deleteVideoModal\u0027) depends on \u0060pickSelectionAfterDelete\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"45aa295eea51ab95216c5d37d220c0b9faf4ab6fa6d5e218fece00f21df1cfdb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: deleteVideoModal \u2192 gallery: \u0060handleDeletions\u0060 (slice \u0027deleteVideoModal\u0027) depends on \u0060imageSelected\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c14b8fcf4c0cb2b609d533916c2bba60fb0fc786d06b1416ecb09f346e4eba8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 auth: \u0060DndImage\u0060 (slice \u0027dnd\u0027) depends on \u0060useMediaUrl\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/DndImage.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"97241b3c596b9d027513b2ebccaa415aa629147f97d4713844da15dfdb8328a6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 gallery: \u0060DndImage\u0060 (slice \u0027dnd\u0027) depends on \u0060useImageContextMenu\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/DndImage.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8aad5326a66d06bf4e4d4ef32238ed89d67c487a8477fcb484f46e060373b0b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 ui: \u0060FullscreenDropzone\u0060 (slice \u0027dnd\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"d34704977537af29cec54ad1b5553bd25ec783ebede15ac8a5124c87083d6719"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 toast: \u0060FullscreenDropzone\u0060 (slice \u0027dnd\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"07bcc9b52d02146d361530532001266fc2c320f5afc74f854829bac9583ee891"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 controlLayers: \u0060FullscreenDropzone\u0060 (slice \u0027dnd\u0027) depends on \u0060setFileToPaste\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"635bd42082a352235ff6daf4acac0afd9ac76ab967cb5e3fcb990ded5359e8df"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 gallery: \u0060FullscreenDropzone\u0060 (slice \u0027dnd\u0027) depends on \u0060selectAutoAddBoardId\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8e944237a7d665de6c960e25cee274d1e1d2576974d2499f530975c6e8c3382"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 controlLayers: \u0060buildGetData\u0060 (slice \u0027dnd\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"b22a6e3bdac2b2ebdfb1a632cdc916d9381b03c74ee0632ebc8df59785a8fba9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 gallery: \u0060MultipleImageDndSourceData\u0060 (slice \u0027dnd\u0027) depends on \u0060BoardId\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5fe19d308c54ca2495e5ae3d163de97541a500f2c273012aede35cfd9d71970"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 controlLayers: \u0060SingleCanvasEntityDndSourceData\u0060 (slice \u0027dnd\u0027) depends on \u0060CanvasEntityIdentifier\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9dfc8ee6d0cd69c4c14640e226967831790f666fc721bc5d12d643bc580457e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 imageActions: \u0060setGlobalReferenceImageDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060setGlobalReferenceImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"53a25453590ba9c53cfae9a2b44ce063a671a9a3f20276e09f3212a5325ec704"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 controlLayers: \u0060addGlobalReferenceImageDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060getDefaultRefImageConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"0857a4eea5bffb05e0311ebcbde249723e13a064b1b64995825ea3fb6b76d0ec"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 controlLayers: \u0060addGlobalReferenceImageDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060imageDTOToCroppableImage\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f1dcfeaac259992c2924f7fe04809f047356f4799c6bab02e645e52d2539bfb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 controlLayers: \u0060addGlobalReferenceImageDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060refImageAdded\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"5572c516957ccc81f3b5328ecffe58cfae47f3d31dc668fcf49ea7f5d7128d0a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 imageActions: \u0060setRegionalGuidanceReferenceImageDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060setRegionalGuidanceReferenceImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ec2a96d8b81e29cea61df8d0ed7730a7936b5dcc7d37b3387787c5f1021b2d8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 imageActions: \u0060setUpscaleInitialImageDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060setUpscaleInitialImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"cea1560ea985baaeebf29de90c78812548cf1e6e396d7f6e2305e77261620720"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 nodes: \u0060SetNodeImageFieldImageDndTargetData\u0060 (slice \u0027dnd\u0027) depends on \u0060FieldIdentifier\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6be049045ec2f3536029de16a6496c5bf2f39107dab010289b690cc067b6192"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 imageActions: \u0060setNodeImageFieldImageDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060setNodeImageFieldImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0a9ee93186b15b0be392a349eece84869cc1cc94e454dc444f629b281bce795"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 imageActions: \u0060setNodeVideoFieldVideoDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060setNodeVideoFieldVideo\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7aed632ed9082ebbd22eb20b9866564fbd109a3153efadc5bf9445bb54cdc4f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 nodes: \u0060addImagesToNodeImageFieldCollectionDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060selectFieldInputInstanceSafe\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"db88919c258e1e9950bb6ef53a812e34b9f192b5a7171ebb6d0408028225fbd3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 nodes: \u0060addImagesToNodeImageFieldCollectionDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060selectNodesSlice\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c4706202f8b10b2a73038f455470b60ec9a99870991e7c8e11a3ae809b570d2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 nodes: \u0060addImagesToNodeImageFieldCollectionDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060isImageFieldCollectionInputInstance\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"d98895be33e5500f489c5b09f82a05383613dfcc9ebd19e897d90930e3d91c90"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 nodes: \u0060addImagesToNodeImageFieldCollectionDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060fieldImageCollectionValueChanged\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":383}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e43e9fbd334953f5580538beb284e234157124400a757c204f8da9088536225"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 gallery: \u0060setComparisonImageDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060selectComparisonImages\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e83fd66c8d5fb9fef14436f0df8fa18b51b99cf29e41f0cf0e9067d10296fef"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 imageActions: \u0060setComparisonImageDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060setComparisonImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"af80799fdba22a84799bd63f7d978a001250da4ce0a7471114b81217ef3e0e92"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 controlLayers: \u0060NewCanvasEntityFromImageDndTargetData\u0060 (slice \u0027dnd\u0027) depends on \u0060CanvasEntityType\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":426}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8481627b9cb7e272d530977ef66f2ba676510227c2e4bab098c4d143b89bae5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 imageActions: \u0060newCanvasEntityFromImageDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060createNewCanvasEntityFromImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":446}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5e1e201b188a6768400712ec74386c1b6a7ed5ccb5aff506681dc88cd65d61d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 imageActions: \u0060newCanvasFromImageDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060newCanvasFromImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"51a186944e1b93abb459e63213150cd7056b2cbd8326e23f8918fbffab6272a6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 imageActions: \u0060replaceCanvasEntityObjectsWithImageDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060replaceCanvasEntityObjectsWithImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":502}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4b7530232e532e29f3df70676679e5a1826adb6ddd90a4682f36ebfd5c99217"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 imageActions: \u0060addImageToBoardDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060addImagesToBoard\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cb27718c6efa37d4125f7acc11f2030be80bea446b2b3c7a813a8fa0173b6df"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 imageActions: \u0060addImageToBoardDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060addVideosToBoard\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":618}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c65322ef2173bcd331cf913b82a2043ce9489a55af5dd342585c2cd806d69ea"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 imageActions: \u0060addImageToBoardDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060addVideoToBoard\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":625}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bee064773c27efb4e59f03345eda759f0004da5b2ea5a0130005cd65e306daf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 imageActions: \u0060removeImageFromBoardDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060removeImagesFromBoard\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":696}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7bdeca140386b38031ae1e457dd067b2d2366c0e56ce168488d75f8aa37ea06"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 imageActions: \u0060removeImageFromBoardDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060removeVideosFromBoard\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":705}}}],"partialFingerprints":{"codehealthFindingId/v1":"f72f4897a90d7c500af5e6586f55c85d9f49a4c2bc896505801be3fcafa3050a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dnd \u2192 imageActions: \u0060removeImageFromBoardDndTarget\u0060 (slice \u0027dnd\u0027) depends on \u0060removeVideoFromBoard\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"7586a9108110360ad1651c277d3a0b6a41060a8a5ef203056590c6f1a10af2d1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: dynamicPrompts \u2192 nodes: \u0060useDynamicPromptsWatcher\u0060 (slice \u0027dynamicPrompts\u0027) depends on \u0060selectPresetModifiedPrompts\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dynamicPrompts/hooks/useDynamicPromptsWatcher.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a861e0435e8b9883edc4dde36ea99873a0b4c02125d9eb2b70f22d5fcd68aea"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 auth: \u0060BoardContextMenu\u0060 (slice \u0027gallery\u0027) depends on \u0060selectCurrentUser\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardContextMenu.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"312c4bed7daae0e94414b2cd2b038552cbaf5f0838b4ca36220fc6f053f54d77"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 toast: \u0060BoardContextMenu\u0060 (slice \u0027gallery\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardContextMenu.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8a5e5bfc08171a144dd0ff548a9867ce7b4b1f6344949469690f6a6089c9d78"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 toast: \u0060BoardEditableTitle\u0060 (slice \u0027gallery\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardEditableTitle.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"14df1db7d469d2d35958c988315ccd172511e14ddc466417fbb1c90efac0635d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 auth: \u0060BoardTooltip\u0060 (slice \u0027gallery\u0027) depends on \u0060useMediaUrl\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardTooltip.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"643ebd265376332cda9fdd84d615b2ff6d7391fd9954d8b04105cc83dc02c1e0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 auth: \u0060GalleryBoard\u0060 (slice \u0027gallery\u0027) depends on \u0060selectCurrentUser\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"64a72f5293b8275276b20e8f024265ea30075bca844ecc0eb655b2add3aa5892"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryBoard\u0060 (slice \u0027gallery\u0027) depends on \u0060AddImageToBoardDndTargetData\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b6cc1a47760cf450edfc36dabd6235d25c3cd8bfde08dd02f2fadc5fdf3d88c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryBoard\u0060 (slice \u0027gallery\u0027) depends on \u0060addImageToBoardDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"848e2b6a460edaf83ccd2247654048d0f1dea911661a34495edcf38e10073be1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryBoard\u0060 (slice \u0027gallery\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"75d2be5022414cde63ce639ce270eca13f9c9ff8e24b49ec460b9020226a7192"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 auth: \u0060CoverImage\u0060 (slice \u0027gallery\u0027) depends on \u0060useMediaUrl\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ebac4f60b1755d496449a53922279e36d44222b59e2ae975f379a4367f4b986"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060NoBoardBoard\u0060 (slice \u0027gallery\u0027) depends on \u0060RemoveImageFromBoardDndTargetData\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"95689b9e4e971bc5f56dfa433f8a8a480488d9e2f8177996da9924fe47348ff2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060NoBoardBoard\u0060 (slice \u0027gallery\u0027) depends on \u0060removeImageFromBoardDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7daf536d6251400a9c5e98cbaf153d5b1ef6455fde3dc64e46abb842db1cbdc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060NoBoardBoard\u0060 (slice \u0027gallery\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c26b729d79667be6c8a57e96f70a69eb35a71b58fa93ae979fba4adf35a240f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 auth: \u0060CoverImage\u0060 (slice \u0027gallery\u0027) depends on \u0060useMediaUrl\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/VirtualBoardItem.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"c82388bba186d5561098038b1873e5b4058e517b834fcb41f734e00d9bce162c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 nodes: \u0060DeleteBoardModal\u0060 (slice \u0027gallery\u0027) depends on \u0060selectNodesSlice\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"64fec99181a17621f2756f7ccbc72ee8ea8ecbe0c299ebc4f572ce1f5647a492"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060DeleteBoardModal\u0060 (slice \u0027gallery\u0027) depends on \u0060selectCanvasSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bbf4d991bd0da0415f6f7e723034fd94e16420df59c4e25072ec7c7d42efb4c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 parameters: \u0060DeleteBoardModal\u0060 (slice \u0027gallery\u0027) depends on \u0060selectUpscaleSlice\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"b09f29e4322c2a8d1226f3f86937ad6447627cd2035f5ca5b3cb1409d4a36d57"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060DeleteBoardModal\u0060 (slice \u0027gallery\u0027) depends on \u0060selectRefImagesSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"88b8c2ee8762e7cc44e985fc27b96862155e4baa961256d204c8fbda5efc5075"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 deleteImageModal: \u0060DeleteBoardModal\u0060 (slice \u0027gallery\u0027) depends on \u0060getImageUsage\u0060 from slice \u0027deleteImageModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"69d29711109489ff7a3381398fefe9fda3bcaab0118ee2a4ee6bfd213c433685"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 deleteImageModal: \u0060DeleteBoardModal\u0060 (slice \u0027gallery\u0027) depends on \u0060ImageUsage\u0060 from slice \u0027deleteImageModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9829459fc09ee200b51e520e570b3b2aac67d6c27f95db04eebe4533d641ce4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 toast: \u0060DeleteBoardModal\u0060 (slice \u0027gallery\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bb31e9e0177940b598d2571811a02c1797d90b274e9bc39269401a5473c9a8e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 deleteImageModal: \u0060DeleteBoardModal\u0060 (slice \u0027gallery\u0027) depends on \u0060ImageUsageMessage\u0060 from slice \u0027deleteImageModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce8b27137a17ee232f3255ea4186630cbed02d6eb23e969ab9afb2c024cb3a73"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060BoardsPanel\u0060 (slice \u0027gallery\u0027) depends on \u0060useAutoLayoutContext\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"72d2bc296e40f97c12dd70c96645916c4deb46bbf4cd0946e08ea41fb5636f53"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060BoardsPanel\u0060 (slice \u0027gallery\u0027) depends on \u0060useCollapsibleGridviewPanel\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"25bdd7caedf51445e569946e16cd52e7af2f78413d9537ea6a5891bb2f0333ae"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060BoardsPanel\u0060 (slice \u0027gallery\u0027) depends on \u0060BOARDS_PANEL_ID\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cfa3a15ad4129cc3fce1bb37a56f05dfec032e3e6c866c5d7731ff5a0dc818d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060BoardsPanel\u0060 (slice \u0027gallery\u0027) depends on \u0060BOARD_PANEL_DEFAULT_HEIGHT_PX\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"7008ad20408bd5e41c2e2711d6005c3449572a5e4ea2ba75f83596e587438b04"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060BoardsPanel\u0060 (slice \u0027gallery\u0027) depends on \u0060BOARD_PANEL_MIN_HEIGHT_PX\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"44a80ea348645e904cbe7ab3627ecf72c8cc1540c0e33af1f83458d66b997d29"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060BoardsPanel\u0060 (slice \u0027gallery\u0027) depends on \u0060BOARD_PANEL_MIN_EXPANDED_HEIGHT_PX\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"72fcf2db05d1d3454bcd35e8b97669f60691da568fc0f6462cef63adbffa4f8b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 changeBoardModal: \u0060ContextMenuItemChangeBoard\u0060 (slice \u0027gallery\u0027) depends on \u0060imagesToChangeSelected\u0060 from slice \u0027changeBoardModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemChangeBoard.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"988454b0cb56697038a2e849f464efb6ad97da265639a4fc4578ad2355c50fca"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 changeBoardModal: \u0060ContextMenuItemChangeBoard\u0060 (slice \u0027gallery\u0027) depends on \u0060isModalOpenChanged\u0060 from slice \u0027changeBoardModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemChangeBoard.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3e00db785054bd8326a7577c2bad3d96b39531edc1720495a2d6101e1948024"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 changeBoardModal: \u0060ContextMenuItemChangeBoardVideo\u0060 (slice \u0027gallery\u0027) depends on \u0060videosToChangeSelected\u0060 from slice \u0027changeBoardModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemChangeBoardVideo.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ca6a0f916254a4b858218f0e575a6878bf16c001ed4de726a7dd0db351adbe6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 changeBoardModal: \u0060ContextMenuItemChangeBoardVideo\u0060 (slice \u0027gallery\u0027) depends on \u0060isModalOpenChanged\u0060 from slice \u0027changeBoardModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemChangeBoardVideo.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef8e13a487240476e7c251f250eb6275655687fd818142ff137dd0b717d2cfb5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 deleteImageModal: \u0060ContextMenuItemDeleteImage\u0060 (slice \u0027gallery\u0027) depends on \u0060useDeleteImageModalApi\u0060 from slice \u0027deleteImageModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemDeleteImage.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"b586622769f0ba1956fe5d79f30be19a1753c8693fea4d0062dfa23b56f87fbe"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 deleteVideoModal: \u0060ContextMenuItemDeleteVideo\u0060 (slice \u0027gallery\u0027) depends on \u0060useDeleteVideoModalApi\u0060 from slice \u0027deleteVideoModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemDeleteVideo.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"745ccbbf064d2173895196988db8912dd3ee0fbd3869698b2e6341bf07595de2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060ContextMenuItemFiltersSubMenu\u0060 (slice \u0027gallery\u0027) depends on \u0060useCanvasIsBusySafe\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemFiltersSubMenu.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"9af86824c2ec38878e58125768dc4c2223e0f6c7076cbeefaa8a0bd3f56c53c7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060ContextMenuItemFiltersSubMenu\u0060 (slice \u0027gallery\u0027) depends on \u0060useCanvasIsStaging\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemFiltersSubMenu.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"07d3265a2f9845cce835961a8ab6a97c2acde8123c8660f0fe1a478fdf6216d9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 workflowLibrary: \u0060ContextMenuItemLoadWorkflow\u0060 (slice \u0027gallery\u0027) depends on \u0060useLoadWorkflowWithDialog\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLoadWorkflow.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"440a7aad50e9bcefe51e4f3e666a36dff4e36e146c616312754aac5dd0c6e913"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 nodes: \u0060ContextMenuItemLoadWorkflow\u0060 (slice \u0027gallery\u0027) depends on \u0060$hasTemplates\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLoadWorkflow.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc7726e61e2713fadd04458ea8b638b566db0828c5f831d69d12df2273baafac"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ContextMenuItemLocateInGalery\u0060 (slice \u0027gallery\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLocateInGalery.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3451a64d2cda3932ecd484a49f36e09c050a6295bf23b6326db22fb839a9400"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ContextMenuItemLocateInGalery\u0060 (slice \u0027gallery\u0027) depends on \u0060useGalleryPanel\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLocateInGalery.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf67242b319e739a04cc375ea134ca8aa5db860723365a2fc541033738f122cf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ContextMenuItemLocateInGalery\u0060 (slice \u0027gallery\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLocateInGalery.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9af34d286b2e87e7af4ba5c305a8facdea6defbff2f1d5ab8b524e46d190b88"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060ContextMenuItemNewCanvasFromImageSubMenu\u0060 (slice \u0027gallery\u0027) depends on \u0060useCanvasIsBusySafe\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"e071f66111a48c4c1a334af9113802b5a582c4c89e142a31eb5ad681127d0222"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060ContextMenuItemNewCanvasFromImageSubMenu\u0060 (slice \u0027gallery\u0027) depends on \u0060useCanvasIsStaging\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a7742210a696feaa54ae0741a488c937ad15912aff33c2c15a288ca2de6a4c7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ContextMenuItemNewCanvasFromImageSubMenu\u0060 (slice \u0027gallery\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b3d7bed459cc5edbf94ac8d8bc6b5373a40d1f6cd8fc295936753692d5bbaf6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ContextMenuItemNewCanvasFromImageSubMenu\u0060 (slice \u0027gallery\u0027) depends on \u0060WORKSPACE_PANEL_ID\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e6d7828c864d32bd40c65ea178f0638df282667f39f225c0b2cbb8300330fab"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 imageActions: \u0060ContextMenuItemNewCanvasFromImageSubMenu\u0060 (slice \u0027gallery\u0027) depends on \u0060newCanvasFromImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc5e035fe622e83e639c0f44ea04b6f1e55ffca35dac22583fc196dc34f55d4c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 toast: \u0060ContextMenuItemNewCanvasFromImageSubMenu\u0060 (slice \u0027gallery\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"56fe1a056cb616afc35fdf565ef78e1d03eaaefa0a1433d44d6fca1418c8ea8a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060ContextMenuItemNewLayerFromImageSubMenu\u0060 (slice \u0027gallery\u0027) depends on \u0060useCanvasIsBusySafe\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecd07f7f4bceb3a15da60dd41cf6480ea42168fe94fe9ff75c5aed0d504cf31f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ContextMenuItemNewLayerFromImageSubMenu\u0060 (slice \u0027gallery\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"995825a0049e95a9db6fb4536b27b464edfaf77880d9660cfdb8bcf8007a37ea"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ContextMenuItemNewLayerFromImageSubMenu\u0060 (slice \u0027gallery\u0027) depends on \u0060WORKSPACE_PANEL_ID\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed4c255143240f1391f022c0cac2b441777ddcfc02e9346441a4e1e3e634b9e5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 imageActions: \u0060ContextMenuItemNewLayerFromImageSubMenu\u0060 (slice \u0027gallery\u0027) depends on \u0060createNewCanvasEntityFromImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"e04d37045754b6c43d3e47de2c738ad49b68f99118da6b152e9ae5c30a1c9175"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 toast: \u0060ContextMenuItemNewLayerFromImageSubMenu\u0060 (slice \u0027gallery\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"c479f55d27bf3b8c03598d8da54dac48d599efa9eb51570465944a11d6768a71"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060ContextMenuItemNewLayerFromImageSubMenu\u0060 (slice \u0027gallery\u0027) depends on \u0060NewLayerIcon\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"bff831af4674da09e34047efc703ef3484866c3f61970fe98194ca25cdb82e99"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ContextMenuItemOpenInViewer\u0060 (slice \u0027gallery\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemOpenInViewer.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dbdebffb23edc8537370f3aefdb9876f094e9a5a28c06535579355873332b58"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ContextMenuItemOpenInViewer\u0060 (slice \u0027gallery\u0027) depends on \u0060VIEWER_PANEL_ID\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemOpenInViewer.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ef88bddbc9a9a78335193c31c7226e569a42efd6e53f3d974eb517dc8f4bd0c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 parameters: \u0060ContextMenuItemSendToUpscale\u0060 (slice \u0027gallery\u0027) depends on \u0060upscaleInitialImageChanged\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSendToUpscale.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc77cc0623ae34d6be8af16b32fa31d36ae92aa084eca54d129c8969b35dcd53"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060ContextMenuItemSendToUpscale\u0060 (slice \u0027gallery\u0027) depends on \u0060imageDTOToImageWithDims\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSendToUpscale.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"001989100c6fa6fb0ea374abaef62f047c83bd4031f49b296d160abd2a815f44"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ContextMenuItemSendToUpscale\u0060 (slice \u0027gallery\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSendToUpscale.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"e08f1d3dd2fa726bb6e150e4b2b4a84c52eb2bfb215b9e8a64c4a02ad8d02ae2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 toast: \u0060ContextMenuItemSendToUpscale\u0060 (slice \u0027gallery\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSendToUpscale.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa6e22ef46c31295d8a01244099eb8992dc0bb6d51dcfaf9fe3635458a6bd4c6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060ContextMenuItemUseAsRefImage\u0060 (slice \u0027gallery\u0027) depends on \u0060getDefaultRefImageConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemUseAsRefImage.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"95f0e954eb4bda8adce38d5f981b30383e815655492beed119fe656a669b89f9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060ContextMenuItemUseAsRefImage\u0060 (slice \u0027gallery\u0027) depends on \u0060imageDTOToCroppableImage\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemUseAsRefImage.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"908d121d6d776bca21a2554ab29c95b0b1f614207ee7d4fc483542f8858f198e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060ContextMenuItemUseAsRefImage\u0060 (slice \u0027gallery\u0027) depends on \u0060refImageAdded\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemUseAsRefImage.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad19a7556804a182a6ff91ac68bd53e74fb376b0913d4992f9ba3262a89396f8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 toast: \u0060ContextMenuItemUseAsRefImage\u0060 (slice \u0027gallery\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemUseAsRefImage.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed154812802a1e97ccc0e4b61007f574bf97fe92b6d63395a659bebf5f0dc46e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 deleteImageModal: \u0060MultipleSelectionMenuItems\u0060 (slice \u0027gallery\u0027) depends on \u0060useDeleteImageModalApi\u0060 from slice \u0027deleteImageModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItems.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5ee71e461d24f25d73f19247e45aca7aa4cebde3e776509a57532d6b9f7f306"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 changeBoardModal: \u0060MultipleSelectionMenuItems\u0060 (slice \u0027gallery\u0027) depends on \u0060imagesToChangeSelected\u0060 from slice \u0027changeBoardModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItems.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3967e6cb3fc2a95df002e6d8c6463f4b9e4066a52879edf4f62b32d9d959ab0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 changeBoardModal: \u0060MultipleSelectionMenuItems\u0060 (slice \u0027gallery\u0027) depends on \u0060isModalOpenChanged\u0060 from slice \u0027changeBoardModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItems.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9f0257c5b0c830329ef24f8358daf9f12806889837e673aa090a63fcb61504c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 deleteVideoModal: \u0060MultipleSelectionMenuItemsVideos\u0060 (slice \u0027gallery\u0027) depends on \u0060useDeleteVideoModalApi\u0060 from slice \u0027deleteVideoModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItemsVideos.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9f06e92b4709234f2760ae66e4de79f2a8958c740cd6b7d1876491ca5561c40"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 changeBoardModal: \u0060MultipleSelectionMenuItemsVideos\u0060 (slice \u0027gallery\u0027) depends on \u0060videosToChangeSelected\u0060 from slice \u0027changeBoardModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItemsVideos.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae49acf3a7c8be613033d2e3d8909b700ea67dcadfe1268f1889060d280dd2ca"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 changeBoardModal: \u0060MultipleSelectionMenuItemsVideos\u0060 (slice \u0027gallery\u0027) depends on \u0060isModalOpenChanged\u0060 from slice \u0027changeBoardModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItemsVideos.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"b33157f09de917da481760b3ca252cdf77f30a11fdc3b8b43cda3f94831d5ec2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060SingleSelectionMenuItems\u0060 (slice \u0027gallery\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/SingleSelectionMenuItems.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"07a066f267fd0b6d659bb5721ab984b14ca7f8bbfb456d618f4a2051c6244f36"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060canHandleGridArrowNavigation\u0060 (slice \u0027gallery\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"db2e543f29440d86a487bc4214e45ee2a7c06ecc31f8a7cbfcb9e724b69460c0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060canHandleGridArrowNavigation\u0060 (slice \u0027gallery\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"734118a6c9c89a868f16f548898b9876131e208270b7ee4d6c3d425f4a4adc28"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060canHandleGridArrowNavigation\u0060 (slice \u0027gallery\u0027) depends on \u0060VIEWER_PANEL_ID\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9f739efa4ebd1748dd1081d05c1bfec2049ff0644e19bbb6f03b09c3f7cb4c0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 system: \u0060useKeyboardNavigation\u0060 (slice \u0027gallery\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"1179cef423215794ff55ebbdc70321bb9732640f5882ab73fb5d476b67da7ce0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060GalleryPanel\u0060 (slice \u0027gallery\u0027) depends on \u0060useAutoLayoutContext\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"536c3ccdbf9752ffde5d82555f07eecfb211520de56afbff213853d4d9613518"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060GalleryPanel\u0060 (slice \u0027gallery\u0027) depends on \u0060useGalleryPanel\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2045346e349b3de59e6542e6b8fce646b3f0af623553f028c8120ea096947f5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060GalleryPanel\u0060 (slice \u0027gallery\u0027) depends on \u0060selectShouldUsePagedGalleryView\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"4be4d0ecd9bf7d93af521ea8b407265362feadfce3ab677cbe3b1fb676923634"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060UsePagedGalleryViewCheckbox\u0060 (slice \u0027gallery\u0027) depends on \u0060selectShouldUsePagedGalleryView\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/UsePagedGalleryViewCheckbox.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"786aca98a8ce44d7adf5ef3219d4fe363221680e1e4afb7938563a3f28e901f0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060UsePagedGalleryViewCheckbox\u0060 (slice \u0027gallery\u0027) depends on \u0060setShouldUsePagedGalleryView\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/UsePagedGalleryViewCheckbox.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a7514527cc46078a85a6bdd70f2e280db1c690f9df42d31fc06d9fddac6b968"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 auth: \u0060GalleryImage\u0060 (slice \u0027gallery\u0027) depends on \u0060useMediaUrl\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"33e4a36754d982d74b9838f4698931cfc4b20592f03cb44e2b47ce66b45cae83"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryImage\u0060 (slice \u0027gallery\u0027) depends on \u0060DndDragPreviewSingleImageState\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"48372db74c09654cd90ace00e11d1e50cd64c583905fdb239ed754903a6a37c9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryImage\u0060 (slice \u0027gallery\u0027) depends on \u0060DndDragPreviewMultipleImageState\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"67bea59d0f4e6dca88aed63f3bf0ef6af61c2dd230465ed05f53f24d5a621a82"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryImage\u0060 (slice \u0027gallery\u0027) depends on \u0060multipleImageDndSource\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"fae7dc91a1a2bea875e6823123ea02511ad3f25de3b8b4e9470ee71618776e90"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryImage\u0060 (slice \u0027gallery\u0027) depends on \u0060dndInputFix\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"6965031b6c05818a25394d3b10cf68fbd0846dcbad2e0acc71702afe0a1f55cb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryImage\u0060 (slice \u0027gallery\u0027) depends on \u0060singleImageDndSource\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"09b965f97cf4fb3e15970216de5ad8c4dcd29205d90361c70c3971da5e8bb273"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryImage\u0060 (slice \u0027gallery\u0027) depends on \u0060setMultipleImageDragPreview\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"c65063644d9f3d796f758768e39f9654c09435cc1bcf9108604dddace8ad07e9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryImage\u0060 (slice \u0027gallery\u0027) depends on \u0060setSingleImageDragPreview\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"249f9a23276184805680402fd0b97f1a7e8b0782089204b1a701b0fc269faa08"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060GalleryImage\u0060 (slice \u0027gallery\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a610817888b6a22e9e022a81591477b8fb17ba48566fd1f0001d250283b06dc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060GalleryImage\u0060 (slice \u0027gallery\u0027) depends on \u0060VIEWER_PANEL_ID\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"04203d9ef249089b8fad8c1b2f2d12a2f4138fc8efb97bf962d6f28519c28a32"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryImage\u0060 (slice \u0027gallery\u0027) depends on \u0060createMultipleImageDragPreview\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"351e23e6d23fa394d1da83edb0a69c94fdc5d0476b49a943abf26ea7e8f2b72c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryImage\u0060 (slice \u0027gallery\u0027) depends on \u0060createSingleImageDragPreview\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f84f869fe536b954e3d92843d779f37c6896c3ce60ca02c8b061d066957e39e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 deleteImageModal: \u0060GalleryItemDeleteIconButton\u0060 (slice \u0027gallery\u0027) depends on \u0060useDeleteImageModalApi\u0060 from slice \u0027deleteImageModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemDeleteIconButton.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"47611c082a341d3eea64252f15f8f206d263bba3f7b5724755bb0344efa57d30"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryItemDeleteIconButton\u0060 (slice \u0027gallery\u0027) depends on \u0060DndImageIcon\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemDeleteIconButton.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3bc6ee62ffda8be9475691e96d3ba1170a612c7c1c1851d2f412f62086af6f0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060GalleryItemOpenInViewerIconButton\u0060 (slice \u0027gallery\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemOpenInViewerIconButton.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d2a4d17754faacb0389c88fb70a96f749111441089026e1771b7c8c25e14fdb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060GalleryItemOpenInViewerIconButton\u0060 (slice \u0027gallery\u0027) depends on \u0060VIEWER_PANEL_ID\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemOpenInViewerIconButton.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb6ce6907264c39dcea6026fd025a37e1a37f21f14dd260225b2db313fd07c22"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryItemOpenInViewerIconButton\u0060 (slice \u0027gallery\u0027) depends on \u0060DndImageIcon\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemOpenInViewerIconButton.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"98ff253e54a38bdb5a4baf0dad7874f563de5be328b0b9b99064ae1aeb5e0fde"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryItemStarIconButton\u0060 (slice \u0027gallery\u0027) depends on \u0060DndImageIcon\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemStarIconButton.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"b606e467ad30c95e35ffad8bdcf9ae93ec71b974f384d7e352d7efdc4a3fa90a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryItemVideoStarIconButton\u0060 (slice \u0027gallery\u0027) depends on \u0060DndImageIcon\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemVideoStarIconButton.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"a37d850e91a12f3f0f9ab685c47a3debc2fba6322a259f6415ce2d6133dbb6bf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 system: \u0060GallerySelectionCountTag\u0060 (slice \u0027gallery\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GallerySelectionCountTag.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"b24d2f6bc9bf454c069b076da69730f58ab228bf184a50ab8374ba4cc6ab1a7f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060GalleryVideoItem\u0060 (slice \u0027gallery\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"42520acbec60393fa298998f923d3f4ba9687e1dc6e0f451ebfc610e25e66438"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060GalleryVideoItem\u0060 (slice \u0027gallery\u0027) depends on \u0060VIEWER_PANEL_ID\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"20c184d9801fce685ab3b71d7642bea6ae00bbc0dc0668d68ca93465103ddf84"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryVideoItem\u0060 (slice \u0027gallery\u0027) depends on \u0060dndInputFix\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"070f84c033a53fb6e60e6f7a7c3d1508d9403d3805b2890368b41caf1f0b1cf3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryVideoItem\u0060 (slice \u0027gallery\u0027) depends on \u0060multipleVideoDndSource\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"81206f486514df3f8afc024cc69cbbd8011c4ecf35dd3d4f3ad96e40509264be"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060GalleryVideoItem\u0060 (slice \u0027gallery\u0027) depends on \u0060singleVideoDndSource\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"a487a33bb1e775f98acf5c3093d2116002a7ff79916e18e832fc35362cb6e7f1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 auth: \u0060GalleryVideoThumbnail\u0060 (slice \u0027gallery\u0027) depends on \u0060useMediaCookieRefreshVersion\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoThumbnail.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c0477a78aa47b279ee318a3ea94e8b7dbd40cdcba92b5cbfe862d763c61cdfa"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 auth: \u0060GalleryVideoThumbnail\u0060 (slice \u0027gallery\u0027) depends on \u0060getMediaUrl\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoThumbnail.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b368defaf490ec6f801b3282d1dbbb8ff5ceaa3337b33c080020a8ce42b6520"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060ImageMetadataActionHandler\u0060 (slice \u0027gallery\u0027) depends on \u0060UnrecallableMetadataHandler\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"63e90eae0c9d6fa771eb58840f123deff5f25fd2dbe5ffc7928afbd0a0a91005"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060ImageMetadataActionHandler\u0060 (slice \u0027gallery\u0027) depends on \u0060SingleMetadataHandler\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"df4fb4f2e38dec7d6a7930c4df89edd6afe631a37ed1f24342bbe994458dff8a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060ImageMetadataActionHandler\u0060 (slice \u0027gallery\u0027) depends on \u0060CollectionMetadataHandler\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"f303f68e07bdf3db40d7422f492814b8ff209c125f8aea75e89cc9a0e538ca38"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060IMAGE_METADATA_ACTION_HANDLERS\u0060 (slice \u0027gallery\u0027) depends on \u0060ImageMetadataHandlers\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"f480e6f6978bc0307562494bcf75b29e757e86743b9c700f1cc45ad26babfa7d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060ImageMetadataActions\u0060 (slice \u0027gallery\u0027) depends on \u0060isUnrecallableMetadataHandler\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"21325fe45a4bd88a9dd41b3bf7e6b7518da14644e72c89b260fc8e163cb584eb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060ImageMetadataActions\u0060 (slice \u0027gallery\u0027) depends on \u0060isCollectionMetadataHandler\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecd526c82109f5efc36a7c90a76757b74c7b0ae3aa3396d64e38906ae5f3ee7e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060UnrecallableMetadataDatum\u0060 (slice \u0027gallery\u0027) depends on \u0060useUnrecallableMetadataDatum\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd3d13bf693fd4868f0004079c5968d449ebc641efcc061f088777c1afc90691"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060UnrecallableMetadataParsed\u0060 (slice \u0027gallery\u0027) depends on \u0060ParsedSuccessData\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"064b75281ce8c5d976e281e254714f884357aae12f1d7b47bdf2ce93a1b791f9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060SingleMetadataDatum\u0060 (slice \u0027gallery\u0027) depends on \u0060useSingleMetadataDatum\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"74c1b89d7aa773e3af9a09e444bc8dba7422c478d520a6a057278db25b2fe2f7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060CollectionMetadataDatum\u0060 (slice \u0027gallery\u0027) depends on \u0060useCollectionMetadataDatum\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"da02cd972194de641df7070bb23128daea9dbe7ec2143ca385a1da0fb59d6ce7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060ImageMetadataViewer\u0060 (slice \u0027gallery\u0027) depends on \u0060ImageMetadataHandlers\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataViewer.tsx"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a3f9a413de08d1b07d650a2c4fdc8f1cb4726f16712f9387577af761a72c280"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 system: \u0060CompareToolbar\u0060 (slice \u0027gallery\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CompareToolbar.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"b369c6376db668d766ff797994dbb39fceacea98ac1af9026625e2039c528df1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060CurrentImageButtons\u0060 (slice \u0027gallery\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bc883c8bbe2d8d5fc78563e170aefd810203fb87ead0da8eaa724e2735a750a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060CurrentImageButtons\u0060 (slice \u0027gallery\u0027) depends on \u0060useGalleryPanel\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f59eb6e6201c249e526805b50d412515f01e39bdf679307ecbaae872c6999cd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060CurrentImageButtons\u0060 (slice \u0027gallery\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"6343c0ef2037661eece0eceaf134f1c86fac12e0dc725ac59e507dbd25d71ea8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 parameters: \u0060CurrentImageButtons\u0060 (slice \u0027gallery\u0027) depends on \u0060PostProcessingPopover\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa007bada2e3611fa310cb14d19af9a985e40ef20492fa8bba05c94bb05be362"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 deleteImageModal: \u0060CurrentImageButtons\u0060 (slice \u0027gallery\u0027) depends on \u0060DeleteImageButton\u0060 from slice \u0027deleteImageModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"192f8128e2096c26219133599b8f679a49f15e790501ee569ecde4146278e8fa"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060CurrentImagePreview\u0060 (slice \u0027gallery\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3b2ef6a6e06d1a42268c0840568a545544b5e2de790fb8d61e46e6db1c2176a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060CurrentImagePreview\u0060 (slice \u0027gallery\u0027) depends on \u0060selectShouldShowItemDetails\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fd5578b56e6c1252d8f19977d373fe50bb35771654f18c1d068478397f2696b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060CurrentImagePreview\u0060 (slice \u0027gallery\u0027) depends on \u0060selectShouldShowProgressInViewer\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"4743f661a0b559d913489573e4a63e8112f709d5af3b3ff7d445c70847f369a7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 auth: \u0060CurrentImagePreview\u0060 (slice \u0027gallery\u0027) depends on \u0060useMediaUrl\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"434df7238ce3debf401524972abe2a7bac78d909c97db3fe4f398359725839a0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060CurrentImagePreview\u0060 (slice \u0027gallery\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"e15d8b81a05f4cf7a4053fc0339bb3fde8dd6789224011cee0b10b45e52c0825"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 system: \u0060CurrentImagePreview\u0060 (slice \u0027gallery\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"627d29d151a8bfb8a33d995939d47346f1425e4fe9a4db078d223c1e5c8d207f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060CurrentImagePreview\u0060 (slice \u0027gallery\u0027) depends on \u0060DndImage\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"574bcce83db5fb87ae6a931a683c3157eb94e20af694331a6c82fcbac71f81ee"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060CurrentImagePreview\u0060 (slice \u0027gallery\u0027) depends on \u0060CanvasAlertsInvocationProgress\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9ae8154910777523bb1e986c40e30968e7516185e0bdba25eace9ff38edde27"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 nodes: \u0060CurrentVideoButtons\u0060 (slice \u0027gallery\u0027) depends on \u0060$hasTemplates\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoButtons.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd3625879f2fe855e985a99ae4a6b8c983dbea46e57a33fe686a16755f8e55f6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 workflowLibrary: \u0060CurrentVideoButtons\u0060 (slice \u0027gallery\u0027) depends on \u0060useLoadWorkflowWithDialog\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoButtons.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffedb4f02df9851c3dd8bfb4868f24d4d698b74aa690d722bd4abe8a90b79ac6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 auth: \u0060CurrentVideoPreview\u0060 (slice \u0027gallery\u0027) depends on \u0060useMediaUrl\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"c13ec6732cc188ddb3e01fceacdf690d72dac38b6cd053f3c4ba50ab8aa0933e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060CurrentVideoPreview\u0060 (slice \u0027gallery\u0027) depends on \u0060selectShouldShowProgressInViewer\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4b53591539b92cb65bca6c63931cf003e4d64c5457d748388aaba35bd7f92cf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060CurrentVideoPreview\u0060 (slice \u0027gallery\u0027) depends on \u0060selectShouldShowItemDetails\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"e01401dd5ca43f8fe6f61362db7f54a5f344802c252ac6620cc90413870f2e1a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060CurrentVideoPreview\u0060 (slice \u0027gallery\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a42685dc94f2391b434a236d38e39193cb0eaa3eb829c2addfaa0a269195603"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 deleteVideoModal: \u0060CurrentVideoPreview\u0060 (slice \u0027gallery\u0027) depends on \u0060useDeleteVideoModalApi\u0060 from slice \u0027deleteVideoModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"f68fe7b850adc26c1edc286ef5bbcfdec26372419416d3703c2877df9886a4d1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060CurrentVideoPreview\u0060 (slice \u0027gallery\u0027) depends on \u0060dndInputFix\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff04ae3fa1b27e99c904148db430cab86952c4d9dcffac13dd4299b878fdb68a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060CurrentVideoPreview\u0060 (slice \u0027gallery\u0027) depends on \u0060multipleVideoDndSource\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"3908c03a56cde0b3f1d79e40bd8fe05a10a0a063eb4237d89f80baa11124a81c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060CurrentVideoPreview\u0060 (slice \u0027gallery\u0027) depends on \u0060singleVideoDndSource\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"d757c0a12f7b0ccce9a53b4686e6c221f5653efb46ba2b1dd4919682a5e89fa4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 auth: \u0060CurrentVideoPreview\u0060 (slice \u0027gallery\u0027) depends on \u0060isMediaCookieSelfHealPending\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"fca350fde2074ecfcb48031d8ad5f0b19297ed8f81698541af49095a20006f86"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 toast: \u0060CurrentVideoPreview\u0060 (slice \u0027gallery\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"e63dcde2d240b5df4e720e80175980de3eb8036edaa4506349d9ef845e017c8a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060CurrentVideoPreview\u0060 (slice \u0027gallery\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9ef33eebb5147eafea757ea597e6a8cf9f93a459c652be0c9c5bbee3bc23304"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 system: \u0060CurrentVideoPreview\u0060 (slice \u0027gallery\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"b03c6ced36435ba39590354acfbe43e7c90b1188f5c187468fee96d6e2230d19"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060ImageComparisonDroppable\u0060 (slice \u0027gallery\u0027) depends on \u0060SetComparisonImageDndTargetData\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonDroppable.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"41d8b1aaab034f2d51bb5b071068734c1f887a27cca1b6700ab77c25b1225e78"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060ImageComparisonDroppable\u0060 (slice \u0027gallery\u0027) depends on \u0060setComparisonImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonDroppable.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e919901597cc54c4fde20f58efe7a3b4ad76a71db74a4c765e783f86c4a2817"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060ImageComparisonDroppable\u0060 (slice \u0027gallery\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonDroppable.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"62417f7ced4fc11b20fd25a24be1a555896cf1860983de396125aa7b3680dc7d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 auth: \u0060ImageComparisonHover\u0060 (slice \u0027gallery\u0027) depends on \u0060useMediaUrl\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonHover.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1dc5fda0b37478bc22e430d1b65eedaee1dded97e59df3c56cd7bef6a34d6e8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060ImageComparisonHover\u0060 (slice \u0027gallery\u0027) depends on \u0060Dimensions\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonHover.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"e72c6a86e751f67bcd5625252fe1f3754e5ddbe532ea25a90813636634dbdc9b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060ImageComparisonHover\u0060 (slice \u0027gallery\u0027) depends on \u0060TRANSPARENCY_CHECKERBOARD_PATTERN_DARK_DATAURL\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonHover.tsx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"725f2a80c3a1f3e6dccbe5618c00b1b6a9d47c298eea5ba9d38e9846965eb11c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ImageComparisonSideBySide\u0060 (slice \u0027gallery\u0027) depends on \u0060VerticalResizeHandle\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSideBySide.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbdbfe27ada564678e8a2e4da9284de7b7b0c7645e97f04999f8a628cd7e7d80"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 auth: \u0060SideBySideImage\u0060 (slice \u0027gallery\u0027) depends on \u0060useMediaUrl\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSideBySide.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ca33d0079abc6e88e61f295871ca2bbffcfc752761472abeec321b483444c9b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 auth: \u0060ImageComparisonSlider\u0060 (slice \u0027gallery\u0027) depends on \u0060useMediaUrl\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSlider.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"a29e93cc1d91d7ba62d2724f26f7502e5ad532b490f46526eae02a3ff6c6f506"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060ImageComparisonSlider\u0060 (slice \u0027gallery\u0027) depends on \u0060Dimensions\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSlider.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"d60a9f995fdae92c7982918c2a46f7f537a22886f66796ea7294d921b1f247fd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060ImageComparisonSlider\u0060 (slice \u0027gallery\u0027) depends on \u0060TRANSPARENCY_CHECKERBOARD_PATTERN_DARK_DATAURL\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSlider.tsx"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd048408c34a7e98fc59141b316de80657f564c7050779dad5152fa388335828"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060dndTargetData\u0060 (slice \u0027gallery\u0027) depends on \u0060setComparisonImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewer.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"f970060241cfeb58505a1fd0b82300fd16a2abccf0193ff230f9951239d9eedd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 dnd: \u0060ImageViewer\u0060 (slice \u0027gallery\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewer.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb953b5e3f34c206c1686dd2a2da86c2254424795c846eac33780a2b50455d21"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 auth: \u0060NoContentForViewer\u0060 (slice \u0027gallery\u0027) depends on \u0060useIsAdmin\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/NoContentForViewer.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2d2e5ecf2600bbf8354a160700fd0bd80bb1c4a7c2458c4a1ce898f1b95928e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060StarterBundlesCallout\u0060 (slice \u0027gallery\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/NoContentForViewer.tsx"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ab5a12114c33bda62c1b2c5f48ef7dc1fe0676d6864ede7620d85e4020a9f2b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 modelManagerV2: \u0060StarterBundlesCallout\u0060 (slice \u0027gallery\u0027) depends on \u0060setInstallModelsTabByName\u0060 from slice \u0027modelManagerV2\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/NoContentForViewer.tsx"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a0e13f3a671117f753fd1f75cd09b34379af9dc41124adf694b149313b9127e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 system: \u0060selectShouldAntialiasProgressImage\u0060 (slice \u0027gallery\u0027) depends on \u0060selectSystemSlice\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ProgressImage2.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"25190f60e7c51d969251f998756d00162235d2131d915bc3833c5a88b3cefd62"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 nodes: \u0060ProgressImage\u0060 (slice \u0027gallery\u0027) depends on \u0060ProgressImage\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ProgressImage2.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0bf155d5af7efb3d180c78db9cd3d1b6afc6a2d31919e899bd6997d75bd3755"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ToggleMetadataViewerButton\u0060 (slice \u0027gallery\u0027) depends on \u0060selectShouldShowProgressInViewer\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleMetadataViewerButton.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"859fbfabb056889863a8514c038318dbbce91d564d4ab15b4513471d5a39ff48"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ToggleMetadataViewerButton\u0060 (slice \u0027gallery\u0027) depends on \u0060selectShouldShowItemDetails\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleMetadataViewerButton.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"db5ec2e869e5d5b9402a1a462d86008c88f58008b8e6a4adb01d9d520c078a31"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ToggleMetadataViewerButton\u0060 (slice \u0027gallery\u0027) depends on \u0060setShouldShowItemDetails\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleMetadataViewerButton.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8514fab71306c0460d52272b809344873ce502ca0ac1fa812980cf5ce5d6ffa"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ToggleProgressButton\u0060 (slice \u0027gallery\u0027) depends on \u0060selectShouldShowProgressInViewer\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleProgressButton.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad362af2c1c260e47ab65a950d5f8cb7f885a783f30d5e67ef2281272bd8497c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ToggleProgressButton\u0060 (slice \u0027gallery\u0027) depends on \u0060setShouldShowProgressInViewer\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleProgressButton.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d5c78bfdc60c92aa1b2a3441cbaaa7a710e4c51670c7feb80b55dec8ca53438"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060fitDimsToContainer\u0060 (slice \u0027gallery\u0027) depends on \u0060Dimensions\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/common.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"5efd20a99f8338c94cf96b0304155aa7fbea19d632122b636b83de364fbd187f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 nodes: \u0060ImageViewerContextValue\u0060 (slice \u0027gallery\u0027) depends on \u0060ProgressImage\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/context.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"932436cffaf9e123adc8ee3ab514ce29127c6fa4ea1e57fa96b5c05b456669fe"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 auth: \u0060ImageViewerContextProvider\u0060 (slice \u0027gallery\u0027) depends on \u0060selectCurrentUser\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/context.tsx"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c3e67a3f1bf8ac639e2018954edaa937bd1538024dcd73dcd1e1434bb544ab0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060useToggleMetadataHotkey\u0060 (slice \u0027gallery\u0027) depends on \u0060selectShouldShowProgressInViewer\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/useToggleMetadataHotkey.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6de81a17ab9acb3670994b31553ee624fc91c640f642a24e62e1d4670436176"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060useToggleMetadataHotkey\u0060 (slice \u0027gallery\u0027) depends on \u0060selectShouldShowItemDetails\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/useToggleMetadataHotkey.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef527e1d9099de624e096c1b931cd75563c91001a3f280e36eedfb7d787ae094"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 system: \u0060useToggleMetadataHotkey\u0060 (slice \u0027gallery\u0027) depends on \u0060useSharedInfoHotkeyTarget\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/useToggleMetadataHotkey.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"202ab866cd7728943b0fa48cf8b1b4d4b5843f4c385f6347a68ad6d548f86dd8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060useToggleMetadataHotkey\u0060 (slice \u0027gallery\u0027) depends on \u0060setShouldShowItemDetails\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/useToggleMetadataHotkey.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f6b480a77150396d1501eb90af6e1e28ab08cb4ac4300cec4ad73f89280902f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 system: \u0060useToggleMetadataHotkey\u0060 (slice \u0027gallery\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/useToggleMetadataHotkey.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"268e32a1a917555d92470cbee76c3cb96358a409cc6169a895440601b33c9b0e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 nodes: \u0060ViewerProgressDatum\u0060 (slice \u0027gallery\u0027) depends on \u0060ProgressImage\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/viewerProgressLifecycle.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"955f49808118ba859296bda77ead8868f86a2395581bb4fcf7b42f3dbfdb7dab"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 stylePresets: \u0060useClearStylePresetWithToast\u0060 (slice \u0027gallery\u0027) depends on \u0060selectStylePresetActivePresetId\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useClearStylePresetWithToast.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5c5a4bd3276e041f9a9492dd1f15fc5e2c8321ca6ad3796631c190b598b4b0d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 stylePresets: \u0060useClearStylePresetWithToast\u0060 (slice \u0027gallery\u0027) depends on \u0060activeStylePresetIdChanged\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useClearStylePresetWithToast.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"31299a02037de2f8f5551cd7755af71320bf4d2a125002a747dd1190eaa24b9b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 toast: \u0060useClearStylePresetWithToast\u0060 (slice \u0027gallery\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useClearStylePresetWithToast.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc4020c1644cbc783c8b67ed37ac2a6dae105f3d1a72afa3df65072ff661ce36"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060useCreateStylePresetFromMetadata\u0060 (slice \u0027gallery\u0027) depends on \u0060MetadataUtils\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useCreateStylePresetFromMetadata.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5399f317028b29ae2bbac6256d04cbb09cb8e6b6304a109829ab0d711f95665"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060useCreateStylePresetFromMetadata\u0060 (slice \u0027gallery\u0027) depends on \u0060ImageMetadataHandlers\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useCreateStylePresetFromMetadata.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc127b508fbdfa5f3eb2e90f7682bce314c20c3a2b4a6d71f76351080c250b08"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 stylePresets: \u0060useCreateStylePresetFromMetadata\u0060 (slice \u0027gallery\u0027) depends on \u0060$stylePresetModalState\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useCreateStylePresetFromMetadata.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"a86f8d095e2e60d176bff4ea852edf49fe3cba5b0a50cea5c491698063d4a420"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 deleteImageModal: \u0060useDeleteImage\u0060 (slice \u0027gallery\u0027) depends on \u0060useDeleteImageModalApi\u0060 from slice \u0027deleteImageModal\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useDeleteImage.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"b448a0cea9bf999d4b752d8a61b0951f846e4d0d871fd9c6f5cc3008f5d3dae1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060useEditImage\u0060 (slice \u0027gallery\u0027) depends on \u0060useCanvasManagerSafe\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"af3ae86cc4e9e486b5c4e599b51ab4a5e4d4b65e69d060100d0e8dd41eb69cdc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060useEditImage\u0060 (slice \u0027gallery\u0027) depends on \u0060useCanvasIsStaging\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"5587d43fd56a5880a79fb04f26ec65f26b19e37010e69181fe844566302ef27b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 imageActions: \u0060useEditImage\u0060 (slice \u0027gallery\u0027) depends on \u0060newCanvasFromImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"934a5cda6282ef78b4a57ec5a6ecd4b8136dc96197c6b7b4d74e3091905dbe72"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060useEditImage\u0060 (slice \u0027gallery\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae773d56ebdeaa6d93402ef38f31cc2f7ce07b433a9ed8bc87eb450aa1206b8b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060useEditImage\u0060 (slice \u0027gallery\u0027) depends on \u0060WORKSPACE_PANEL_ID\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"7defaba66910831dfe64271a4da2db6eef8be5b7201c86344a8f1415d3164398"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 toast: \u0060useEditImage\u0060 (slice \u0027gallery\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff202fc2cf59af7195b25659ab3c0ccf5842b67cd4e7e3936dce63e6d9f18b9a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 nodes: \u0060useLoadWorkflow\u0060 (slice \u0027gallery\u0027) depends on \u0060$hasTemplates\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useLoadWorkflow.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"60cd72006a7357aa7fb0420fe5f19c598bc25fe68f858d6fa9b38883c83cdda7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 workflowLibrary: \u0060useLoadWorkflow\u0060 (slice \u0027gallery\u0027) depends on \u0060useLoadWorkflowWithDialog\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useLoadWorkflow.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b35d271bb8a7b3e983f34d20575bbe4ffd68442f847c18a159a1a6387182be7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060useRecallAll\u0060 (slice \u0027gallery\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallAllImageMetadata.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"c451d37c2de27fd0c124b75a55a671abc8c062faaaf5959385f406a6767f98de"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060useRecallAll\u0060 (slice \u0027gallery\u0027) depends on \u0060useCanvasIsStaging\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallAllImageMetadata.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9fcff9399861079f54b71e86754029e06b8b3937e7f7e41188108534e678cd8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060useRecallAll\u0060 (slice \u0027gallery\u0027) depends on \u0060ImageMetadataHandlers\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallAllImageMetadata.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"871169060f93a025398c9fe12df19c7c424f0542f22a70b9bc8629275b043053"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060useRecallAll\u0060 (slice \u0027gallery\u0027) depends on \u0060MetadataUtils\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallAllImageMetadata.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"01487a8faf22999f9714aaeadd366d16ad268512be9b7584971006d8f75c90c5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ALLOWED_TABS\u0060 (slice \u0027gallery\u0027) depends on \u0060TabName\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallCLIPSkip.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"57aa32979d8af4b0f4d2e7c0f8f6a05d93fe19dc4247370af178cd25026ea8ac"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060useRecallCLIPSkip\u0060 (slice \u0027gallery\u0027) depends on \u0060selectHasModelCLIPSkip\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallCLIPSkip.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"97cf8f18eddfe07be75d2c4a54a3e67af57716bce5e7648c175ac538b364470b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060useRecallCLIPSkip\u0060 (slice \u0027gallery\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallCLIPSkip.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f8fc3b552ed367f54da68f74806ce3ba35187b1f0edbf63091aae7d8528a970"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060useRecallCLIPSkip\u0060 (slice \u0027gallery\u0027) depends on \u0060ImageMetadataHandlers\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallCLIPSkip.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e0a19eb192b054e2ae04d61b6e025882f8e051840ca1827cbc9da7679e48393"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060useRecallCLIPSkip\u0060 (slice \u0027gallery\u0027) depends on \u0060MetadataUtils\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallCLIPSkip.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa72e2c4b0c9fa7f4efa21fd9f4db5d6a332cbf9418af1c90dab73168381862e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060useRecallDimensions\u0060 (slice \u0027gallery\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallDimensions.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"28c70ddf20567c0bd632497ec751ea28c22901b5ec37e936508efcaed44941a9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060useRecallDimensions\u0060 (slice \u0027gallery\u0027) depends on \u0060useCanvasIsStaging\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallDimensions.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"68a93d20e101789b28b7bf5c4fdf8439937ba56ae7b340d34725e7b204d836cd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060useRecallDimensions\u0060 (slice \u0027gallery\u0027) depends on \u0060MetadataUtils\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallDimensions.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"2111c63bad10e040d70adb541bfd437cbab86550831f055ec446b645bdc55ec3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ALLOWED_TABS\u0060 (slice \u0027gallery\u0027) depends on \u0060TabName\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallPrompts.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2128fc142cf7bab21909d601198e6b5f75896b2940e851d907e5fe35b4a0e96"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060useRecallPrompts\u0060 (slice \u0027gallery\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallPrompts.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab4fe7a1c112c341d7f9048578952501ca2b32e01ec6b69dcea32e17da5009a8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060useRecallPrompts\u0060 (slice \u0027gallery\u0027) depends on \u0060MetadataUtils\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallPrompts.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"527861ee9fa12f30ec88cbc32fdcc8bc8aeae1b16b4f762cc862b5ecc28d89a3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060useRecallPrompts\u0060 (slice \u0027gallery\u0027) depends on \u0060ImageMetadataHandlers\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallPrompts.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"65507dbd5804fdd1cbcc44f84601072db134d34e6b7b7c98b3fddee43b2f224d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060useRecallRemix\u0060 (slice \u0027gallery\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallRemix.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"19e340c145de202eb79b4c9297f25cf13833d8356eeead430af56e2aeecc8510"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 controlLayers: \u0060useRecallRemix\u0060 (slice \u0027gallery\u0027) depends on \u0060useCanvasIsStaging\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallRemix.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"b16376cd24606b9d20674ada31bef39374a4f75f05d17d7c510493b4c055bb87"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060useRecallRemix\u0060 (slice \u0027gallery\u0027) depends on \u0060ImageMetadataHandlers\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallRemix.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3b9f168d027384b483b480bd7c883a1704e77c4bbdafa2b9312856f45a36599"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060useRecallRemix\u0060 (slice \u0027gallery\u0027) depends on \u0060MetadataUtils\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallRemix.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fa0514cff004d0f14393e216c48887a17f40f7550fac5a13051aa70f8514df2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060ALLOWED_TABS\u0060 (slice \u0027gallery\u0027) depends on \u0060TabName\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallSeed.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"311d2ece5a5aae980ed7404b3d47b5cd7fcc62da729bd0a0bad0ed881cd5cb52"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 ui: \u0060useRecallSeed\u0060 (slice \u0027gallery\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallSeed.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"eaada64d4a6641c29c3d6abbbd6279c70b0198748c9ea4363af6c5f78357e99d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060useRecallSeed\u0060 (slice \u0027gallery\u0027) depends on \u0060ImageMetadataHandlers\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallSeed.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"44fff5065a9aec5730f3cf266076031a804f3ecac9b16730650e557b522f77bd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 metadata: \u0060useRecallSeed\u0060 (slice \u0027gallery\u0027) depends on \u0060MetadataUtils\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallSeed.ts"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"a638911ce5211888b17d630006a05feaab19c6c6d504f4746610282da8e790e9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: gallery \u2192 auth: \u0060slice\u0060 (slice \u0027gallery\u0027) depends on \u0060logout\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/store/gallerySlice.ts"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"4faea2a476426a76546cc42160ec9b6e6dda14f463b951e770e8aaef6b6126ba"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060setGlobalReferenceImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060refImageImageChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"04e19a005d3abf5c1140149cf041fb91c2e97e868c3baa2cb30ae097f3478b46"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060setGlobalReferenceImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060imageDTOToCroppableImage\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"a522431651ca1f30f0cc4f323a47d236f10f4ef17032b2c446a8bd061f39026e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060setRegionalGuidanceReferenceImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060CanvasEntityIdentifier\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd8d93ee6ad012f6d69204273ec636a9f457be5c6fb40c34dd93faf7723835c6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060setRegionalGuidanceReferenceImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060rgRefImageImageChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea54aeb648bda4e281bc7f3e3dba9f72bca40768ec40fc3cf1f36061220b6355"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 parameters: \u0060setUpscaleInitialImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060upscaleInitialImageChanged\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"287bc85714124df4a36852c0df70f93a49acc09fac11406d6a00949b327bfc10"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060setUpscaleInitialImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060imageDTOToImageWithDims\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ddb752b1510bf8a9f1da5b5cb974db67538c1d0fc20a14dc68fe3b7318b71cd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 nodes: \u0060setNodeImageFieldImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060FieldIdentifier\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cd71b134973b171345b452efe3b3844f6f7da1fa6709de179060c108ba4be91"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 nodes: \u0060setNodeImageFieldImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060fieldImageValueChanged\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a190b4e18b41500bf613b38f2f40cd0274668d3fed4fdc52d8f264739f4a540"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 nodes: \u0060setNodeVideoFieldVideo\u0060 (slice \u0027imageActions\u0027) depends on \u0060fieldVideoValueChanged\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"94fe6caef7bca69f5afb5648508d8f4f85daa90ba8e7ee6517bbff121a1d84b6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 gallery: \u0060setComparisonImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060imageToCompareChanged\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"02e20f1e5a47823ba5806c9ef8e0af5f9122738ae7a302fa6ec1ea99cc23a80c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060createNewCanvasEntityFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060CanvasEntityType\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3ee1258a690f2c2d658640a0cf5f21dd97822f46658f35f0ec876d380ffefd1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060createNewCanvasEntityFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060CanvasEntityState\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"d26d29b7b1218e771d5ace0758888e8134f0ab540e387bbae28a39886c194977"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060createNewCanvasEntityFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060selectBboxRect\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcb875c9f9168fdebd4f05ea6fe0db44cd0cbfd991e4f5df7111611dd41e552e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060createNewCanvasEntityFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060selectBboxModelBase\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"c429fbaf8cbc758760aff4f8e772fac5fd9a45edcbd617e1600d55658848f351"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 parameters: \u0060createNewCanvasEntityFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060getOptimalDimension\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"27e004eea1d311b4f62cdb84cd946a742cc2ffd04cd2066e4aa023aabca8014e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060createNewCanvasEntityFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060calculateNewSize\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"856a1b6213dce67b6f3e5118c6a1ced0d2cd4cf427f93b72010c258a0c56ed64"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060createNewCanvasEntityFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060CanvasImageState\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"078ca105a00b7098ce51c8873e99d565a6e1ba65006e2851c90093ab33c29af0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060createNewCanvasEntityFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060imageDTOToImageObject\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"c503ad0c92191fd7124188d9590f1507ee1debf7c063874e4209e006e1109a5b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060createNewCanvasEntityFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060rasterLayerAdded\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"61991fc0102a09c4b2461cfbf0d9d1d707b7cb41e060af6cfd055192e63e8443"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060createNewCanvasEntityFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060controlLayerAdded\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"84342e44cec65f21a711e810a70f5b1cf8614c6ed1cbbcf8a877b45c3932283f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060createNewCanvasEntityFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060initialControlNet\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"867144caff9ba5c498df16c38c6054571961b98ccf4f765f0304d60a99b25ffb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060createNewCanvasEntityFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060inpaintMaskAdded\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"a296f960aca95655f8be923e8948a1c228c742b92f2c8aa8d2834cf0365ed6a0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060createNewCanvasEntityFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060rgAdded\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e23748885f00dcce69ec5f319e77ba2fe3387709f7f22ef7da2833d971ead97"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060createNewCanvasEntityFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060getDefaultRegionalGuidanceRefImageConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d8537e23205fc7d0ab0a4e3181dafe62dbdc70b410287bf3b8c03e670d6967e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060createNewCanvasEntityFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"39b36fcb3291116f0f57c910eaf659ec65df4f3543da6c5a92199e3a3cc86394"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 ui: \u0060createNewCanvasEntityFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d6851146db5e09bbc97b1715ac85bf9df7fd0b03c5e368a8d73ebb6c94732c9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 ui: \u0060createNewCanvasEntityFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060WORKSPACE_PANEL_ID\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d05312ed102c99acd12ad4c5ec3ee4c15e7e40fb08217f834878fa5284f8722"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060newCanvasFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060CanvasEntityTransformer\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"6654f3165edfd32fa3b3fb995ed95c1068aa44a92e9527d7b036469fb2aae0d3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060newCanvasFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060CanvasRasterLayerState\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7f39635c571b8c0ebb4868bff10c969549bc2bbc352116d7ef21107c1a85e51"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060newCanvasFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060canvasReset\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b0c737bb77d96f38b49bd23ca1d978d84ee5766175b0f74061bd7703648cc8b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060newCanvasFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060bboxChangedFromCanvas\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc7334db23137b6783c1cced233c248bc575ae2d1cfb56ca6797674204e6162b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060newCanvasFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060canvasClearHistory\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"420347058a634133f1a0aa47225042a99e64d9b86971c41c133130bef0dc1877"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060newCanvasFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060CanvasControlLayerState\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"f96104a796ff9e0095a1dcb4b40c49e94b2411185a8f768fe04260423c7f0019"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060newCanvasFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060CanvasInpaintMaskState\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf18dd858cdb23f1e6c7a39ce15dc65c1c82fa5e603bab351dbade99e1165986"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060newCanvasFromImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060CanvasRegionalGuidanceState\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3307551af51192151aaf0edafa41ad78f356f37ff31aa8a36985f38e5e95c5a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 controlLayers: \u0060replaceCanvasEntityObjectsWithImage\u0060 (slice \u0027imageActions\u0027) depends on \u0060entityRasterized\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a453ed1cc9b9e865dac3cccd2f8fa21ac13ca26ce46d7fe124ee4c55af26994"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 gallery: \u0060addImagesToBoard\u0060 (slice \u0027imageActions\u0027) depends on \u0060BoardId\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a026ac7cbec2b9053944313cdf8b9dfa615290cacfaaf0a8fdee65d2755d1fb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 gallery: \u0060addImagesToBoard\u0060 (slice \u0027imageActions\u0027) depends on \u0060selectionChanged\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"67fc90fc2b72c7b4ba54fdaeff10cec3aaf29607177020b56eff99395f62d821"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: imageActions \u2192 toast: \u0060settleVideoBoardMutations\u0060 (slice \u0027imageActions\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3a194ccd0b640a494bfa1068ecfe805becaf206ed1c3f7818473fd53b6dc40a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: lora \u2192 controlLayers: \u0060LoRACard\u0060 (slice \u0027lora\u0027) depends on \u0060buildSelectLoRA\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRACard.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"a896f5b9e44ca16c09dbdf4a3d48845918dcedb0516d6fb8d99fa1567fa3f0e2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: lora \u2192 controlLayers: \u0060LoRAContent\u0060 (slice \u0027lora\u0027) depends on \u0060LoRA\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRACard.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"20a8646f714001a25434c91de4c147935aec5e7e1dd120faa060e227fc070c95"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: lora \u2192 controlLayers: \u0060LoRAContent\u0060 (slice \u0027lora\u0027) depends on \u0060loraWeightChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRACard.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ce576e2e23c4b7b1cbd47e778f95953ce714911e958a4c7944056b28e803abb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: lora \u2192 controlLayers: \u0060LoRAContent\u0060 (slice \u0027lora\u0027) depends on \u0060loraIsEnabledChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRACard.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"21d79bce65d7980d045ade2e24ea69868e38e36aaa838e5923c39019262e7afc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: lora \u2192 controlLayers: \u0060LoRAContent\u0060 (slice \u0027lora\u0027) depends on \u0060loraDeleted\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRACard.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f01ba2b7c5549dea25fc0c3c872d604e07b3c40e181342b0bd86edd090a63ea"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: lora \u2192 controlLayers: \u0060LoRAContent\u0060 (slice \u0027lora\u0027) depends on \u0060DEFAULT_LORA_WEIGHT_CONFIG\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRACard.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1a31e97c7f7ac050f38ee5648d522c7637f99ba68cac6d3eeb23cd163c04957"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: lora \u2192 controlLayers: \u0060selectLoRAIds\u0060 (slice \u0027lora\u0027) depends on \u0060selectLoRAsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRAList.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"80804e22679e6479dddaf660d217d4d4f764df23df5b5a0c2191cd5bf1fa421b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: lora \u2192 controlLayers: \u0060selectLoRAModelKeys\u0060 (slice \u0027lora\u0027) depends on \u0060selectLoRAsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"10b0e0c75ed5b0a849b5c7f55e267c24bdf4c040393717c58fba9de3c0457c69"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: lora \u2192 controlLayers: \u0060LoRASelect\u0060 (slice \u0027lora\u0027) depends on \u0060selectBase\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"78b1e14b436a4938fe7b6d03309b36948674afa41fbdbfb5ecc00413094e19da"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: lora \u2192 controlLayers: \u0060LoRASelect\u0060 (slice \u0027lora\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"d682f8a6ab171f29654e50bb987484aaf043f800db2ad7750b34ec2d4fcfcdc3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: lora \u2192 controlLayers: \u0060LoRASelect\u0060 (slice \u0027lora\u0027) depends on \u0060loraAdded\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"434fcde011f7a8b027662d51d7f9bc91e26a350ed8e4ba744e53fc6227a2f205"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: lora \u2192 parameters: \u0060LoRASelect\u0060 (slice \u0027lora\u0027) depends on \u0060ModelPicker\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0fb4096943cae4f1252abc413534c92bb0841a6b3795d549cb3b575996983b1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060PositivePrompt\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterPositivePrompt\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"336ecef3d423c36b146f72b17e8f53d73d27cd8ce5ebdb7ce90eb052eda7bf5a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060PositivePrompt\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterPositivePrompt\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3a34f59495b64b1881219d8e351f14d2725e46ef4306422434ad86aec78d698"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060PositivePrompt\u0060 (slice \u0027metadata\u0027) depends on \u0060positivePromptChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"b74a4fa683cebaa4c4bc9f5dccbc2f386169e182230aa663e6b4165844b37c4d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060NegativePrompt\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterNegativePrompt\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"b19e5994c4fc9dfeb7ab9e5c6d89a0be7ab7033e1d6d0b36085cb5b74f1111fa"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060NegativePrompt\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterNegativePrompt\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"971a20b9c68ec93fdc86df38bddd3c060568f29988b914e0b7ec4b86ae12f80b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060NegativePrompt\u0060 (slice \u0027metadata\u0027) depends on \u0060negativePromptChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"80cf8dd67b048bc8eaaa64f7a9d80163fd2987986897e16b92add72508664c81"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060CFGScale\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterCFGScale\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ee0b2a39e8e561bac91c853ac52fcafe22685e3f13c9b79f9274df21c2912e1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060CFGScale\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterCFGScale\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"224f1bd9197218fa899ae3388486009f2ec93c6a0475369abc1b98b15ee11998"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060CFGScale\u0060 (slice \u0027metadata\u0027) depends on \u0060setCfgScale\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"b08a959e64bf71ac79e56b16a466881643d8308b438dcb4fb6d40bec669683f8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060CFGRescaleMultiplier\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterCFGRescaleMultiplier\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"8902228443a7b2fb7429ad4c1610d7ebdf05e51f667f97e4a783a4969e759c9f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060CFGRescaleMultiplier\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterCFGRescaleMultiplier\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":416}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b50712e40445cccf83c065c7ec2a6d475c4557b53ffe9a1cdf24daa60f67bd1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060CFGRescaleMultiplier\u0060 (slice \u0027metadata\u0027) depends on \u0060setCfgRescaleMultiplier\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":420}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbf4e17293209d6d88c097cdb335363d8e6a70e92cb8e3ec2b2c6143229ed88d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060CLIPSkip\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterCLIPSkip\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"e62e1172a5026c5d36bd6a8d20acc861164e65b64243a9fa2b9daf329bc611fc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060CLIPSkip\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterCLIPSkip\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":436}}}],"partialFingerprints":{"codehealthFindingId/v1":"be8bd56aaa9d7b11565d1b98c152e469c18abe8864b1714ba3df38d49bf37fb9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060CLIPSkip\u0060 (slice \u0027metadata\u0027) depends on \u0060setClipSkip\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":440}}}],"partialFingerprints":{"codehealthFindingId/v1":"030c4bfaa62a7c1b898b31ce79732b3ebb82a47acd62a5c917976ee72bbe8421"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060Guidance\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterGuidance\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":449}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcdc2f65229b7b8bef4d31d5240ff48098041dc87ba914ea0d39661a59e935c2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060Guidance\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterGuidance\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":477}}}],"partialFingerprints":{"codehealthFindingId/v1":"f859b72d38b6a8067d9db4fdeb6232cf2694f00f745ce46a2c7686e4a62bd558"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Guidance\u0060 (slice \u0027metadata\u0027) depends on \u0060setGuidance\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":481}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae9139cd74fd209f8c939135899b8adf0f69726f818d5c2dabdaec5090362b7f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060FluxDypePreset\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterFluxDypePreset\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":490}}}],"partialFingerprints":{"codehealthFindingId/v1":"9adbe4f99367f962f5903085a6d8812d769f9fc702fd8d4a338877fb49b229dd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060FluxDypePreset\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterFluxDypePreset\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":495}}}],"partialFingerprints":{"codehealthFindingId/v1":"f52a20a9097a17108cd92111c5645f225dd2bfa3fd8c2a2af25c54df7a6a0bee"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060FluxDypePreset\u0060 (slice \u0027metadata\u0027) depends on \u0060setFluxDypePreset\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":499}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbd98a1ce205a38fab8ee943a5122f81ab53b7725a9465e0dbb935fa3ecee2a5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060FluxDypeScale\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterFluxDypeScale\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":510}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfe96b0ad8bfa60baeab4d1497da92d45c9650bbc71af1e092b977dff1531c1d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060FluxDypeScale\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterFluxDypeScale\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":520}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8c851f7cd610a122bd40951e0e38e87344c9bd6b46cefb9e24b3be4ae0640fb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060FluxDypeScale\u0060 (slice \u0027metadata\u0027) depends on \u0060setFluxDypeScale\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":524}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a0060f3fe784f2632474f44098825788e073347da607360a51143bdca549e52"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060FluxDypeExponent\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterFluxDypeExponent\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec043c05a8cad45fdc68bc94aa2edeb71b1d5685a7cdf433a7405ccb6b045b7b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060FluxDypeExponent\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterFluxDypeExponent\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"e367680f92e70462f5b83cc80eb6f159ca0653f3282a5944d17e01e0d6811552"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060FluxDypeExponent\u0060 (slice \u0027metadata\u0027) depends on \u0060setFluxDypeExponent\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":549}}}],"partialFingerprints":{"codehealthFindingId/v1":"249d39cc3a6d65ab44c109facae99a35a397b279c3c733a3f014c5854a02604a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060Scheduler\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"968e59c18eadf97d5bdee36d72188a8bbd3b22b21307bc4221c57a30c27a8551"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060Scheduler\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":565}}}],"partialFingerprints":{"codehealthFindingId/v1":"84f02063b5f4960a3c0de35dfbb661dfa981159d8464c56afdd5b9c444562517"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Scheduler\u0060 (slice \u0027metadata\u0027) depends on \u0060selectBase\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":570}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8588b79534fb7237f8188490807c1a88275702fe271bfa426254ae25c695df8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Scheduler\u0060 (slice \u0027metadata\u0027) depends on \u0060setFluxScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":574}}}],"partialFingerprints":{"codehealthFindingId/v1":"307a3027e5f27818a79e08ba73284d5794e8296edb7519c23aeff066c438c08e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Scheduler\u0060 (slice \u0027metadata\u0027) depends on \u0060setZImageScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":579}}}],"partialFingerprints":{"codehealthFindingId/v1":"c76588a0ae727b58c6706538bf85cfa1fb621b7ca07597f57cfb233ff088292a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Scheduler\u0060 (slice \u0027metadata\u0027) depends on \u0060setAnimaScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d86e92c16428e4db5535c531ace36c22dc60b2e1feda6e13d284820c0ee6d78"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Scheduler\u0060 (slice \u0027metadata\u0027) depends on \u0060setScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":595}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b222ad73f3d46b3d31460a711b6b78d39e0a3d31015ffb37b9cab0ac98ee1c1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060Width\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterWidth\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":605}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee28eba8e961c861fec6a93aaf5592917887caf425a88c5d5e914633baae6d02"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060Width\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterImageDimension\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":610}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d415c28d1487de88d77095203f85fab17fc6311b946b2f44df1d4a109c7d4a7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 ui: \u0060Width\u0060 (slice \u0027metadata\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6d3b263ed028f3ff16b3fb19fff4ee52c5a2da5a4fbd3c814c1c6338a65c5d5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Width\u0060 (slice \u0027metadata\u0027) depends on \u0060bboxWidthChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":616}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0c348959daecd0d2cfcf4f856bf1ddd173d5f9b087e46b7906ac952c4f9c024"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Width\u0060 (slice \u0027metadata\u0027) depends on \u0060widthChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":618}}}],"partialFingerprints":{"codehealthFindingId/v1":"a68899d98e122a5c3c06dfed932d0f7f82c2435f7ce473343cfbf84ad559defc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060Height\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterHeight\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":628}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fa415b800d729d7c8c643c9772f1128d18d11f4d973714d7527c972fafe95c1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Height\u0060 (slice \u0027metadata\u0027) depends on \u0060bboxHeightChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":639}}}],"partialFingerprints":{"codehealthFindingId/v1":"f685f3cf52f9ea3f2fb1cba5bc4677e157c172bfcab20eafb3558ba764266ba5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Height\u0060 (slice \u0027metadata\u0027) depends on \u0060heightChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":641}}}],"partialFingerprints":{"codehealthFindingId/v1":"68a3374af3e504de7ab7fcd5ed7c28269a26ce0fc74bb7623042d56c9bd9bf21"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060Seed\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterSeed\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":651}}}],"partialFingerprints":{"codehealthFindingId/v1":"47da2e7aa43d28ab3e6e6399c3698a3bb48d9a2cdae3da1b25de6cb6227b4f7a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060Seed\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterSeed\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":656}}}],"partialFingerprints":{"codehealthFindingId/v1":"e80b1d21ad96d7907195464f74f84e08f6a05ef161a6f4dbd5a3c5335e54fe63"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Seed\u0060 (slice \u0027metadata\u0027) depends on \u0060setSeed\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":660}}}],"partialFingerprints":{"codehealthFindingId/v1":"a08afad2e207e9149b0469381b09254fed6c474cc039ef133748a63a11cd1a7c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060Steps\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterSteps\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":669}}}],"partialFingerprints":{"codehealthFindingId/v1":"35cec2e5f853ecc415227901fa42564a749cd34b9ececa0fb9359c690c083dbe"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060Steps\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterSteps\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":674}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1310f8f7895ebeb8d8f74c22ff16085266fb5b9c5fb061bbb4d5f1ce389db0a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Steps\u0060 (slice \u0027metadata\u0027) depends on \u0060setSteps\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":678}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b403d5f82d3187ee701a3f13700e781196542f5a468e3dca6fa15f7669619d9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060DenoisingStrength\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterStrength\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":687}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3728091715ae9da0f1ac3b792191c191a19fa45930a5a052c1bead8dcfd69a4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060DenoisingStrength\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterStrength\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":692}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a5ad9d8d2cd5a33b33bf31580021f1fef7b835898e999c382925f5555bbad70"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060DenoisingStrength\u0060 (slice \u0027metadata\u0027) depends on \u0060setImg2imgStrength\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":696}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f81bb83b53f1778a6aa025b7611c4801a90411dbe523816f27546d69dd422b3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060SeamlessX\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterSeamlessX\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":705}}}],"partialFingerprints":{"codehealthFindingId/v1":"50d2f9d7eecec3b602932d21080afd5588e56692bcbb49ba177848ecb4d998c5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060SeamlessX\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterSeamlessX\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":710}}}],"partialFingerprints":{"codehealthFindingId/v1":"b101ad29baa9be3a8c72800143232f0224e64856d79db998d56ddcc13b5a22c2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060SeamlessX\u0060 (slice \u0027metadata\u0027) depends on \u0060setSeamlessXAxis\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":714}}}],"partialFingerprints":{"codehealthFindingId/v1":"787491d9e0317255994e81e4f82e3c406740dd7ade8981ad5ab36075e51553dc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060SeamlessY\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterSeamlessY\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":723}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc72b194c9dfb0842f50522a919f82dea19fc200398192868f19e78f453b7a3a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060SeamlessY\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterSeamlessY\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":728}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f1d6a6bea586ec858cef1388485def8397af85a46b263012f357bf6b3299442"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060SeamlessY\u0060 (slice \u0027metadata\u0027) depends on \u0060setSeamlessYAxis\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":732}}}],"partialFingerprints":{"codehealthFindingId/v1":"8127878957b1e7fb375751076ab2adf250ca26636d1fa8d386e948f79a6e2869"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060HiDiffusion\u0060 (slice \u0027metadata\u0027) depends on \u0060setHiDiffusionEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":750}}}],"partialFingerprints":{"codehealthFindingId/v1":"d898119e28f05f7e883889ba601c1fafe2680074eb1edbb406209d1dda643603"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060HiDiffusionRauNet\u0060 (slice \u0027metadata\u0027) depends on \u0060setHiDiffusionRauNetEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":768}}}],"partialFingerprints":{"codehealthFindingId/v1":"832531d9dcc70a654b35304cc50e1955bd5f1f8c2b4650ba5f0b58257d3eb468"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060HiDiffusionWindowAttn\u0060 (slice \u0027metadata\u0027) depends on \u0060setHiDiffusionWindowAttnEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":786}}}],"partialFingerprints":{"codehealthFindingId/v1":"050c29260edba325378e9e8743c1a178b4e01ef48798d54f75de6f9c8387542f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060HiDiffusionT1Ratio\u0060 (slice \u0027metadata\u0027) depends on \u0060setHiDiffusionT1Ratio\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":804}}}],"partialFingerprints":{"codehealthFindingId/v1":"01992c287b7613ca55e64126e24c1c3e716c07b7e195483861049c42f4a83ebb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060HiDiffusionT2Ratio\u0060 (slice \u0027metadata\u0027) depends on \u0060setHiDiffusionT2Ratio\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":822}}}],"partialFingerprints":{"codehealthFindingId/v1":"f74792fc10e9c121b7bf6a3db1089cfc728bb8428d1f3c953b4ff4328a7d778a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060ZImageSeedVarianceEnabled\u0060 (slice \u0027metadata\u0027) depends on \u0060setZImageSeedVarianceEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":845}}}],"partialFingerprints":{"codehealthFindingId/v1":"19bddda59d4b02bb7027973c1fddf928d9c0f8d97a4dd6ee109b40a56c7500df"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060ZImageSeedVarianceStrength\u0060 (slice \u0027metadata\u0027) depends on \u0060setZImageSeedVarianceStrength\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"4415f7a6ddfaf79ce09e15f3a0404609d71454f25774eee054c79d967834e37e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060ZImageSeedVarianceRandomizePercent\u0060 (slice \u0027metadata\u0027) depends on \u0060setZImageSeedVarianceRandomizePercent\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":881}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ca411fcb16d2e029733fa77e25075a70dcde8d09e85e08193d5d2008ea7a408"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 nodes: \u0060QwenImageComponentSource\u0060 (slice \u0027metadata\u0027) depends on \u0060ModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":890}}}],"partialFingerprints":{"codehealthFindingId/v1":"46b0ddabfe6cb792f492ef5d60d33e62f2d8a1cd9838a9e86f0d6ce5b1441d51"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 nodes: \u0060QwenImageComponentSource\u0060 (slice \u0027metadata\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":902}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7fa5015be89220e265b0ce32f4320e065c6b01181172fb1a865cdf1e262c4bd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060QwenImageComponentSource\u0060 (slice \u0027metadata\u0027) depends on \u0060qwenImageComponentSourceSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":905}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd94eb8d97a7d7783940a1fee0ca4d1ea869d3a87a3787cc59b73b0c976d7246"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060QwenImageVaeModel\u0060 (slice \u0027metadata\u0027) depends on \u0060qwenImageVaeModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":931}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ce0ecec86d3b34bf3270cf25415b5e94e1eca192b8eb6fa6295d5802a99916d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060QwenImageQwenVLEncoderModel\u0060 (slice \u0027metadata\u0027) depends on \u0060qwenImageQwenVLEncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":957}}}],"partialFingerprints":{"codehealthFindingId/v1":"6517091177d351c4a5b1e5c36ca115202769dda2537004605e60d0f191fad53b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060QwenImageQuantization\u0060 (slice \u0027metadata\u0027) depends on \u0060qwenImageQuantizationChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":981}}}],"partialFingerprints":{"codehealthFindingId/v1":"6810d2fd620d205715bfa2aab7ce65a98e4d486458d378059cbb34d1a27973d7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060QwenImageShift\u0060 (slice \u0027metadata\u0027) depends on \u0060qwenImageShiftChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1008}}}],"partialFingerprints":{"codehealthFindingId/v1":"daa84c9255533e5b7bd2217c37e6dbd6ba39f76d686d8f51d5480faf683040c2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060WanTransformerLowNoise\u0060 (slice \u0027metadata\u0027) depends on \u0060wanTransformerLowNoiseSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1034}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc10bab6307d515c2c91fd9841a3548b1282910f12b85b60491000a5c67bd760"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060WanComponentSource\u0060 (slice \u0027metadata\u0027) depends on \u0060wanComponentSourceSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1059}}}],"partialFingerprints":{"codehealthFindingId/v1":"856ba2b5ccd2298d542519191f04b17b3f0e9feb1066e691a76ccc25fc925708"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060WanVaeModel\u0060 (slice \u0027metadata\u0027) depends on \u0060wanVaeModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1084}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb6dd6bd0fde14c22008608745b03ba1d8f06690a9c0eb4dd7067ff9f1e63002"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060WanT5EncoderModel\u0060 (slice \u0027metadata\u0027) depends on \u0060wanT5EncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1109}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0ef908bed0ad7e6c00629d3127714427dd24c2d0edaa7c8b0d80d70a31eb518"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060WanGuidanceScaleLowNoise\u0060 (slice \u0027metadata\u0027) depends on \u0060wanGuidanceScaleLowNoiseChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1135}}}],"partialFingerprints":{"codehealthFindingId/v1":"db192a63ae3a952416a372fdc7151fd01661966b9c484d6ffe55b4833dd27a4f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060MiniMaxH3DurationSeconds\u0060 (slice \u0027metadata\u0027) depends on \u0060minimaxH3DurationSecondsChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1159}}}],"partialFingerprints":{"codehealthFindingId/v1":"75f5778039c8a364f4caed32f4f156a418db3156b655805f7df7c0d9dfc48353"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060MiniMaxH3OutputMode\u0060 (slice \u0027metadata\u0027) depends on \u0060minimaxH3OutputModeChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1180}}}],"partialFingerprints":{"codehealthFindingId/v1":"49268a560b90b43d39c77a962b76ab4121df3f6210d36c56974f743ce94f8292"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060MiniMaxH3TransformerModel\u0060 (slice \u0027metadata\u0027) depends on \u0060minimaxH3TransformerModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1209}}}],"partialFingerprints":{"codehealthFindingId/v1":"29e9b5a62283145637c9f64e9bdd2da1ea899979e8e6d9517accbd97cc590288"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060MiniMaxH3TextEncoderModel\u0060 (slice \u0027metadata\u0027) depends on \u0060minimaxH3TextEncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1240}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec4218f66e74826d1a967df83091305fa6b483c038a50e37760b379543c8d74c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060ZImageShift\u0060 (slice \u0027metadata\u0027) depends on \u0060setZImageShift\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1274}}}],"partialFingerprints":{"codehealthFindingId/v1":"9009089685346c5a8608d3757ce5013fb1c556ee96922c3e40e398ef2c83a026"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060Ideogram4SamplerPreset\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterIdeogram4SamplerPreset\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1286}}}],"partialFingerprints":{"codehealthFindingId/v1":"68be535244ed152c6b107f1794bdb31f4a6d0b8b052ab848f38725166b26e68e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060Ideogram4SamplerPreset\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterIdeogram4SamplerPreset\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1291}}}],"partialFingerprints":{"codehealthFindingId/v1":"74847f08a884a080a894e4b140c2825ecc6cf1b7a3928841cdddc3725bbd490d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Ideogram4SamplerPreset\u0060 (slice \u0027metadata\u0027) depends on \u0060setIdeogram4SamplerPreset\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1299}}}],"partialFingerprints":{"codehealthFindingId/v1":"da331f5cbd8aa877ddc28be85ac744292aab9229148fa61d1500565ddd8053d2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Ideogram4Steps\u0060 (slice \u0027metadata\u0027) depends on \u0060setIdeogram4Steps\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1330}}}],"partialFingerprints":{"codehealthFindingId/v1":"81c4c3833bbde8cf6421d3d3798897d1dd2905a8b962779b1460bc1dda8538de"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Ideogram4GuidanceScale\u0060 (slice \u0027metadata\u0027) depends on \u0060setIdeogram4GuidanceScale\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1359}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bce293a91e05e8dbd5cec9ad69fa77cffc2f4131b3493b501e71d301cb9046d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Ideogram4Mu\u0060 (slice \u0027metadata\u0027) depends on \u0060setIdeogram4Mu\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1388}}}],"partialFingerprints":{"codehealthFindingId/v1":"547eb6ac90af952287603f02d874fc07b59d1c8772887128612fb8b8afe387ce"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Ideogram4ColorPalette\u0060 (slice \u0027metadata\u0027) depends on \u0060setIdeogram4ColorPalette\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1414}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6be81a30bcb9ba63eef5a8bc71c8a9857163d86c0d40d887fa4268712a2163f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060RefinerModel\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterSDXLRefinerModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1452}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b01fdef1856664788453bebf337ac6f99f04421921c4bf5b087a45fa2f4fa82"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060RefinerModel\u0060 (slice \u0027metadata\u0027) depends on \u0060refinerModelChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1464}}}],"partialFingerprints":{"codehealthFindingId/v1":"f11df013218eea2eeb97922828fe5a8fdbe3def6a92eb3ece4953b8938fa3122"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060RefinerSteps\u0060 (slice \u0027metadata\u0027) depends on \u0060setRefinerSteps\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1484}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3ceea46c4d1ad18364c940a86026554806d5ffed4a91a13df86e5c0c07783e9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060RefinerCFGScale\u0060 (slice \u0027metadata\u0027) depends on \u0060setRefinerCFGScale\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1502}}}],"partialFingerprints":{"codehealthFindingId/v1":"03e623ca13ecc9aaad83722afe3c658575e780dba8a87a4825d2d6d3c20e7234"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060RefinerScheduler\u0060 (slice \u0027metadata\u0027) depends on \u0060setRefinerScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1520}}}],"partialFingerprints":{"codehealthFindingId/v1":"dacffd4c8b7742517faa244577b026333f3c7289a84c24ee27ea90dc4b55935c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060RefinerPositiveAestheticScore\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterSDXLRefinerPositiveAestheticScore\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1529}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a807d2ed6b3d7fc25fd603e52d3ef15587e8f04aee23f63ba17047e4b69cb46"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060RefinerPositiveAestheticScore\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterSDXLRefinerPositiveAestheticScore\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1534}}}],"partialFingerprints":{"codehealthFindingId/v1":"f700a711cfa186d4235bb8638a57e9ac4027fa177224c8a6652c830b6bb3cfd3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060RefinerPositiveAestheticScore\u0060 (slice \u0027metadata\u0027) depends on \u0060setRefinerPositiveAestheticScore\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1538}}}],"partialFingerprints":{"codehealthFindingId/v1":"cef95e691c29d8bb9dee4cb61969d848fd2862e615180b85fd8900a633aafcaa"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060RefinerNegativeAestheticScore\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterSDXLRefinerNegativeAestheticScore\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1549}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d5e88d77716bec8c42efd3f821a3153515199285cf20219767e508445b4d90e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060RefinerNegativeAestheticScore\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterSDXLRefinerNegativeAestheticScore\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1554}}}],"partialFingerprints":{"codehealthFindingId/v1":"281725fb9c84c03cf28645760b76e5647abdb9fb1f44ee30ffb384518ada5c93"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060RefinerNegativeAestheticScore\u0060 (slice \u0027metadata\u0027) depends on \u0060setRefinerNegativeAestheticScore\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1558}}}],"partialFingerprints":{"codehealthFindingId/v1":"a44c05d5ef91a743105fdcda8660ec74171c33b6a1a5be58aa445f2b373601c8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060RefinerDenoisingStart\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterSDXLRefinerStart\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1569}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c5051ef208f92d47f05a1249354aa985cfd0dae0fa8ae6f7fe83e4aa1904d88"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060RefinerDenoisingStart\u0060 (slice \u0027metadata\u0027) depends on \u0060zParameterSDXLRefinerStart\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1574}}}],"partialFingerprints":{"codehealthFindingId/v1":"44241814c5b7f95be9c24e1f7f7af7446f96396ddafbbfc8851578392cddd738"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060RefinerDenoisingStart\u0060 (slice \u0027metadata\u0027) depends on \u0060setRefinerStart\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1578}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5618a8994c671e3f4d319cad68542b45e48a2d6f359d6fa752cb1038d3301f9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060MainModel\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1589}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1788f6b2975fc68f0833160d4ba048ac9d1dfb639443bd8bc6efd3d1d1dbe7f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060MainModel\u0060 (slice \u0027metadata\u0027) depends on \u0060modelSelected\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1599}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdbe603b51604b785c337311f557d0298652228fb046cb077beef326275762a8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 nodes: \u0060BASES_WITH_DEDICATED_VAE_HANDLER\u0060 (slice \u0027metadata\u0027) depends on \u0060BaseModelType\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1621}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c0270b16def41097cd7a5405530309842b1256cb0175e7a57b1648534f5e889"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060VAEModel\u0060 (slice \u0027metadata\u0027) depends on \u0060ParameterVAEModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1630}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a9c90d37d6e9a3d7b3bcd9fa189a9b21c9eaa7f5c234bdb364fee8cfa13cb5d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060VAEModel\u0060 (slice \u0027metadata\u0027) depends on \u0060vaeSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1656}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8440c8d9c8f5a5b73037fb56b6ef756799bc5e7ddf9d1c072e5923575064db7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Flux1VAEModel\u0060 (slice \u0027metadata\u0027) depends on \u0060fluxVAESelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1693}}}],"partialFingerprints":{"codehealthFindingId/v1":"11d5e95aa67a4fce612cf086354f6a4bf579d99a708725bc16f29774348296f8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060ZImageQwen3EncoderModel\u0060 (slice \u0027metadata\u0027) depends on \u0060zImageQwen3SourceModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1729}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc2292b3494c6868da11119c8913fb60ab6b91fd88563e9ff4985d531186e9b5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060ZImageQwen3EncoderModel\u0060 (slice \u0027metadata\u0027) depends on \u0060zImageQwen3EncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1730}}}],"partialFingerprints":{"codehealthFindingId/v1":"028a3b901d927dcd40c89e23acbc8320e533a5a265a6b52b7d3dcca02eddf83a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060T5EncoderModel\u0060 (slice \u0027metadata\u0027) depends on \u0060t5EncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1751}}}],"partialFingerprints":{"codehealthFindingId/v1":"679a4063becd3364436f57851044543a1f65ac77aba93d947eac452303862d10"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060ZImageVAEModel\u0060 (slice \u0027metadata\u0027) depends on \u0060zImageVaeModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1785}}}],"partialFingerprints":{"codehealthFindingId/v1":"535df09c23bedc7ef4d5a3441c04e7e6eb925d2350159ee7e2781aa6925ad5f2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Krea2VAEModel\u0060 (slice \u0027metadata\u0027) depends on \u0060krea2VaeModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1841}}}],"partialFingerprints":{"codehealthFindingId/v1":"40bdb38c4aa92e9b031fea82f70a956c685750bb402ad396b561a027821ce455"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Krea2Qwen3VlEncoderModel\u0060 (slice \u0027metadata\u0027) depends on \u0060krea2Qwen3VlEncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1865}}}],"partialFingerprints":{"codehealthFindingId/v1":"de939b830aeaf495512a829aee837771ef554a199b2c6e2a4c464fbdd0f04cc5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Krea2SeedVarianceEnabled\u0060 (slice \u0027metadata\u0027) depends on \u0060setKrea2SeedVarianceEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1889}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e911d28c5a1a88aba640065813771d25c08d3be898c71dd3278d553de1d2668"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Krea2SeedVarianceStrength\u0060 (slice \u0027metadata\u0027) depends on \u0060setKrea2SeedVarianceStrength\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1912}}}],"partialFingerprints":{"codehealthFindingId/v1":"b507c20d4a9d3b5baec29aa1c8360e70a99201be605ccc8a0201dc14e766cf6c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Krea2SeedVarianceRandomizePercent\u0060 (slice \u0027metadata\u0027) depends on \u0060setKrea2SeedVarianceRandomizePercent\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1935}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ee2de4fd12cdb5a51934543a186771535244a19604c3b59d79da2c31fb7a047"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Krea2RebalanceEnabled\u0060 (slice \u0027metadata\u0027) depends on \u0060setKrea2RebalanceEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1954}}}],"partialFingerprints":{"codehealthFindingId/v1":"09b67db208f31ea1239ac6233b89dd0cbcf5119e8e2cc31ea1c480a66452740d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Krea2RebalanceMultiplier\u0060 (slice \u0027metadata\u0027) depends on \u0060setKrea2RebalanceMultiplier\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1973}}}],"partialFingerprints":{"codehealthFindingId/v1":"e278daad47df3c703dbf6f1ce64803be5473535173444d2ce8652bbcfffb7be4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Krea2RebalanceWeights\u0060 (slice \u0027metadata\u0027) depends on \u0060isValidKrea2RebalanceWeights\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1992}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb6b388b156739eabb3cc6bd4f918a815bedf01d49e5644a7de46ffe1c2ca3ab"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Krea2RebalanceWeights\u0060 (slice \u0027metadata\u0027) depends on \u0060setKrea2RebalanceWeights\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1996}}}],"partialFingerprints":{"codehealthFindingId/v1":"fda7556502f65290e7f4ed00019a294d3e03fb5c8c29edd1346443ba98879970"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060AnimaVAEModel\u0060 (slice \u0027metadata\u0027) depends on \u0060animaVaeModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2028}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d7e5d4d6a8071766688738fcdde368a64921584cba96ec0a39a64855bc4f9f2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060AnimaQwen3EncoderModel\u0060 (slice \u0027metadata\u0027) depends on \u0060animaQwen3EncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2061}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe75e8429cea5ce1dcc434cbb411df800e41b4180e01ce20d1986ba73351476b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Flux2VAEModel\u0060 (slice \u0027metadata\u0027) depends on \u0060flux2VaeModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2096}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee24e2504f453ce28cd1e04132c86e73f7bd4e85be0ccad29a7e78790a773571"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060KleinQwen3EncoderModel\u0060 (slice \u0027metadata\u0027) depends on \u0060kleinQwen3EncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2128}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfd982056369fbf35dfc76c8b0876406859cb2980faf30ed5ee4a17bbdffd6dd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060Flux2DevMistralEncoderModel\u0060 (slice \u0027metadata\u0027) depends on \u0060flux2DevMistralEncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2153}}}],"partialFingerprints":{"codehealthFindingId/v1":"8edf983f6c17efbfc3711c8c270133cb06db321e7bb33337bc7fd8ed82c89a38"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060LoRAs\u0060 (slice \u0027metadata\u0027) depends on \u0060LoRA\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2164}}}],"partialFingerprints":{"codehealthFindingId/v1":"a750abb4e2ef46c1d79c55e7ec197c523970076e992e4675d9e77ed3a1cb6b3c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060LoRAs\u0060 (slice \u0027metadata\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2201}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ae2a1b691ecafdc84a03897e544e78a54a39871920107443f2db9989cfea6c9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 parameters: \u0060LoRAs\u0060 (slice \u0027metadata\u0027) depends on \u0060zLoRAWeight\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2203}}}],"partialFingerprints":{"codehealthFindingId/v1":"132a5ec1ad1bace5acf57c09c98dd23ecdb6f2ac6c693c4513222364f901f246"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060LoRAs\u0060 (slice \u0027metadata\u0027) depends on \u0060loraRecalled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2218}}}],"partialFingerprints":{"codehealthFindingId/v1":"179bbfb434e270a2158eaa559c8fa8086e3207d92b884ddd1bbaf43b056d0ec8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060LoRAs\u0060 (slice \u0027metadata\u0027) depends on \u0060loraAllDeleted\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2221}}}],"partialFingerprints":{"codehealthFindingId/v1":"9aeee790e7c2d3824002e9d13a2c25fb4f388c5ad09f5b3aeb39166598e7b08f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060CanvasLayers\u0060 (slice \u0027metadata\u0027) depends on \u0060CanvasMetadata\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2235}}}],"partialFingerprints":{"codehealthFindingId/v1":"05c391eb7abe3418bfbc37b4019b326da87889de5c569e75d04f4affd1aaeefd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060CanvasLayers\u0060 (slice \u0027metadata\u0027) depends on \u0060zCanvasMetadata\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2242}}}],"partialFingerprints":{"codehealthFindingId/v1":"7be84ffe96b33bbc7c31e5189f39a0676725a89c014eaa535f5af4f915fe8240"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060CanvasLayers\u0060 (slice \u0027metadata\u0027) depends on \u0060canvasMetadataRecalled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2301}}}],"partialFingerprints":{"codehealthFindingId/v1":"09e21e75644902beadbd564137b310da0706695803845847227b8203977da005"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060RefImages\u0060 (slice \u0027metadata\u0027) depends on \u0060RefImageState\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2318}}}],"partialFingerprints":{"codehealthFindingId/v1":"52da5b03dea54096747f161ee47b73053f2da897a0a6ac6099a6e134e6fdfbe3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060RefImages\u0060 (slice \u0027metadata\u0027) depends on \u0060zRefImageState\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2326}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7bdaadacbbc21bc694ad58511ef0c088ba577de18af245ed88cdeb8c04efa7a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060RefImages\u0060 (slice \u0027metadata\u0027) depends on \u0060zCanvasReferenceImageState_OLD\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2332}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e03e3dfa93f023c2f9599a6d045fa5b56c6e3eb6f7e447b4c54afc4379b5d3d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060RefImages\u0060 (slice \u0027metadata\u0027) depends on \u0060refImagesRecalled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2360}}}],"partialFingerprints":{"codehealthFindingId/v1":"06b734006ed3ea3b3b8ec82b87ccf8e76d4ca20fc253e5f5a3fa40ac0136f1eb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060ImageSize\u0060 (slice \u0027metadata\u0027) depends on \u0060imageSizeChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2388}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f8d6242fbbc5f8045dbb68a883cea9dd5c0fb3d023ec76e0f17aa4f9f255be1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060GeminiTemperature\u0060 (slice \u0027metadata\u0027) depends on \u0060geminiTemperatureChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2406}}}],"partialFingerprints":{"codehealthFindingId/v1":"d21599c6cb43f5767134fbfc69c397227ccfeb85bf97a7e3afac1a990108926b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060GeminiThinkingLevel\u0060 (slice \u0027metadata\u0027) depends on \u0060geminiThinkingLevelChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2425}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebac6048b12580e2f1723c3119eb0316799d6b5773afb6abe0134f323f78b296"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060OpenaiQuality\u0060 (slice \u0027metadata\u0027) depends on \u0060openaiQualityChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2443}}}],"partialFingerprints":{"codehealthFindingId/v1":"8694266fa4bbb37377defcdc708727b4929feb0923960c2c5ea357b9e488f8a2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060OpenaiBackground\u0060 (slice \u0027metadata\u0027) depends on \u0060openaiBackgroundChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2463}}}],"partialFingerprints":{"codehealthFindingId/v1":"80148bd687900e51eba1cb7efc412eba22b3b33f651b7ef6823b47e4fbae39f9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060OpenaiInputFidelity\u0060 (slice \u0027metadata\u0027) depends on \u0060openaiInputFidelityChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2483}}}],"partialFingerprints":{"codehealthFindingId/v1":"47b9189ee33703bb26c5a1e53cf0d49ac1afb61693d574862498b3bf12a851ed"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060SeedreamWatermark\u0060 (slice \u0027metadata\u0027) depends on \u0060seedreamWatermarkChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2501}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0369aaedfd2676ba549c7fb9584748eb259ffa9a6c91c7e2e3e81c163173549"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 controlLayers: \u0060SeedreamOptimizePrompt\u0060 (slice \u0027metadata\u0027) depends on \u0060seedreamOptimizePromptChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2519}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cf793afb8320bf106225a021e765ec1d1e76aa63fad236d4923f003e28bf9a7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 toast: \u0060successToast\u0060 (slice \u0027metadata\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2628}}}],"partialFingerprints":{"codehealthFindingId/v1":"a362d826995148a8e1b78a15d6f9fdddc6f066795bd6a4501ceb9e76020e5072"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 nodes: \u0060parseModelConfig\u0060 (slice \u0027metadata\u0027) depends on \u0060ModelType\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2953}}}],"partialFingerprints":{"codehealthFindingId/v1":"853e275cf9f850903eeca0f17b692edf528ce068c0971673e0d011490284a032"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: metadata \u2192 nodes: \u0060parseModelConfig\u0060 (slice \u0027metadata\u0027) depends on \u0060zModelIdentifier\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2982}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3830880a3e7d43f7d5dcfbd14d95077689974fe9d28a0474e0f4037fa88afb2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 toast: \u0060useInstallModel\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useInstallModel.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"e669cb2c4ab576e3f83089d6eeac0d627af1bad9c3010c31191d0fbffc5f333f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 auth: \u0060useIsModelManagerEnabled\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060useIsAdmin\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useIsModelManagerEnabled.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbb18b0687e350d3e0e5fc3e6a97452a4be1a5cb429ab36006b9d055e8fec47e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 controlLayers: \u0060useLoRAModelDefaultSettings\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060DEFAULT_LORA_WEIGHT_CONFIG\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useLoRAModelDefaultSettings.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"f95a9e6f5d0d4d4d725aa9ac51347d8efa8b7492b180ab9855c88e26eaecdd89"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 toast: \u0060useStarterBundleInstall\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterBundleInstall.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7eb3b3bab67c579295e9c62828ba1b0ffd9f14c9e998f9974947ee3928fa22a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 auth: \u0060useStarterModelsToast\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060selectIsAuthenticated\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterModelsToast.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b985f0813a8bcf2bbb7c35332ba47dd37eab775dd23641f21fc18e5a02418ad"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 auth: \u0060useStarterModelsToast\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060useIsAdmin\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterModelsToast.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6ef584cbfd0156b04dab6f698c4cf36e51fc65d2bb8683ad478d0c8011a1f5e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 ui: \u0060AdminToastDescription\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterModelsToast.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"df7330849e32996db436335110f6e7f5f76e8eca2e4c51aa12d4de6ae8485f2e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 nodes: \u0060MODEL_BASE_TO_COLOR\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060BaseModelType\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/models.ts"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1c7fbac6149d342feee2756b9d16b54cfb9c4b79b144a4067b39ca7d7a5e42b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 nodes: \u0060MODEL_TYPE_TO_LONG_NAME\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060ModelType\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/models.ts"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"18b62f10c13d8b862f6924f8c5e5b533841683a28128e3840d2d2131f4102107"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 nodes: \u0060MODEL_VARIANT_TO_LONG_NAME\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060AnyModelVariant\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/models.ts"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"825812b28cf24a9c4f800c844d9771926d582ffa201bf4855b20e53d9d9ff263"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 nodes: \u0060MODEL_FORMAT_TO_LONG_NAME\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060ModelFormat\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/models.ts"},"region":{"startLine":351}}}],"partialFingerprints":{"codehealthFindingId/v1":"557a3a093e36732b38d635c7174e23de8684a9cc1ef7ff1ce73b650cbb40469a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 nodes: \u0060zModelCategoryType\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060zModelType\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/store/modelManagerV2Slice.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9f2a65b3e4d1c3376a962148f13998f1bdea81549c9f90f4ca99b1f679246fc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 toast: \u0060ResetHFTokenButton\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HFToken.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ee142b2d4f6ca00a624b4b592e048ea0618c9463e67e597275fd978ebeb615e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 toast: \u0060ModelInstallQueue\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueue.tsx"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"cea8c0ae5d39cda9f4c1168b3469a926aecec47b641be9aeef457d7569faa67f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 toast: \u0060ModelInstallQueueItem\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueItem.tsx"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"08346815654f5b88165d09b1657acc7c8eea0daf322dd9e5be51453256449593"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 toast: \u0060StarterModelsResultItem\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterModelsResultItem.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfea6ce3f1b39c092d27bca7491f2e7688b67031e972588cf0c74f7506def8c5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 nodes: \u0060Props\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060BaseModelType\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelBaseBadge.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"b15a48abd049d5ada5e76eb6de38d918858c326e117cb7710fceed2a4f4355fb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 nodes: \u0060Props\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060ModelFormat\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelFormatBadge.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5b266da6d515c940e59d6eebf5ef6c5d70c390b42623440bd39c5826274dcc0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 system: \u0060ModelListWrapper\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060StickyScrollable\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListWrapper.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc4aff7d7af4f85a2a93891b6b335011d3b85921d816fa32db7f354196f3e4bc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 toast: \u0060ControlAdapterModelDefaultSettings\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/ControlAdapterModelDefaultSettings.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbddfb35e688d3a78be040140a30e0c11f391acaa363d6cdccaa490b028d46fb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 toast: \u0060CpuOnlyModelSettings\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/CpuOnlyModelSettings/CpuOnlyModelSettings.tsx"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"70ed6c450d5d2aa3debccee6362fada8869dc2d5e4ee60bf8edad0a29c0dadef"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 toast: \u0060ModelImageUpload\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelImageUpload.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bdae9508d4a9ba0ca4eab58ff1c89a7fd01d6d56f637fd57f5b4762626e90f7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 controlLayers: \u0060DefaultWeight\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060DEFAULT_LORA_WEIGHT_CONFIG\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/DefaultWeight.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"d12fc7b84f7a5cec88c9aafad0db892d92697c7ca2faaf8d46f9786ba0b8241c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 controlLayers: \u0060DefaultWeightMax\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060DEFAULT_LORA_WEIGHT_CONFIG\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/DefaultWeightMax.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a5e1feaa1ed51bc408ed45847e217963d75f106a9adc5734388504988c61c6a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 controlLayers: \u0060DefaultWeightMin\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060DEFAULT_LORA_WEIGHT_CONFIG\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/DefaultWeightMin.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"52d8483edd8d6f7448a9459e939ce05876bb17385799d08fbbb14abc05d41476"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 controlLayers: \u0060LoRAModelDefaultSettings\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060DEFAULT_LORA_WEIGHT_CONFIG\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/LoRAModelDefaultSettings.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"f37fddde0b6a5d0d3d5fbeed0478ecfef6d29af76e9697c5fa96ba3536bc9f4a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 toast: \u0060LoRAModelDefaultSettings\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/LoRAModelDefaultSettings.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"b69c5792199b559c0c3760a79c53c7691cd3cb44ad263d72a59b224dda6ab2fe"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 parameters: \u0060DefaultCfgRescaleMultiplier\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060CONSTRAINTS\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgRescaleMultiplier.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"570f0b72732e2d672908a801e837d5677665f296563619bdeef41064faeb5a28"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 parameters: \u0060DefaultCfgScale\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060CONSTRAINTS\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgScale.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed6cbc59f5990e17be00a255c9a78ebb3081d252f0f1dac0e63ad9af89946685"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 parameters: \u0060DefaultCfgScale\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060MARKS\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgScale.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"dad4f58986e93b791c3cce8c1c9f918e25d4ef64a6b0f2a98c6e10bd522eae7d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 parameters: \u0060DefaultGuidance\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060CONSTRAINTS\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultGuidance.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"3decbfa814110739cc9bc2dd8965d6672ab24679e1b77c0fb795248007985f85"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 parameters: \u0060DefaultGuidance\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060MARKS\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultGuidance.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d191a9ea9f98d879e594060678f7f6e40ed71c3c5f9b4251aacda2ad3e8726c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 parameters: \u0060DefaultHeight\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060CONSTRAINTS\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultHeight.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"7587064155eaa1178d71e347b61ecfa5098226243f5f4820f49968a531d20b27"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 parameters: \u0060DefaultScheduler\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060isParameterScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultScheduler.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"51fdc441576945617df32c00e1520540ce917e5014c6364e62579dcb4133636e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 parameters: \u0060DefaultScheduler\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060SCHEDULER_OPTIONS\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultScheduler.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca4395fb5cf357e5107fa0a461eea1aae56260e66d92e123601152dbe084ec30"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 parameters: \u0060DefaultSteps\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060CONSTRAINTS\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultSteps.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"e74498756b8d08c4c8db407030b5d5184f2a55ee3e8d88517a3d81bf87a24dd9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 parameters: \u0060DefaultSteps\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060MARKS\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultSteps.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"5733fa8599738741bca59c5400a32892c2cecf73cec15b5278109bae53702a19"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 parameters: \u0060DefaultVaePrecision\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060isParameterPrecision\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVaePrecision.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"398b730f54f82e7245ce33c1ca442b0b1367118de4571d87ab566a7a6856febb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 parameters: \u0060DefaultWidth\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060CONSTRAINTS\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultWidth.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"13e7981c609cfbe7c0feda8f4c5f921671172ebde6d59a70f451834c188b6494"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 parameters: \u0060MainModelDefaultSettingsFormData\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060ParameterScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"d46d3197b2690cf3cd6116ddbc637295eff026442edceb363252a830a52253b9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 parameters: \u0060MainModelDefaultSettings\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060getOptimalDimension\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"5941395ec5cfa100e48ecc059a8c893a90477b66b70f2582cf8960352cced2d9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 toast: \u0060MainModelDefaultSettings\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"41c43c55ae6f0b00aefddd39d7b0642a06073ef72efa65ad810f8f185e0e8925"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 toast: \u0060ModelConvertButton\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelConvertButton.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"edc2f0e7ce8d38acec27f6f4b67950c6b89d31acd192a3ed643958866f7c0593"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 toast: \u0060ModelDeleteButton\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelDeleteButton.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"00e3a4ab63393982945d525a97b3f502f0cb613338a9113177362cf0fa9e07dd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 toast: \u0060ModelEdit\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"19a6cadd5cb72c33a3468a71e426725089ca147d416a3c4a474a3021db83b80e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 toast: \u0060ModelReidentifyButton\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelReidentifyButton.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"43611e65762711d5716daf2ff9c63908712a392b0a8fb1e8a403085df71ccadb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 toast: \u0060ModelSettingsExportButton\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelSettingsExportButton.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf8ffbc381c65e50e8aafc1d6631c76ae728969782676e06ac80d7ce7a78e522"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 toast: \u0060ModelSettingsImportButton\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelSettingsImportButton.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbd7b6714a17f795fe7cb7d51af47fb79a06d65f7aaf58cc93a83869e7c8c87e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: modelManagerV2 \u2192 toast: \u0060ModelUpdatePathButton\u0060 (slice \u0027modelManagerV2\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelUpdatePathButton.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"17cf174765e472be056caceaf550535c1b466a904864bd5567c44732008fcac2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 toast: \u0060useAddNode\u0060 (slice \u0027nodes\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"d02f9e3bed1da8e7ec3271ff1d06c8398f2cb07b819b1d37bb3b70b3bb9b4888"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060AddNodeCmdk\u0060 (slice \u0027nodes\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca0bdaa68c2d62f681d06aa1ab4ebdfe056c4bb8f2713e1d5d74b99703c40e0b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 system: \u0060AddNodeCmdk\u0060 (slice \u0027nodes\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"814aa33719930b6909161cca01d33e0614813376f54f257d1aac4a2b93c6f164"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 system: \u0060HotkeyIsolator\u0060 (slice \u0027nodes\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx"},"region":{"startLine":538}}}],"partialFingerprints":{"codehealthFindingId/v1":"91143da215adb86a42cdadb5dac98a5dc0d6594aa7c351bf87b14851d14e7130"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 gallery: \u0060CurrentImageNode\u0060 (slice \u0027nodes\u0027) depends on \u0060selectLastSelectedItem\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/CurrentImage/CurrentImageNode.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"31029ff073f678278cff2a42bf9b8bdc7571c0189576108887f305c5c05b4cb2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 gallery: \u0060CurrentImageNode\u0060 (slice \u0027nodes\u0027) depends on \u0060isVideoName\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/CurrentImage/CurrentImageNode.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"21d8c7022921aabf46000be6b62d9203ce5287f5a16f3a035a51d1811e9803e6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 dnd: \u0060CurrentImageNode\u0060 (slice \u0027nodes\u0027) depends on \u0060DndImage\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/CurrentImage/CurrentImageNode.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"319eb861d72099ee20a695616fe33df43846ed540cf9745249e232f10b1f04f5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 gallery: \u0060Wrapper\u0060 (slice \u0027nodes\u0027) depends on \u0060NextPrevItemButtons\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/CurrentImage/CurrentImageNode.tsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebc459ea1def2c69f29a08a20d976d2c5118341e91ff508f7c77ea1c6e702a3d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 auth: \u0060UseCacheCheckbox\u0060 (slice \u0027nodes\u0027) depends on \u0060useIsAdmin\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/UseCacheCheckbox.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"0351b363f1686e0f5f97b411d9fe6b2e7c7556111d42602ef63e097419cdff91"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 auth: \u0060VideoFrameIndexFieldInput\u0060 (slice \u0027nodes\u0027) depends on \u0060useMediaUrl\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/VideoFrameIndexFieldInput.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"22274c0705ad7af0aae1af0e73a39e520f3bc30db2c74087e34ed6f5725c7705"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 toast: \u0060GeneratorTextareaWithFileUpload\u0060 (slice \u0027nodes\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/GeneratorTextareaWithFileUpload.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"05eee59c3cfec10e0f5bb232527c796cb97d1055a1942d2822cf4a9be78db99a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 dnd: \u0060ImageFieldCollectionInputComponent\u0060 (slice \u0027nodes\u0027) depends on \u0060AddImagesToNodeImageFieldCollection\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"7147fd828c28e03ab2fd875f64afe9609664d92bd0b79e01fe509ca5f07c3d9e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 dnd: \u0060ImageFieldCollectionInputComponent\u0060 (slice \u0027nodes\u0027) depends on \u0060addImagesToNodeImageFieldCollectionDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9d6ad739b5ef2efaaf5465472c5ed53b0a5ba6e1560fef0d252ec4e3e7b8369"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 dnd: \u0060ImageFieldCollectionInputComponent\u0060 (slice \u0027nodes\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ea808938fd28cc1b11dbdb26f3cf33f3345d9c102918b090b5106c904e546b2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 dnd: \u0060ImageGridItemContent\u0060 (slice \u0027nodes\u0027) depends on \u0060DndImageIcon\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5ec8299649faffb7cee5f4613cfb2861a3f32d3ee007d2f24e44b0b094809c6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 dnd: \u0060ImageGridItemContent\u0060 (slice \u0027nodes\u0027) depends on \u0060DndImage\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfb9b646250d8c91d1a8bf9689bffe104256b4d71eb9ad236caeb593db9e3181"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060ImageGridItemContent\u0060 (slice \u0027nodes\u0027) depends on \u0060TRANSPARENCY_CHECKERBOARD_PATTERN_DARK_DATAURL\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"d79e8d8c68bb44eb90ee46f5dedbab0a3e38ad5bbb14affbf99fc3bd04d0f709"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 dnd: \u0060ImageFieldInputComponent\u0060 (slice \u0027nodes\u0027) depends on \u0060SetNodeImageFieldImageDndTargetData\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"b82d6fff401c947473a39dae4fa6d31697ebd6bad9f0bb719ae2aa9a636642f6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 dnd: \u0060ImageFieldInputComponent\u0060 (slice \u0027nodes\u0027) depends on \u0060setNodeImageFieldImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc2f048bf4ca14c98ce7b73efcc60f91ea6b87a303d910a6ae6c5fe621355fe6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 dnd: \u0060ImageFieldInputComponent\u0060 (slice \u0027nodes\u0027) depends on \u0060DndImage\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"c968d6e1b9cc0393404c2d897455ec0c64be39bce154148543ac18e92c338145"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 dnd: \u0060ImageFieldInputComponent\u0060 (slice \u0027nodes\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb7047ff02f79bd08320b8992f43c946b8242ee1dfdab3cfd13e77865eb788d0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060LoRAFieldCollectionInputComponent\u0060 (slice \u0027nodes\u0027) depends on \u0060DEFAULT_LORA_WEIGHT_CONFIG\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LoRAFieldCollectionInputComponent.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebdf248fdfff9645d6b1b95edfae71ddf5696c951ebecafc67577b3fb567ef87"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 parameters: \u0060LoRAFieldCollectionInputComponent\u0060 (slice \u0027nodes\u0027) depends on \u0060ModelPicker\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LoRAFieldCollectionInputComponent.tsx"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a439cc9bde72e729680547cfb5784290f0edd69e30587b4585a26b9e3527829"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 parameters: \u0060SchedulerFieldInputComponent\u0060 (slice \u0027nodes\u0027) depends on \u0060isParameterScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SchedulerFieldInputComponent.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"4158e854e510df007c4f7bb09082713aca687a87d4a2e0a9cad7a2eb3af02ec2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 parameters: \u0060SchedulerFieldInputComponent\u0060 (slice \u0027nodes\u0027) depends on \u0060SCHEDULER_OPTIONS\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SchedulerFieldInputComponent.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ad3fa0fa3c24b94ccd21745627961cf4db195ff690e3d771c7c3359f76352d9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 auth: \u0060VideoFieldInputComponent\u0060 (slice \u0027nodes\u0027) depends on \u0060useMediaUrl\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/VideoFieldInputComponent.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"32bd877cd75e6c81bfe8b883763c075844029308453770bba7eeff9230f43336"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 dnd: \u0060VideoFieldInputComponent\u0060 (slice \u0027nodes\u0027) depends on \u0060SetNodeVideoFieldVideoDndTargetData\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/VideoFieldInputComponent.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2f44302a1653e1ff2e883e996f74896bcf3fa9f0e24212f1c936689aaae1570"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 dnd: \u0060VideoFieldInputComponent\u0060 (slice \u0027nodes\u0027) depends on \u0060setNodeVideoFieldVideoDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/VideoFieldInputComponent.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3b8ecf333b10a519b3824cf97f667d82f6bdd588a0f42e5a0597dafbe7663dc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 dnd: \u0060VideoFieldInputComponent\u0060 (slice \u0027nodes\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/VideoFieldInputComponent.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"387e6a4b937269a7106c528e20c1c18e49e26f40fea1f88fb539947ee2ebeff8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 workflowLibrary: \u0060SavedWorkflowDisplayState\u0060 (slice \u0027nodes\u0027) depends on \u0060WorkflowCallCompatibilityMessageKey\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/savedWorkflowFieldUtils.ts"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"74ce159ddee0e7dac17018dd537359953195c504e392dbdcadcfab30c8f1c8a7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 workflowLibrary: \u0060getSavedWorkflowDisplayState\u0060 (slice \u0027nodes\u0027) depends on \u0060getWorkflowCallCompatibilityState\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/savedWorkflowFieldUtils.ts"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"99b85ff9398b8fb09a31b8cc7f3176ea28a4b0a171d265ac7893b19308cbba10"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 toast: \u0060ViewportControls\u0060 (slice \u0027nodes\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/ViewportControls.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"b222426d3781f681d7d09ebe09763a911ed24f3d041e2d6185dee0c4a1b7b10e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 toast: \u0060ClearFlowButton\u0060 (slice \u0027nodes\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/ClearFlowButton.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"198235b5635bdd1c73ec06789a49c1a5adce2182429b51be9914dde7db7fd039"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 workflowLibrary: \u0060SaveWorkflowButton\u0060 (slice \u0027nodes\u0027) depends on \u0060useIsCurrentWorkflowOwner\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/SaveWorkflowButton.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"b01b052b8b64468ea14ee7e6f63c6ff9812f0ba2c3007d41e47543dff49e2533"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 workflowLibrary: \u0060SaveWorkflowButton\u0060 (slice \u0027nodes\u0027) depends on \u0060useSaveOrSaveAsWorkflow\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/SaveWorkflowButton.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f4169ccf1bf42f6d70ddd6836971397de50e1531e7d5467c9a27670a6a885c2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 toast: \u0060useUpdateNodes\u0060 (slice \u0027nodes\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/UpdateNodesButton.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"262b923fc3261bfade4af45053fb3efd116f5ac4522194f3629a8bd2a8022f77"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060EditModeLeftPanelContent\u0060 (slice \u0027nodes\u0027) depends on \u0060HorizontalResizeHandle\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/EditModeLeftPanelContent.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5d1e16c51f4a9cc259c159f688252ad8b25018f3de465aa7b60802af9b239aa"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 workflowLibrary: \u0060ActiveWorkflowNameAndActions\u0060 (slice \u0027nodes\u0027) depends on \u0060WorkflowLibraryMenu\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/ActiveWorkflowNameAndActions.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6a7435e960b59d882c5d7da4345dd26cfac3875c762a390c44ab2351b6e3825"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 workflowLibrary: \u0060SaveWorkflowButton\u0060 (slice \u0027nodes\u0027) depends on \u0060useSaveOrSaveAsWorkflow\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/SaveWorkflowButton.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"9df82f7247b4d49093d58fd8cea8a113df8cc9ca49cf932ac017ee8ddc2f53f0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 workflowLibrary: \u0060SaveWorkflowButton\u0060 (slice \u0027nodes\u0027) depends on \u0060useIsCurrentWorkflowOwner\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/SaveWorkflowButton.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"02519659a8ac999fc524e572aa3f4dd3ab055f59f07b06b816bebec72d5d95aa"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060WorkflowViewEditToggleButton\u0060 (slice \u0027nodes\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowViewEditToggleButton.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"b53412933444ae962dc1a8534893bed0503f263e25744287bc8f274ea6bc44f9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060WorkflowViewEditToggleButton\u0060 (slice \u0027nodes\u0027) depends on \u0060WORKSPACE_PANEL_ID\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowViewEditToggleButton.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"40711ee091f427771f479014c6a99f3e487369f2f98bb7b3b9f1a1123471033d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060WorkflowViewEditToggleButton\u0060 (slice \u0027nodes\u0027) depends on \u0060VIEWER_PANEL_ID\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowViewEditToggleButton.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"d31fb036a235193d49ea1db069936921a632c8671cf7b915ecf48770173d599c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 queue: \u0060WorkflowsTabLeftPanel\u0060 (slice \u0027nodes\u0027) depends on \u0060QueueControls\u0060 from slice \u0027queue\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowsTabLeftPanel.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"62c3cd34e93126c2c8a6f1f9af95a1da035b612fff63f442415743732fe5a91f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 dnd: \u0060useAddFormElementDnd\u0060 (slice \u0027nodes\u0027) depends on \u0060dndInputFix\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/WorkflowBuilder.tsx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"1578efadd06204dd1a7c1004868d83d4aacbd60dec6090414cb40c5ba2f31411"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 dnd: \u0060flashElement\u0060 (slice \u0027nodes\u0027) depends on \u0060triggerPostMoveFlash\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"357cf3e2d9ef4b0241862c464fadb48998a1236ec4dec28560d5c8e5cd404543"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 dnd: \u0060useFormElementDnd\u0060 (slice \u0027nodes\u0027) depends on \u0060dndInputFix\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5b1f0796acf710b333966bb210a9805cf6f4e045dc84f2515ebe46f0bce79a5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 dnd: \u0060ImageOutputPreview\u0060 (slice \u0027nodes\u0027) depends on \u0060DndImage\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/ImageOutputPreview.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"7019d817f3928e78f2d847a0a8e9f554dafd2859a4eadf88af3dd007acca45f8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 gallery: \u0060InspectorDataTab\u0060 (slice \u0027nodes\u0027) depends on \u0060DataViewer\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorDataTab.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"85ab96abbeac5724f935adf3a7665fd5ca36e830b08f2f70e23122c338932ec6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 gallery: \u0060Content\u0060 (slice \u0027nodes\u0027) depends on \u0060DataViewer\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorOutputsTab.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6622c67235f4a515998199306962db6b2de9e9c3b92e09946a9b30670b1781e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 gallery: \u0060Content\u0060 (slice \u0027nodes\u0027) depends on \u0060DataViewer\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorTemplateTab.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8586cb497aa13ccc536cdde19e703a3efbf9c11ec896cf46fded5403c24c399"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060CleanEditorContent\u0060 (slice \u0027nodes\u0027) depends on \u0060LaunchpadButton\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/EmptyState.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"4049b7373890276277e38c0809127f95ae797062ee20b93508fedc61e9aeffd9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 auth: \u0060ShareWorkflowCheckbox\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCurrentUser\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowGeneralTab.tsx"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"411e3034ff00a5fe39f2e1fc3464523c9a526eaccb184533639ab3647e64aba7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 gallery: \u0060WorkflowJSONTab\u0060 (slice \u0027nodes\u0027) depends on \u0060DataViewer\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowJSONTab.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ed9e9fd14ad626048e8b50b7b725b4dcab6713144bc5fe4087d5873d9159629"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 workflowLibrary: \u0060DeleteWorkflow\u0060 (slice \u0027nodes\u0027) depends on \u0060useDeleteWorkflow\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/DeleteWorkflow.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"606dd1cd01bbf0e90ac43a48b6f00a993d40ac1d6d6506dca04a6e0e32d20216"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 workflowLibrary: \u0060DownloadWorkflow\u0060 (slice \u0027nodes\u0027) depends on \u0060useDownloadWorkflowById\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/DownloadWorkflow.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"2be001d4a89896a5a6c5e2e5c592d747858f0612ecaa06e7a968918b499c0f74"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 workflowLibrary: \u0060EditWorkflow\u0060 (slice \u0027nodes\u0027) depends on \u0060useLoadWorkflowWithDialog\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/EditWorkflow.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"66781cd0588d33c3e1eddc842a98306098d538f5f258a180462d7bb9b7379ad0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 workflowLibrary: \u0060ViewWorkflow\u0060 (slice \u0027nodes\u0027) depends on \u0060useLoadWorkflowWithDialog\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/ViewWorkflow.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"d03f586577576a2a1c28b514ef76b2eb7ccb346303c27c6bdb5ef4e2a7b3deb3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 workflowLibrary: \u0060WorkflowLibrarySideNav\u0060 (slice \u0027nodes\u0027) depends on \u0060NewWorkflowButton\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibrarySideNav.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb79ffa642675fc4e20f6902bc0c1ce7a15c73cfaad7f7c01aa3830599a07d67"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 workflowLibrary: \u0060WorkflowLibrarySideNav\u0060 (slice \u0027nodes\u0027) depends on \u0060UploadWorkflowButton\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibrarySideNav.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"86d184eb436b789642bdf7a03c3a2de199011568b0b4d86508f9ec2a6570ee55"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 auth: \u0060WorkflowListItem\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCurrentUser\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowListItem.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"579850f9cc27197eb607dfd25eb481a9a0c3d647ab12d93c8c9383c2f8c9ced6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 workflowLibrary: \u0060WorkflowListItem\u0060 (slice \u0027nodes\u0027) depends on \u0060useLoadWorkflowWithDialog\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowListItem.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1566b67ef87464a82921902094f446685e072f0af8f381d21290db939c04478"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 workflowLibrary: \u0060WorkflowListItem\u0060 (slice \u0027nodes\u0027) depends on \u0060getWorkflowLibraryListItemState\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowListItem.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"09bf728bd5c52edba78df527577fa3647a8efef1c1f6314e77a9d5a97bf708ae"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 toast: \u0060WorkflowThumbnailEditor\u0060 (slice \u0027nodes\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowThumbnail/WorkflowThumbnailEditor.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c77e66ce23072516a35c02e10c3306425df3a1a90b3f427b5db983b5bb30ed4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 auth: \u0060slice\u0060 (slice \u0027nodes\u0027) depends on \u0060logout\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts"},"region":{"startLine":812}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd3e5b44d156106c2d614708d7fce15a347fa0f45869bc92620386ef453e6ddd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 gallery: \u0060getImageGeneratorImagesFromBoardValues\u0060 (slice \u0027nodes\u0027) depends on \u0060IMAGE_CATEGORIES\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":1347}}}],"partialFingerprints":{"codehealthFindingId/v1":"5331d5b57bac17e69efe73b5f3d5aa061f2ee0dee5a8a0c68d91c81d5c39df6d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 gallery: \u0060getImageGeneratorImagesFromBoardValues\u0060 (slice \u0027nodes\u0027) depends on \u0060ASSETS_CATEGORIES\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":1347}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbd521def3530c7b5914c6475707ef85ee6d4914a6579de518515353bff86f85"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildNodeFieldElement\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/workflow.ts"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb6f8aafb09c14290b379ee2ab4bb6d66b2b9449c2368357f3d2d612e9b40eb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildAdHocPostProcessingGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildAdHocPostProcessingGraph.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"36de7f9256791dad9beeb3649970028618c2898cf1c3cd6767ee531bf9cc7c46"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 metadata: \u0060buildAdHocPostProcessingGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060fetchModelConfigWithTypeGuard\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildAdHocPostProcessingGraph.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfbc15a646f35babf8209761b2efa3dd72c1da1e9847adacddc2da1153209910"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 dynamicPrompts: \u0060getExtendedPrompts\u0060 (slice \u0027nodes\u0027) depends on \u0060SeedBehaviour\u0060 from slice \u0027dynamicPrompts\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildLinearBatchConfig.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"f05fddf0bd4f54d5eafe44279b05e6277edba9c080d17aae984b961116cca5ac"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildMultidiffusionUpscaleGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5abeb3866fc55519a30e63e02ae232d1243079330718d95c692374b31fc8b0f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 metadata: \u0060buildMultidiffusionUpscaleGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060fetchModelConfigWithTypeGuard\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"98a8edd97266bef8e9823ebd984edd48087cac21c3ea0258c6480a5786c1a56d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 gallery: \u0060getBoardField\u0060 (slice \u0027nodes\u0027) depends on \u0060selectAutoAddBoardId\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildNodesGraph.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fdeaef105a0c255023adb2e9d4dfc56139c7bb423d09b7dc0ceb5a3c939bf11"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildPBRFilterGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/filters/buildPBRFilterGraph.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"55c34b8ac33465d3f18755847972e2c94a5d02961dbfd3921d454661c319cd3a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfb3a29851342422f4d9c9797e17ff2607e6a73b8eb8853b3e919d8a24bf54b9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addAnimaLoRAs\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addAnimaLoRAs.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b39d28ef3ad31991aee7531f16f1727b93fef40562d90a2c821572088a87ae1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060AddControlNetsArg\u0060 (slice \u0027nodes\u0027) depends on \u0060CanvasManager\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e8c82efc4f9277eb200bd69bdca7b145add7ecda163036df3c4d7544cbba1f9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060AddControlNetsArg\u0060 (slice \u0027nodes\u0027) depends on \u0060CanvasControlLayerState\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"e406d01ac28fb42457c9e536d3d680076419faadcde2f0524728d5bd7bfd9580"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060AddControlNetsArg\u0060 (slice \u0027nodes\u0027) depends on \u0060Rect\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff0af51e2227ab780839a5a66ff3199953dcceec13926de0bbe2465725a50771"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addControlNets\u0060 (slice \u0027nodes\u0027) depends on \u0060getControlLayerWarnings\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"13317e5ab3701d86bde5b3bb21ca3a13f86ea0b9dd34908380410bd6d3fdc1be"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060AddFLUXFillArg\u0060 (slice \u0027nodes\u0027) depends on \u0060CanvasManager\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"83e81096fb27a87308e9287a226502573a27eab21e402eef177d34fa6d3725d5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addFLUXFill\u0060 (slice \u0027nodes\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"2edced395b3b7f69e67d6e736526a3aac66b6d4f4fd1f3a4639c82b3b9e4ef6e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addFLUXFill\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasSettingsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4101a4da3a3d1603ebdefb7e4664b7dd2e45f0af727e242a35fb3f3ae9554af"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addFLUXFill\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"29c627ea280fb903eb8eef13a79568a71e59fa4376748a947c5d846dc66dab1b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addFLUXLoRAs\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXLoRAs.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"25049941ce6c08b4760b562281b285b6456b3c9fef57a7efc53f853c1b9d51da"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060AddFLUXReduxArg\u0060 (slice \u0027nodes\u0027) depends on \u0060RefImageState\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXRedux.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c7880374970b0b890b8812e566cb53da473b51437a349d9141c768ede3b7e23"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addFLUXReduxes\u0060 (slice \u0027nodes\u0027) depends on \u0060isFLUXReduxConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXRedux.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"40a1edd19a5062ada408ff43fb23a6071233ec659084d99278522e2aa3f05b1f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addFLUXReduxes\u0060 (slice \u0027nodes\u0027) depends on \u0060getGlobalReferenceImageWarnings\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXRedux.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ca9640d77104a5f5b429f364ea4c97bcc89a9b5812c9ef3dbb0eadc1421f0d0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060IMAGE_INFLUENCE_TO_SETTINGS\u0060 (slice \u0027nodes\u0027) depends on \u0060FLUXReduxImageInfluence\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXRedux.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9e00965577bce69a8c7adb79869088562f79a64dd7204614dd9fbd44e8dbf9c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addFLUXRedux\u0060 (slice \u0027nodes\u0027) depends on \u0060FLUXReduxConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXRedux.ts"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"adf9ddc5365b1a7338144d445328917c0717a72c160dccb3f1cd163cdcd0b537"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addFlux2DevLoRAs\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFlux2DevLoRAs.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"92de0ef29250b6942b59eba5ae0fd69f0a6ea6cefbb1e28f9c1be9df0ef6a7a3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addFlux2KleinLoRAs\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFlux2KleinLoRAs.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b815a5ac9a66832e71c393b10d150ec6f015e488a65a47598a46f57b4ac8737"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060AddIPAdaptersArg\u0060 (slice \u0027nodes\u0027) depends on \u0060RefImageState\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addIPAdapters.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9569bbb1dcb8dd504071e6c9239449e3bc6734e8384a5c61aaf3ca80abf8361"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addIPAdapters\u0060 (slice \u0027nodes\u0027) depends on \u0060isIPAdapterConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addIPAdapters.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc680586a4fd7f4daf8ba0d4307c316c580c9ba7355249129b63f4e456e31255"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addIPAdapters\u0060 (slice \u0027nodes\u0027) depends on \u0060getGlobalReferenceImageWarnings\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addIPAdapters.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"f91eba620d41efb4604bb8b2c1a7eed589a978a3c4d99565a131bed522057252"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addIPAdapter\u0060 (slice \u0027nodes\u0027) depends on \u0060IPAdapterConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addIPAdapters.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f7d0a747b290473e154e765d19b121059cb17cd1a2ed747c505430518780489"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060AddImageToImageArg\u0060 (slice \u0027nodes\u0027) depends on \u0060CanvasManager\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addImageToImage.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bb8582254da784cfe2c2165e3849763916707d8939454040e9a927f269e6968"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addImageToImage\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addImageToImage.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff0f37060fc4a84bb7e6ad9a80e12a18e4a9a273ae58836c6232dabdd33c1c9d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060AddInpaintArg\u0060 (slice \u0027nodes\u0027) depends on \u0060CanvasManager\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"778edf3f3d2d2d3b402274d0ea625fd9d197b0852d2a126b2880add21defa7bc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addInpaint\u0060 (slice \u0027nodes\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"99118c5840c2aa3bd8b57beb456d759effdf620f161e52c88dc13e8780c50bd2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addInpaint\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasSettingsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bf86309a4a67493ce9dc96fde2fddcb8648d717d7d91b7a74b9448a23c144b4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addInpaint\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"04e1fb6b280446c1492d5bc850af2696c9bcdf8f1c42e30cf06b64fc133c9d58"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addKrea2LoRAs\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addKrea2LoRAs.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b5408d09a7a75efac973d42684c3ccb6e6ac859765ab11f5059b163f01f55dd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addLoRAs\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addLoRAs.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"d52383435547a12cd9dd29cb48a73f8bc69b7d2c21c6ac966771c9288d080d88"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addMiniMaxH3LoRAs\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addMiniMaxH3LoRAs.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"55b3733dd93d5ed86894e2cd0b7a8cd476c3369c2188ec45f0221bed91631f5d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addNSFWChecker\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addNSFWChecker.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"35c4d17b797f48caa937b442e60f7c181b1ec13ece76ed637d8a56ab9925fe0d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060AddOutpaintArg\u0060 (slice \u0027nodes\u0027) depends on \u0060CanvasManager\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"922c7403952dde09eeae35e7d8a06aab3cd3ebff2c30df1ae923a5c6daedbebd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addOutpaint\u0060 (slice \u0027nodes\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9b3742b39c496a9f9abf068af45ba643b6d52321f34d7c1a119387a9136d0d5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addOutpaint\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasSettingsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"625044f60ad7bec9e1ece646f39b3147b5e4fda792beca56074395e78f85d86f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addOutpaint\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"69fdac3a9908f322cde78a36a4b04a11cd64e3498410599b170c4218b032a8e1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildPidDecodeChain\u0060 (slice \u0027nodes\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addPidDecode.ts"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee7259456ec2808b6755929b1162a2bfa4e95b2b4179ba06786169872e6826de"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildPidDecodeChain\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addPidDecode.ts"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a1056992daa722c9211222d7ccd8a07846d60f3b843421733bb307784e615b6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 parameters: \u0060buildPidDecodeChain\u0060 (slice \u0027nodes\u0027) depends on \u0060PID_SCALE\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addPidDecode.ts"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"42e440263b030c5049ecbe9aab27e449a5d1642d3bbf63281a4037b42cb84e64"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 parameters: \u0060addPidDecode\u0060 (slice \u0027nodes\u0027) depends on \u0060getGridSize\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addPidDecode.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"45595a9fc42226ee265d1e54d71964d060993d63623956fe36d387afeaaad042"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addPidDecode\u0060 (slice \u0027nodes\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addPidDecode.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"842cbf4f53d2c5d9422e4e830669c0dbd436e85d032e6d6c37a05f90ce310e4d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060AddPidImageToImageNativeArg\u0060 (slice \u0027nodes\u0027) depends on \u0060CanvasManager\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addPidDecode.ts"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"c840e40343fd7ae24871b5f8634ff1f4b9d9fa9f10a8238ba0e1fb808aae07dc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addQwenImageLoRAs\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addQwenImageLoRAs.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"d14e6420d46dc2c8d6922282d3c00806cae6aa0f2a1b3a7f3ab3456ff8c7a30e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060AddRegionsArg\u0060 (slice \u0027nodes\u0027) depends on \u0060CanvasManager\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca03ae80dbf3bc2c5dfdae26ba32c3dff4d87facd405aa255517e5d329209690"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060AddRegionsArg\u0060 (slice \u0027nodes\u0027) depends on \u0060CanvasRegionalGuidanceState\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"e72ca0f559f5d13ee1864d2b36392219ff3f7b0b146bd96cfda19ce128ccec24"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060AddRegionsArg\u0060 (slice \u0027nodes\u0027) depends on \u0060Rect\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"1decdcc6e47be68798bc7e77c4f9b3a4b9fe1f4d95c94b5156fdc925ac9c587a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addRegions\u0060 (slice \u0027nodes\u0027) depends on \u0060getRegionalGuidanceWarnings\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f080fa980a713cfefed65b4c1edd41052ed047ce6f7734bc4dc450f36311a6f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addRegions\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"330e9d2a13b2b16e0df5ffda5c3c2fb82bbca8fe700ac85f0cdec72511efef32"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addRegions\u0060 (slice \u0027nodes\u0027) depends on \u0060isRegionalGuidanceIPAdapterConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":436}}}],"partialFingerprints":{"codehealthFindingId/v1":"c858c87e4d1b67b083023e7fb162f40798a9616207254c050d9628e402d63111"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addRegions\u0060 (slice \u0027nodes\u0027) depends on \u0060isRegionalGuidanceFLUXReduxConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"58e9c248975eab2b07ffa0e6a257e023d56842bdaafdb64cb3b6a5ac43b5c490"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addSDXLLoRAs\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSDXLLoRAs.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab4766c518ded1afe1f2588592b1ccc8cfd8e0cd21080f6619e836c2ee2684ee"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 metadata: \u0060addSDXLRefiner\u0060 (slice \u0027nodes\u0027) depends on \u0060fetchModelConfigWithTypeGuard\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSDXLRefiner.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"2649a1f2a586d07c064c42e109eed0efbadfdac6b6e7742d86b0113a5ce90766"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addSDXLRefiner\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSDXLRefiner.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"1acaa657b6c10352d4bfff6567b3fc461aa4afe75e1ffd0a8f40a5ab2b8302d2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addSeamless\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSeamless.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"a11a88e7160a569242fe91df611f2a3710283b7bb4808055a92d2930cbc35e15"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addTextToImage\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addTextToImage.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e1e094a0da49c2d8a78c170e3e0ad95da9db9891086f636486fbacc3f49abd4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 metadata: \u0060addWanLoRAs\u0060 (slice \u0027nodes\u0027) depends on \u0060fetchModelConfigWithTypeGuard\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addWanLoRAs.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"606b933daea87084929c852c6b0721bda913cd9be917d14ad552f576d299639f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addWanLoRAs\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addWanLoRAs.ts"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"9631c412e58fc5f5cf946f7f990d6131b98019ce8f842a6ec9b91e633bfdace8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addWatermarker\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addWatermarker.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc692d2676b185ecdd847dad0f5c2d8040c7d006aab60a7278911b41964d0ed4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060addZImageLoRAs\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addZImageLoRAs.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7f7baa124e4c98f6521faefc60bf29302c980a753ca847e2672f22255275ed9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildAnimaGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee0c0faf32ecc18ffe114356c29602aabfef9c7e7d5b690fde8d26fa68cd7eba"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildAnimaGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectAnimaVaeModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"90f67f1e480fa5e25e08fb9eafaa41ea241cfa2bfb02401d15dd1d746156466e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildAnimaGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectAnimaQwen3EncoderModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bfb0409e36d73a0acd256a3fd1861fc02bf91a93585300b90fea8744c8053f2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildAnimaGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectAnimaScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8b58b604de6a955c1f4e8a8b8ae137a8ca40183581ba9d957ae5d8afe4a3e93"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildAnimaGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc4fc4b0d4a16cd53ec7afb221078d3bafd1978f00c0cbb5b33fd81f5bd63720"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildAnimaGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc4b3d67178ee66d09b44e003d8a9c91b466ef873d626dcf7741f281ac7856a0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 metadata: \u0060buildAnimaGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060fetchModelConfigWithTypeGuard\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"f094c873a7edccfd7c1b20c1a5ebc15ef6c2088c0f9731cab45a7d0b7ae5c988"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildAnimaGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"03d4fab46774dc82991d1089f4352d3f31734f23aa06b1a935226fa02c44eb50"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060buildAnimaGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac0365f86750f250cfca3db6464b46f2887a6760ca17084a139fd355eb8a006a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildAnimaGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasMetadata\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"28fc210eaad0859c73875dd7852b71927eae4a649dbed9c1f47e532c4b2ee512"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildCogView4Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"05981c9fffcc7afd26cc7eb77d941592a88ea9fc41abfc60f4bad46e86d16542"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildCogView4Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"55e7cc912222a9ce5eef3e54449953c4cdf80ec9b7068ea3e5d3b5f87ed52eb3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildCogView4Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"d035abccd2f7f0a8891ef58ebcc5de29229790670a70fc6486bc505bd751a85c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 metadata: \u0060buildCogView4Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060fetchModelConfigWithTypeGuard\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"75e1e3b2941367239b78fdaa85e0ecd75efe266d621cae2b6e05febfbc4c905a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060buildCogView4Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"2837f885328bd1d99a4cc6ab0f1be44d94dde4ed04934ddbaf8b5f546be40b3f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildCogView4Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasMetadata\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cf84a2b6dd2a1b68f59a3a2ead71a0f16435ebe64226026f5727c778c2058fd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildErnieImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"a46285411367160c2760514e36791d4897b2957ab665a923497eb4485e45edd3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildErnieImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0f09ea6f9f1386f40ea29350b7d16a5387ff02d64751ad7128b7d00caf7f116"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildErnieImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectErnieImageScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"911f16a51fc35ad7b3fc976ccfc0962c2ba0b7befb45a1a4359bd8c4d635c6ae"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildErnieImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectErnieImageUsePromptEnhancer\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bf7e19a67cad31e4159484d137c7e9bcef23b7528324318d4ce0b51c43c4bd2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildErnieImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a794235ab204a810c2696a4a44b43818a90de170e7015db90f8feaeba1f7e06"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 metadata: \u0060buildErnieImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060fetchModelConfigWithTypeGuard\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7f7bb0a49c4f9c24faf4a638f53d8070bab4dde6fde970a7263a1dd7b0731dc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060buildErnieImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d1dec89d00795ec16d23d3f27c967cd744d69649445d5d3757566a782b2fc4b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildErnieImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasMetadata\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fb1bbc13a9ccedcb2c6c00b7453b5d2a228ae0aeb263b5cae243dc42ef05426"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildExternalGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f0d946ef26498d6b02b175e73a84834ee2d194b1e27eacd9b97b3c0436a13af"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildExternalGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"14687024c3fed0fad866e034f720b0bd2b5fe6d23be9cdc8702e85c3f307e6de"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildExternalGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectRefImagesSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"f99dc106339867224349a6ad99eae891e88381f52ce7fcec2b3f52284e21a934"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildExternalGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"48e854bb0f7093a1296c54864681b1708dc364c403e7f9defbf8458096622400"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 parameters: \u0060buildExternalGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060hasExternalPanelControl\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4930913736eafe80c547d3024aa90ceedc6a1c66ba538b0ca72054321bcbd72"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildExternalGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasSettingsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"7611f37d4512115e4d3339604185b6dd4ebccbb67274670ef39877b7743410e5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildFLUXGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c52ce4ec7e1dfe0a7fb4b961891ec2eaf5720131d966e03508c51a1ce09886a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildFLUXGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e0b2fd33a81e38880143ce222681d1435490dd1af6589bf771c66d172592717"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildFLUXGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"82838d27f336b4a3deb1315598b752888616427976dc5dee64474cc2f425a9b7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildFLUXGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectRefImagesSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ec79a1be02b6ba46eee191fa6681eaeadf782ef4598c7ea86dab3699d00ccc6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildFLUXGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectFlux2VaeModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8c8ffe19ceae8ff931ede646f2d57da2d3335dfd509c634686c006b3b9041f2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildFLUXGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectKleinQwen3EncoderModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea0621d24bdc7922caebd24ef999ae284596740c260612b8101edac671de88af"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildFLUXGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectFlux2DevMistralEncoderModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"2aaf5c4958ffc9932e033e2680aac3c872c07f1c08c505ea3738002bb7df222a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildFLUXGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"22c7496be6f3060e4f430af0ced35c633112557120cc26c27767232eb20ccc5f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 parameters: \u0060buildFLUXGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060isFlux2KleinQwen3Compatible\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c80b500dd64732f3f7c8fc894365d2a5eff64968ae81ec320c1d5c38ce0d3ea"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildFLUXGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060isFlux2ReferenceImageConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"a190e0c16af362840173645a8f3264ea00d20324826cfb2d84307ab2620ec19b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildFLUXGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060getGlobalReferenceImageWarnings\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":401}}}],"partialFingerprints":{"codehealthFindingId/v1":"71b09ffb8101282634f34f2614e8770e54df68b456f678ce6f7c76e0af96eb5a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildFLUXGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060isFluxKontextReferenceImageConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":634}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3d4e3c8bbbd1b8ee9910ce76c73a2d8dc03901547ef9a107aed4869eb99722e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060buildFLUXGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":887}}}],"partialFingerprints":{"codehealthFindingId/v1":"feee7dbbcc81d0655920976e5b6bce01d9f3dde05d7c6fbc5555581695d9df9f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildFLUXGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasMetadata\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":888}}}],"partialFingerprints":{"codehealthFindingId/v1":"16a5662d63161303c5cd5d4664e55c0adf0b4b6f3fc07f985d024b4e1fa1997b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildIdeogram4Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"01cf78a6032b527445990ad2c1503182de86ccc4c00885ecde28a328401cf7b5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildIdeogram4Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectIdeogram4SamplerPreset\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"27761bc58448b616373643e6046b889835467be0a559e7410290d826fa499cbc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildIdeogram4Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectIdeogram4Steps\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2ce4933ee4ea3197708395fd3ae140dae2de5d5d7fd9eeb6a17a8d82c475e6b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildIdeogram4Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectIdeogram4GuidanceScale\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"897036f73c60bdd0b0f4d911ea6b052570c189c8cb13d93481979deb081f20de"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildIdeogram4Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectIdeogram4Mu\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c61a256e9a002fae5cccb84b895c110a179b6a3640e2384f272d116816fd14f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildIdeogram4Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2d70d019411f09179373e524b0e37a19e4730f93aa708dc2537190be0f88102"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 metadata: \u0060buildIdeogram4Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060fetchModelConfigWithTypeGuard\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f77e30888e999fac18b2ca0b0d3c93fca96a86a3e6b017d036879fd4e8d2245"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060buildIdeogram4Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"19bc494da7382a187f1c9371df395debfc09330781a9cf7811b3ccc6e4801f3f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildIdeogram4Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasMetadata\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"653e5e72f7bf53d6c47287fb04204bb628437681810ce6ea747feb99b99f2566"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060rectToIdeogram4Bbox\u0060 (slice \u0027nodes\u0027) depends on \u0060Rect\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Prompt.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a93450cb96258a5f56b1934062651f38d98f2515aa7e8095b605eefd2ed05d0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060collectIdeogram4PromptInputs\u0060 (slice \u0027nodes\u0027) depends on \u0060CanvasManager\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Prompt.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"b701f13400678cc382e37faba0c0c00c884a6098ddf6311ee8e25ec6f53ebcf3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060collectIdeogram4PromptInputs\u0060 (slice \u0027nodes\u0027) depends on \u0060selectPositivePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Prompt.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"dec9bab166a1e661e41102d6446a3fd4056f24ab985ba5c13c88a1122d8ce985"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060collectIdeogram4PromptInputs\u0060 (slice \u0027nodes\u0027) depends on \u0060selectIdeogram4ColorPalette\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Prompt.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"a431a007eea44e334d893d039dede44fa74d00991be80696e86d22438e77432c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060collectIdeogram4PromptInputs\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Prompt.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"62213e2dac89e63519d112f50cb75fa3b600a9336c6ec3e83849f1f8fff0b76d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildKrea2Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c072ab3e68c5d17bff8c3c0b3133b15579d085cb8c8ecbec483c5c13b8807d8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildKrea2Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"2709c87b16c351404bff5bfbf9111a7f04168b2267bfa2ec23b9ac644c43829a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildKrea2Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb28316e123383914fb32c6c5a0503f31cc48ad9b6de78076eb7f267a2da8649"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildKrea2Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1bdad81d4cf6ccd8904ae7db814408838eb72e7c803f500871ea91fc69779d6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 metadata: \u0060buildKrea2Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060fetchModelConfigWithTypeGuard\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"72f014d0868fa3830673f367898f279c056199c23857a55b09c115dfa3aeea12"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildKrea2Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectRefImagesSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"79cb38a8f0c6ca9bcaa23847d9be98757a27f09d7bf0821154fe23998685825e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildKrea2Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060isKrea2ReferenceImageConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"394781b63b94793a434aedaa3f1f28b51cbfb4ef2f04b6a69b1e37667399a478"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildKrea2Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060getGlobalReferenceImageWarnings\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c9ee514dab538eb98de3b3e299943b3120cd2a59852b0eb2231bab543ce1118"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060buildKrea2Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"d58396c5f3acf65cd783757b472e9b99f64da490dc8dc87c3782c1983e1b371b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildKrea2Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasMetadata\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"88ffb01056724e096d578b91d839b9b018a70b09e0992e88cd32eedb0ca443d1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildMiniMaxH3Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dbb48bd23b36020ab023f7d65dd3d3f09f6579b93d5f222b8ee3ce7983064d7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 metadata: \u0060buildMiniMaxH3Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060fetchModelConfigWithTypeGuard\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"c41c0b88362bbfdd3bafa8b1f24c80adb3a142b80b3c3f53bba7df0e28af8ca4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildMiniMaxH3Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f9cf72b4534355fc8ac3eecf2bf8905c71c8eea6b9edc7dbf4f0b8307b6f93a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildMiniMaxH3Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"b74a45585e68bf9704f81acd0a27a9672056ecf7c7c7f85b684df783232949b3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildMiniMaxH3Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectRefImagesSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"8962d25d98ff75680250ff481bfebce950ecb011748f8b3b0a7611179bc68c71"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildMiniMaxH3Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060isMiniMaxH3ReferenceImageConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cb0e84a480e3a0b21d600a88aefec96b96f9016ecb7daee90b9ec57e9775ed8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildMiniMaxH3Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060getGlobalReferenceImageWarnings\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"522e2aa01685270567cdf9eaeec2d4841ad506679a2a23ab14fcccbc4f5c7a14"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060buildMiniMaxH3Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"2def6338a5660464a9a01069342afec1ff890f5e3a236ac133f0905d1304b2e2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildMiniMaxH3Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasMetadata\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ee29e94e0606b6b7ed9aaced23f4cddab16aacd3b654d65fb66b7934b4b56d9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildQwenImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"5430374e02c86d40e8fe59c02fc458969e7cb491b3bc04401407bd01f63f5a3b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildQwenImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"93280f4780af6f9b055f049442e61cbcbb475e86d96fcf3be8fdcbaa3362311f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildQwenImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7fdb93b28bb90cf6d29ba2db3a76bd417249ad3dc5ea7b18281a6d9fb228c38"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildQwenImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectRefImagesSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"1199f2ae6648cfa1a18b2477d7d1effc280cc4d7e6181390d3261894661b43c0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildQwenImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060isQwenImageReferenceImageConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a803814bed9f94de55e7d713677dc90c6f72aaeea31de8c4561f7785fd888c6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildQwenImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060getGlobalReferenceImageWarnings\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"83bf2985b1c247277884f0342110d78f99110e6c0836db20cdad5e395d26ea68"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 metadata: \u0060buildQwenImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060fetchModelConfigWithTypeGuard\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"600b4d9e18d30264dc18c6a9ca890ba3557199e48df25b1acb1e18b2decc4dd7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060buildQwenImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"da3443e4e1f6551cdda2648925d7393365a2bdb3ea9b9d7a7d596077adfec70c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildQwenImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasMetadata\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"95a10f53346fe833090a0800a59c21063207f9df0ee130e57b376eecb353ec26"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildSD1Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5dfdb7dd63e787430567d1dbde0a78b2bcabce2c566892b9094a17d6c29d55e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildSD1Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"20e2b3b8795ff77e1b8962b839b148c6dd46528b896f9bc2545a4b09996b3a61"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildSD1Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"09c612992c99ce6b73aba1f498384905a92e2d01abae6c33294258c32c7165a3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildSD1Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectRefImagesSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0f62b69ccb747a0c395f95e1c2916ba8c73afe0081ded1bf968d4860292930a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildSD1Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb0d231f1ffc25a395973a00ce7fbf87e9a2804780387402f3467d54045f57ed"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060buildSD1Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"0907dbdd8bedfe8423242a566a8631dc28ae625cca06b0f7a86759d933156ca9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildSD1Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasMetadata\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"eacd8344b5d33ce41afbee5746fc1f41a277ad8529f9a77ba809aee7f8f1939b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildSD3Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"1978bebc70a00ff1ac5e0e11ca9538c466828e474c6411cebeebf10d61062dda"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildSD3Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"625fa6ec801f15f37d453d5f2ddb508e54308a13b06554b7e844ec2ae310325b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildSD3Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7577d93c67daa5f969061c20526de8d69a1cb3490a8f2188b46a7e9be6fc6b3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060buildSD3Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f4f330551302a89daa98112527d5384f03ac9fe769a99dd78af7b08ba4c58b2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildSD3Graph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasMetadata\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbd5f440b74c1571e8996791bc3967b2b895be98edeacac8a0150678f7242724"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildSDXLGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"6de6fe3e0c0f7754caf70b155cf101eacc0c1ad97970c54470bd1d191ec1ca71"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildSDXLGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"553ce972057151be7c25328e71338e5ff69f5974d6a4042d57347c981baa93fb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildSDXLGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"03ed8da7ab1a983b2ffe2ce3782becb37f8734278d003ec2f306792e5955e790"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildSDXLGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectRefImagesSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb2a85fa4bd3ad068038dd0cea0d376375ef169806c5f4ede4a0974ff261303d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildSDXLGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f56a46776c927d025f7f4a9630495af19782519f8f11504a433abfdb3bf52d5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060buildSDXLGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"54548834bde0c8e8ebb67693682576c4bde34ef5cf122014829eb7a4d745a5fe"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildSDXLGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasMetadata\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"fad26b37bf57422f475eed9c08f37aa39b32d670c08ed9b6aeab80ced8ab7729"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildWanGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0f4e33cc8984d80bf7b132ed3cc3ba46f340f2545689285c66b291816a1a71d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 metadata: \u0060buildWanGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060fetchModelConfigWithTypeGuard\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"de473495e0896f230989ef959f6409eeaa94cacc3b64e93f37b529872109a0fe"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildWanGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d766a8d0102cc439314e4379472990d57ab8b4e4fa3a5e9ff5c6221376e7e49"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildWanGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"c44bb7b61fa10cecedec76d84b9a6b01be618ea44b20d26dd1a47f94b97c144f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildWanGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectRefImagesSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"343a17a83f16a9105f41b13cbd569f39a354327b9697c2a89eef93691cfddd69"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildWanGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060isWanReferenceImageConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"40ac8f3e6f241eaf05bef7fb9b174906bfd3e2b68583a9245d960aa2d29033e2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildWanGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060getGlobalReferenceImageWarnings\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"40933554b722a33860a3a31fb2204cae38ce6e572f641b49d5210ace216f63bf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060buildWanGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"14b8e48472b69e636f087cf5ff5d63c654301cbb903d21a3850e6fe1bdb5dff7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildWanGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasMetadata\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d291e125561bdc044c27955b9809d08606990cf179d05f1138c38e5fe9c4436"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildZImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4452826219c1db723f345269cf641c156e85ca88e01220cff95959ff844c143"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildZImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectZImageVaeModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"68f39684a7165f7b80af7de255bfde5fbb1efd653e711836b163b94dc8ff936e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildZImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectZImageQwen3EncoderModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"24c2c231dcb918136d9f136b254052a293f1ce47c5d96a36ad8011dc566fc763"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildZImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectZImageQwen3SourceModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e767b29e0d93dc52de24aa5bfc38dfc4e8f1833d9a4be42f83429165fce2e47"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildZImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"95cacdb37bdf315bfd03e40fe99af01d436cab31f998835dac9cc761a37099c7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildZImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectZImageShift\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ebc5e32feb505fdf3fa990e9ebdac2fa20c9cbdd48b04d8d6f539ba354bf5dd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildZImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectZImageSeedVarianceEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d9b2151d8bca3974dc43e0018f9fa25254d48f257c8faaeac593a518d361ffc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildZImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectZImageSeedVarianceStrength\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"189f3b4aef1cc55f34f015857adce6a85d5a67536b33dcfb91c5f99b715ed894"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildZImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectZImageSeedVarianceRandomizePercent\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"62fd68b7b6c041ee554d118f25b96b2c9ab93670f9c817e3c4d6c5ffedde7be4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildZImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"b111407f6f7175ed7c29ede1cb04f5dbe66dd61a7bd036ea15f4b6faede9f8c4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildZImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4cff9dbdea3ed7cddf09b34cb97ca602fc9a7bede0965688ece9e4a81df7e6e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 metadata: \u0060buildZImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060fetchModelConfigWithTypeGuard\u0060 from slice \u0027metadata\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"655017fec2b7aff2176d2fb2a3c955dc19c58c51195b328f532fdec1aae0f81b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060buildZImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a68910c94fd1ba94d5294f155ca8e1692c39e7fefbdf6a4bc12844321b3db2f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060buildZImageGraph\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasMetadata\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":405}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a218d07bd163ab164ef78c9ae2d488da8477a2eb00fe1dcbe352184930da688"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 ui: \u0060selectCanvasOutputFields\u0060 (slice \u0027nodes\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"67d36fe67bcc925ad80d316d3b3afd226e9e68535ed94f653ad20cfed176799a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060selectCanvasOutputFields\u0060 (slice \u0027nodes\u0027) depends on \u0060selectSaveAllImagesToGallery\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"52ee29d04c8dec6abdf1d9c24b16fc762c27e6e38315603daf9a0a1020e30894"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060selectCanvasOutputFields\u0060 (slice \u0027nodes\u0027) depends on \u0060getPrefixedId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"62dce6fe19b2a05ea3749ac7ee91fde23192e91c82b613f4aa2aea929cfa0c5f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060selectCanvasDestination\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasSessionId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"df07ea7e85633ce327cb190b89f8d50081cccc18782def804af7f2647e657b0a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060selectPresetModifiedPrompts\u0060 (slice \u0027nodes\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"672b4784d4281b24944cce3c3e5318406b084c4fb71cfc3075aae679888f34d5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 stylePresets: \u0060selectPresetModifiedPrompts\u0060 (slice \u0027nodes\u0027) depends on \u0060selectStylePresetSlice\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"8797d2e9052e35f8c8210c6c56904df25dcf1c98902876ea08af531dc4d39308"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 stylePresets: \u0060selectPresetModifiedPrompts\u0060 (slice \u0027nodes\u0027) depends on \u0060buildPresetModifiedPrompt\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"24b9ef19cc6e42f150a7aa41b6583c189ac810ed34288231f5faac89291b6134"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060getOriginalAndScaledSizesForTextToImage\u0060 (slice \u0027nodes\u0027) depends on \u0060selectCanvasSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef2f4ce2117b99fab0a30dfc384651b13c49c4ee064966d6e72c2ae10e7e1c6b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060getInfill\u0060 (slice \u0027nodes\u0027) depends on \u0060ParamsState\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bc4aabc9e952e0f7f0a73405b88607daafafacc98ce460b99b477c200dd47c3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060getDenoisingStartAndEnd\u0060 (slice \u0027nodes\u0027) depends on \u0060selectOptimizedDenoisingEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a1fc1370cdf2f31142bbb4ed322baa315b505d431ed2a8419f6947e4c50bd98"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060getDenoisingStartAndEnd\u0060 (slice \u0027nodes\u0027) depends on \u0060selectImg2imgStrength\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"8488fb701458ad3327932ccc8fed350c281a7d000076b28c6ae8881cb6910a52"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060getDenoisingStartAndEnd\u0060 (slice \u0027nodes\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd81a8ee4699b5beba7b7b7bb36781125d2a24edba0b5cbe6c4d2ba12886e9b9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060getDenoisingStartAndEnd\u0060 (slice \u0027nodes\u0027) depends on \u0060selectRefinerModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"43d3fa51a7ba4329343c0d7e0f3be5ea5f1692d4554c3d86af38d6df51e53c7d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060getDenoisingStartAndEnd\u0060 (slice \u0027nodes\u0027) depends on \u0060selectRefinerStart\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bf878a6cf203aaf25df74ccbbf5ebc742e939f5712e950a9679513cb1fe6cb0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060GraphBuilderArg\u0060 (slice \u0027nodes\u0027) depends on \u0060GenerationMode\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/types.ts"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"45e1500d9de03521646405036d36fed3d2216952201362978d116b5d97844b33"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: nodes \u2192 controlLayers: \u0060GraphBuilderArg\u0060 (slice \u0027nodes\u0027) depends on \u0060CanvasManager\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/types.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d7f1fccf3ea2fec3b6269e6a63c44e46f5a6d3d94c856a8d04d2958586994d4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamAnimaVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectAnimaVaeModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4b6aac5bdc0018a1e3e8d6181f21f59244e76493d4cdc9eaa63ce05bbc5f106"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamAnimaVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060animaVaeModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad556c585966f8fa10c70c594f8a0cd911420a7be4541ab9b9acfaa7df12ce66"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060ParamAnimaVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"df0bb0e669e45d79f1d8c4c5724ffb44db56494cf7746dc7a5abe6c122257f72"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamAnimaQwen3EncoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectAnimaQwen3EncoderModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"26a65335973aac6002cc026e4417542e639c34411c082ebb2fb0297571531b12"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamAnimaQwen3EncoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060animaQwen3EncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"e34292eab64c72b0533bce10d7a17064069052360a5ab3186c68ec39c80b46d7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamAnimaLLLiteModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectAnimaLLLiteModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d1e7eecf429ff4ded450defd8cd9052dd53f10f0564a2548af1a838f5f5ed90"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamAnimaLLLiteModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060animaLLLiteModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e77223299cab256e3a8075d48a9a56628fec336adc856dfc86a10649a002ad9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamAnimaLLLiteWeight\u0060 (slice \u0027parameters\u0027) depends on \u0060selectAnimaLLLiteWeight\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"5210849ddb00e2c7005427f83314714305578bdb8f48f50b3a6e4d6b285e8c81"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamAnimaLLLiteWeight\u0060 (slice \u0027parameters\u0027) depends on \u0060animaLLLiteWeightChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8aff0a8b8c591db0abb5402ab5ed892e18b5b5ad283261e93afdeff7e9c636f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamCFGRescaleMultiplier\u0060 (slice \u0027parameters\u0027) depends on \u0060selectCFGRescaleMultiplier\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCFGRescaleMultiplier.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec171a4c9ae4be4ec22a5befce14e58aeae79068c812fc9872dbd21a0287d627"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamCFGRescaleMultiplier\u0060 (slice \u0027parameters\u0027) depends on \u0060setCfgRescaleMultiplier\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCFGRescaleMultiplier.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f0a4982b4a30ab1dab571bdd607f44e9e66ac87ef54c51bebdf06dd541e9fcd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamCLIPEmbedModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectCLIPEmbedModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPEmbedModelSelect.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"882cc68ae8d9fd31d0dcc76533d8155a1cfa83db8efa6e3786a286660cc79a4c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamCLIPEmbedModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060clipEmbedModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPEmbedModelSelect.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"d251b753fc1658ac1c7eccbcd9f10e66b7759241bd11668a45192404b788b4a4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060ParamCLIPEmbedModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPEmbedModelSelect.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c9f7842169fef897dcfd8604417a884d903e87af9814c2d3181dbe6ff3e7724"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamCLIPEmbedModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectCLIPGEmbedModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPGEmbedModelSelect.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"075fc36709be323fab51cb930ea79ecae93e6697b09a987ca4863b039c72ca61"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamCLIPEmbedModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060clipGEmbedModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPGEmbedModelSelect.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5108701b0d637229cbd85a9aec1f9a86e7ac614c83ac4244867675fa1b0426f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060ParamCLIPEmbedModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPGEmbedModelSelect.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccbbc7a14584a30dc42f7af20d955da522d6ae14c678248adc9fa154ec77c579"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamCLIPEmbedModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectCLIPLEmbedModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPLEmbedModelSelect.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"340d24606ca28c53ae75476d354e1243288b416570e8cd77059b5125960f92c5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamCLIPEmbedModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060clipLEmbedModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPLEmbedModelSelect.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"37f002ac3110d2cdd814daeae52322b7a882e507a597baadfe24b9b97703b637"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060ParamCLIPEmbedModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPLEmbedModelSelect.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa92d3898926d574621397630e45c0f819539b0b9c625eb143e99b50799e0cd9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamClipSkip\u0060 (slice \u0027parameters\u0027) depends on \u0060selectCLIPSkip\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamClipSkip.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"206269047ce6bdc10aabba6e6be5cb740023ba266bb9e9348add5d6c864719ec"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamClipSkip\u0060 (slice \u0027parameters\u0027) depends on \u0060selectModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamClipSkip.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e60e03d37b8eb4036252f2fd49914274e2f158b676a8daa4755d52b106a157c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamClipSkip\u0060 (slice \u0027parameters\u0027) depends on \u0060setClipSkip\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamClipSkip.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"86759a13ac5f13aed43fd09361cdaf01f298f35640aa2297ce09f8bb9ca78721"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060ParamClipSkip\u0060 (slice \u0027parameters\u0027) depends on \u0060BaseModelType\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamClipSkip.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"6706bf441be199bfb3071fb08a07d678e5a324e3e782485721f4cb9bfdc0de5a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFlux2DevVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectFlux2VaeModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"34331b1a9030a2d5d13c3d1825e960963277fb4edde82d07f3c1d403575e9dab"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFlux2DevVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f047cd2f5be1e9feed12cdb6c367b383ea40eded9646a943dd4b6394c58f59e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFlux2DevVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060flux2VaeModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d932cb0df39e55ce93a5e7421fdaf439cc249f9191aaaf8ef4dfbbe7e1aa6e0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060ParamFlux2DevVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ef3cd0c04cc1bf80522127c231aca55a44afcac44ac657f7f0829aaa7880a9f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFlux2DevMistralEncoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectFlux2DevMistralEncoderModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8c82c7533982a5034f88f20de6940854230be546957a081f856713a4328023b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFlux2DevMistralEncoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060flux2DevMistralEncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"9326b70e09f07cb63ef24a07da8b91177b7c2f5329e18f7f0ec99a57bf65cf98"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFlux2KleinVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectFlux2VaeModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddcec2d2a2cc68497d9edf6857f0815b2d4f0ef100ac4527ee48d1a6211dc971"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFlux2KleinVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"05d6dc1b793b9300bec86f8fa16d026ba69d5f7cbaafafd7d172b1c941a3b11d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFlux2KleinVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060flux2VaeModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fa979bd359d3527e6cac6d932a54a0e554edf7c68f7bc671118af6077484a2e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060ParamFlux2KleinVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cc6159b35151bbc2ca09b22c94459c227e6a2ae2525fb5c31daafedc37e8e5c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFlux2KleinQwen3EncoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectKleinQwen3EncoderModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbc9d27a1a19faa83e37cf61889bc399abf0d8c26caad6cf7f785875165e9b68"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFlux2KleinQwen3EncoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060kleinQwen3EncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cb4e682326c59807851649f23c614b2f7525a058d0952b7836265661e72a156"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamHiDiffusionToggle\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHiDiffusionEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"38aed1264c3b717b8a08fbde198cbd379e43e62dda21607a0f5fd36f76c0156c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamHiDiffusionToggle\u0060 (slice \u0027parameters\u0027) depends on \u0060setHiDiffusionEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"03d3eb44d74c214be6a5da816eef39ef94e0ca1465a94e8d803c9f172dea27b1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamHiDiffusionRauNetToggle\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHiDiffusionRauNetEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"1eddc0a6162b7cfc4e21bde842390d1a9ec6ceb6ea71fe5c54816c1261161454"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamHiDiffusionRauNetToggle\u0060 (slice \u0027parameters\u0027) depends on \u0060setHiDiffusionRauNetEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d908b5e30006cd2f19f2350c53575754ecc732d118ab7e4eb9b4306d2d06267"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamHiDiffusionWindowAttnToggle\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHiDiffusionWindowAttnEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"adbe9b381706825153ae8faed54f6496262a2d04c13a77c334551d74fc5a07ba"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamHiDiffusionWindowAttnToggle\u0060 (slice \u0027parameters\u0027) depends on \u0060setHiDiffusionWindowAttnEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"de30d24907e0e40880a4408414e0104d1a081fa47248fed48761496277616a1d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamHiDiffusionT1Ratio\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHiDiffusionT1Ratio\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7df9870ec79d472c0c776ce1f5781e5c1a1b47d7f28e5e62e2813932e2dda61"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamHiDiffusionT1Ratio\u0060 (slice \u0027parameters\u0027) depends on \u0060setHiDiffusionT1Ratio\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"d642e4f07f9dd5dd4c645a2b47cb7053e6a7dd3b2f6635bf2f7141d2f7076bd0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamHiDiffusionT2Ratio\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHiDiffusionT2Ratio\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"67b5cbdab892b674b00533dfe29947105864d43a34b24198f8caf1fecf27795f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamHiDiffusionT2Ratio\u0060 (slice \u0027parameters\u0027) depends on \u0060setHiDiffusionT2Ratio\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"347180c8bc8fd00c6b4b98776f98b733ff1e84063bfa7fd33a25b96b4c8859a7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2VaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectKrea2VaeModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"229fa2988bbac53f0de351e12e3d668d25cad0631c12005c8dd7556c240d9525"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2VaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060krea2VaeModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a84216adae72256c097afd6fc0fa11734e0e93057cfd8f7e889b67dccf5d4cc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060ParamKrea2VaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc0a51356fbfa4468aa1e6bb80e886d5dec2d60fe574e3afe1878a19c164a44d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2Qwen3VlEncoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectKrea2Qwen3VlEncoderModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb08bc7ea711630b51e1433ce100d9aee5de1bdeba03126d6090a58eeceaae85"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2Qwen3VlEncoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060krea2Qwen3VlEncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3a6c380e4a6d5ec2cb93f2b847a04b5faa18a78c512406a82c81768dad1ee49"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamMiniMaxH3TransformerSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectMiniMaxH3TransformerModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamMiniMaxH3ModelSelects.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"070b195f510e867986a1db301c440bb950c99c67a863dff096448547671ee50a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamMiniMaxH3TransformerSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060minimaxH3TransformerModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamMiniMaxH3ModelSelects.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cffcf9a26533a1228ff1b4c90d39e305ae8a9f2565604215b21949d3e2975d9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060ParamMiniMaxH3TransformerSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamMiniMaxH3ModelSelects.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"223c6d4f549d501e8685577437d18cc0524f2f70678ede7ade43ad4f4eeace79"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamMiniMaxH3TextEncoderSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectMiniMaxH3TextEncoderModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamMiniMaxH3ModelSelects.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9aa3a1631a5f86442ea3fc24b5ae0e0e25eb1bf4e2253d97cb95a39cb84d071"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamMiniMaxH3TextEncoderSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060minimaxH3TextEncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamMiniMaxH3ModelSelects.tsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"365fc4d57ad0c6266e4ad1b26bad4fd25e8e03e0ade0ea7f0506442872236e66"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamOptimizedDenoisingToggle\u0060 (slice \u0027parameters\u0027) depends on \u0060selectOptimizedDenoisingEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamOptimizedDenoisingToggle.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"69449ff36ce3fee461959af01b4cdf5f24d0d3fb84b3b63e31e8018b21bb5991"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamOptimizedDenoisingToggle\u0060 (slice \u0027parameters\u0027) depends on \u0060setOptimizedDenoisingEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamOptimizedDenoisingToggle.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8840747278cbef644e1b5fa21e5143fd33811e5dbb4053bda150ae1f55caa97"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamQwenImageVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectQwenImageVaeModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageComponentSourceSelect.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"61e12505c575291db2b8d0397dac3f91454977e2b6bd5cfb75fc96fd6166b221"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamQwenImageVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060qwenImageVaeModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageComponentSourceSelect.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d197e67f09c40ada9fa032878cffe5b06fb1be5c2d857091319e2ac37e4cb79"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060ParamQwenImageVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageComponentSourceSelect.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"1360f5eef6a682c9f35682e5b055e342fcae065fa66fa8d51ed4d883c33cc2be"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamQwenImageQwenVLEncoderSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectQwenImageQwenVLEncoderModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageComponentSourceSelect.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"a54a55da0f38564f029d8b8c34fbf525c1f9426e06ad8ad5e254af5880922d8c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamQwenImageQwenVLEncoderSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060qwenImageQwenVLEncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageComponentSourceSelect.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f70819f8c016174869028b87b357d25fc75926e0a3036f924ea69d13f90f97c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamQwenImageComponentSourceSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectQwenImageComponentSource\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageComponentSourceSelect.tsx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5468b0bc0247bdd71c42e9079cf2c4250f06bde8199a9d4fa7bb2c22f9a22ec"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamQwenImageComponentSourceSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060qwenImageComponentSourceSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageComponentSourceSelect.tsx"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"eba569bbc8f6f89f990d32ed403dbe610160cf42552174ca7af7d226d24c804f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamQwenImageQuantization\u0060 (slice \u0027parameters\u0027) depends on \u0060selectQwenImageQuantization\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageQuantization.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"adec76198036fba6495fdcb193bf1ae9e0a42ffd48baa4ba59eee8fc183b5b5d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamQwenImageQuantization\u0060 (slice \u0027parameters\u0027) depends on \u0060qwenImageQuantizationChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageQuantization.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"5db0830995bf4b30ce339171130995fd54f7d757db4a21ba2f5e382af428a72f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamT5EncoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectT5EncoderModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamT5EncoderModelSelect.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"38f0c83ff2fd3f53d28fbb159038d6fd70b4fd1abff99e43b2ddd1cbfccb07c2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamT5EncoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060t5EncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamT5EncoderModelSelect.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"f51cfda104429a07387416ab85023c565e1cc255a9f0540e5c8b21c952b22f91"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060ParamT5EncoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamT5EncoderModelSelect.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"903336832d3b22c41abe34c04011230edf4976e743b12c09564300957a664272"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamWanTransformerLowNoiseSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectWanTransformerLowNoise\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"85e6cc8170e00655a329d71f84a286d4f6feee8dc2a36b49159582f5fb714486"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamWanTransformerLowNoiseSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060wanTransformerLowNoiseSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"70fdc146a73687eaf2338a1571297e0fb6e54b14c8c08d5cdfdd3af7dde2fad2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060ParamWanTransformerLowNoiseSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5b96a0f0b90fa54ed7db69c85880966674ce31e42e07fe3711c79bd92f520c9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamWanComponentSourceSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectWanComponentSource\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"68f5ccc4eceafcc563d4c71118ebe4c9771fb7b455b579bdb8e004e64890dc56"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamWanComponentSourceSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060wanComponentSourceSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"aeec56f755f687f62bd0fc7933803f9056489e6a30419b48720d50af39dc7cf7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamWanVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectWanVaeModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f82e4235f3b2558c85c11bb48773f1d40b84c544d512639558535df1307bd02"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamWanVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060wanVaeModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"028cde9331cf8927a692bbb5eb7c416d93cb2aa8d0413aee76a89cdfcf00f41f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamWanT5EncoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectWanT5EncoderModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c031f6ce9153baed0f030b41521829eeb7c68ad5c9959fb98f2228c36bf09a0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamWanT5EncoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060wanT5EncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"93828f64066bb6816308092ef9f96d20ff1037603180a199567763103f892cea"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamZImageVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectZImageVaeModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5e2c739a3310faf075939394d0e7f81627c43b001f6f20a8e2021f9c5bd7b09"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamZImageVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zImageQwen3SourceModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a759184527c3dcd736887ab65522f6caaddfb595456d395d2b0287b8e3335ef"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamZImageVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zImageVaeModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"53ee650c8b5970ac2278900b4f29498ddab9797c6830c17ac4caecf9250c7626"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060ParamZImageVaeModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"18ea657555212d38387fe127a6958f842d49dba5234e876ed79202fb79f4c134"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamZImageQwen3EncoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectZImageQwen3EncoderModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4ac42cfa712f0d5ff17aefd6ff97c91abb556cf684700a939b6e066b6fb5eff"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamZImageQwen3EncoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zImageQwen3EncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"539dd7ccc255b40e292fe92e24342f264b44f891e99e4124236f62f8abced62a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamZImageQwen3SourceModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectZImageQwen3SourceModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"08bbcba380074863432cbf1ebddb0e7e066f29bd8fd22670a2a317356c3d0e85"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060ParamZImageQwen3SourceModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060ModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c34ff194e7d8adce40418981fb63d5c85ef2cc1da1397d55c25f847fbe2b5b4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamPidDecoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectPidDecoderModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fa36e6ceffdb92ca88dd29c91d6efcf1279ad03a0113430f7a1cc42ca515b77"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamPidDecoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"998fe0ee3e35c2bccc5b9de207fb3e917c1367825262ea6b4addc78241415eb3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamPidDecoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060pidDecoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7838f9fe687cd0ee3df9df54e5f2315fe5e86f374d8ba133610a974e8c86a5d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060ParamPidDecoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"91d9f9060a0f586a6c8ebd54637bdfe28354d205cbb257147f74947e5fab3e9e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamGemma2EncoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectGemma2EncoderModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a19250444a373b3b027f55641090c89f64500570db1c949807b1d4ce11f99e1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamGemma2EncoderModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060gemma2EncoderModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"807f1d10089bf59d30fca410f922c88e2b8ed8a2a4c0e25167e0188b4fc0ead5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamPidSteps\u0060 (slice \u0027parameters\u0027) depends on \u0060selectPidSteps\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"346c7593a50070e5ca87c360d5e90536aff024fce99fdc0caafc17a594e3c10c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamPidSteps\u0060 (slice \u0027parameters\u0027) depends on \u0060pidStepsChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bbfd55f1cf0ea00c792ac62f20e4f4a536b4b7adfac362918b93be972d40196"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060PidSettings\u0060 (slice \u0027parameters\u0027) depends on \u0060selectPidMode\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"35547456e5b78d08d274cc63f70d210b8cdf10dec2683cc0ac1491deebc246de"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060PidSettings\u0060 (slice \u0027parameters\u0027) depends on \u0060pidModeChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"7480b398eca8031f23c62bcb9b0cfaaa07a507c545b4e77728a83412d256aa60"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060PidSettings\u0060 (slice \u0027parameters\u0027) depends on \u0060PidMode\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5eacd742452f5d6bcb5fee5b1b951b5356b1ae2fa1728c6f1a5f44722965e60"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxAspectRatioSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectAspectRatioID\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b64613e494960d2773f6d59ad5089af560e3b8f2dc80e0679312de9e2f3c924"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxAspectRatioSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060useCanvasIsStaging\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6b14089793f2899b88d6b5729f556a22e1ba19cf7b27694d5144414213aa51a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxAspectRatioSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectAllowedAspectRatioIDs\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"100dfcc2da88e551c142a382431f6c657a8a2fd4a6e3ba509b14279e583ccd03"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxAspectRatioSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectAspectRatioSizes\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2f152ddb7ef058ec7eb92d82fc3689f5283fe334b0d509629f74e49a1664d90"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxAspectRatioSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHasFixedDimensionSizes\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fb133804b239591ded33cbd6638f981e463adb25a65a67a2d20f72e1050e785"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxAspectRatioSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zAspectRatioID\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"e058bb01f033dc6137fbc9920362efc910289e520a13d4b3359f3335802e779f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxAspectRatioSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060isAspectRatioID\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"88517cd434275ecd98a4b654641571b9e0fe105d42c38ff43484ab1fedc63559"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxAspectRatioSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060bboxAspectRatioIdChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"a25783d36497195a17784e9aedd7daf017dc05686a10a753684e542e7d74ff71"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxAspectRatioSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060aspectRatioIdChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"152edcd1a39106fdb297446811b833c5b9fc85f8dc5aac6ba6202b7ce91af98c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxHeight\u0060 (slice \u0027parameters\u0027) depends on \u0060selectOptimalDimension\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxHeight.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fce07d9dc2c81eb096ec8967ee6473bf1dfd30012aabec357528236880e7537"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxHeight\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHeight\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxHeight.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"1723750f15ccc2f21b3f6687af0a628729298f3b69e28e03e764f94faecec3f5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxHeight\u0060 (slice \u0027parameters\u0027) depends on \u0060selectGridSize\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxHeight.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a0c9680812d5ed4a9504a12e85251103e2e163e7b1c611106354ab389af0054"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxHeight\u0060 (slice \u0027parameters\u0027) depends on \u0060bboxHeightChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxHeight.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e8801d402c02cc1e8a8dcd9d8fe049fac465c36b607b172f7b92ec90419b360"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060selectAspectRatioIsLocked\u0060 (slice \u0027parameters\u0027) depends on \u0060selectCanvasSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxLockAspectRatioButton.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"73e5274c6fb01c77549d471c04342a24d9fb4333dedc073cf6841ae05004780f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxLockAspectRatioButton\u0060 (slice \u0027parameters\u0027) depends on \u0060bboxAspectRatioLockToggled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxLockAspectRatioButton.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9ce8e0cfb2de254abf454815d22fc3cb61093e73968d7b2e6dfca65456f837f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxPreview\u0060 (slice \u0027parameters\u0027) depends on \u0060selectWidth\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxPreview.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"80d055358741cc02febda3e3095a91852cdce0c74b15f9d02c1447a30438347e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxPreview\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHeight\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxPreview.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa1bef8814c7cce89beb0b50ba0e3cd2046696e55d91a9a9a4eb48f535dab757"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxPreview\u0060 (slice \u0027parameters\u0027) depends on \u0060selectAspectRatioValue\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxPreview.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"553be178e0589dfef47d83cdab1a715d88e47b40238f8540f5f86ae2395eaefb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060selectScaleMethod\u0060 (slice \u0027parameters\u0027) depends on \u0060selectCanvasSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaleMethod.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"10034a670d45eb0a49ad4cd3cca4bbc1167a42b529c3695472a33776375fa3a1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxScaleMethod\u0060 (slice \u0027parameters\u0027) depends on \u0060isBoundingBoxScaleMethod\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaleMethod.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"92148bec534092dc1a00b422a78aaa5128085cbaa11344eb73215155b53b1606"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxScaleMethod\u0060 (slice \u0027parameters\u0027) depends on \u0060bboxScaleMethodChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaleMethod.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dea9c58bbcf6817c8c5cba1807462431961ed708bf3418f438c6a6eb9d24a80"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060selectIsManual\u0060 (slice \u0027parameters\u0027) depends on \u0060selectCanvasSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledHeight.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"0627ecff2fb2ce460de197753d396c6cd15e9ac640b0109786b71ee90c86f4dd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxScaledHeight\u0060 (slice \u0027parameters\u0027) depends on \u0060selectOptimalDimension\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledHeight.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9e885a4b9f6ca9aac613b5d7d089adb24b6243a68d075ccd8411dc50b61a782"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxScaledHeight\u0060 (slice \u0027parameters\u0027) depends on \u0060selectGridSize\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledHeight.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b4445de0ef5feb3b6860e39325b00de58e61897ebe2e5cc89a14fbbc35c4911"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxScaledHeight\u0060 (slice \u0027parameters\u0027) depends on \u0060bboxScaledHeightChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledHeight.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"9003cbff078ae0e6a72eb59aa461060a09435c42bbb7cd4c45c0830d7cc23e07"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060selectIsManual\u0060 (slice \u0027parameters\u0027) depends on \u0060selectCanvasSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledWidth.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b6a98ab0ecc893e91a1c9451acc8590e9bbc60969d00dfcd60803c0bde61059"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxScaledWidth\u0060 (slice \u0027parameters\u0027) depends on \u0060selectOptimalDimension\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledWidth.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fb3862cd5a1a2476288a6251307a7835700940508bceb16e3b986478438e829"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxScaledWidth\u0060 (slice \u0027parameters\u0027) depends on \u0060selectGridSize\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledWidth.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"8396b0a81361e53d4744ceb1100ea52933b925ae13b26bc0d6a69fc1ee57a52c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxScaledWidth\u0060 (slice \u0027parameters\u0027) depends on \u0060bboxScaledWidthChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledWidth.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"9750905010ece7bb67dcc3211f98d2e52fc98dd92ae240fda24c6b8ac70ed787"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060selectWidth\u0060 (slice \u0027parameters\u0027) depends on \u0060selectCanvasSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSetOptimalSizeButton.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"07a95a9e98ba5d541e6da36b6306bc05fe6dc7129267471609c6a476b3684d26"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxSetOptimalSizeButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectOptimalDimension\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSetOptimalSizeButton.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"00250cf22fe54c8be2d0d63f8389182c2ccd63c4ec4c084c38235d8636c5d524"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxSetOptimalSizeButton\u0060 (slice \u0027parameters\u0027) depends on \u0060bboxSizeOptimized\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSetOptimalSizeButton.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"f81839f349e419006fd1b4213d93d2b8da311e398c01ec778236f6da34b01dbe"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxSwapDimensionsButton\u0060 (slice \u0027parameters\u0027) depends on \u0060useCanvasIsStaging\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSwapDimensionsButton.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"52f6d51b6d45903fcde827a26962f54875c350f633f9f64e55f6af930b2a3464"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxSwapDimensionsButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHasFixedDimensionSizes\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSwapDimensionsButton.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"e243eae7c8e1333130ab967a3f61e908dc2d85e184be65ab42a30391ce03a07a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxSwapDimensionsButton\u0060 (slice \u0027parameters\u0027) depends on \u0060bboxDimensionsSwapped\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSwapDimensionsButton.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"98ba2f95cad1c4a8ac8f90a7cba605354969f8ffa9ba380e9f31605b2b7f8cf6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxWidth\u0060 (slice \u0027parameters\u0027) depends on \u0060selectWidth\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxWidth.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"93805cd790ed7608318752a5697ae084ade3cc5dea2fc317330502b840c221f2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxWidth\u0060 (slice \u0027parameters\u0027) depends on \u0060selectOptimalDimension\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxWidth.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"db10681e0c2fee7d1801de94445feea5a9de3293d1fb9a96cb17c954883c0f83"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxWidth\u0060 (slice \u0027parameters\u0027) depends on \u0060selectGridSize\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxWidth.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ca29d9d0e133c47fdb074b3ee63a06aca52e1b5859b7bc59d164e0ea0b298dd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060BboxWidth\u0060 (slice \u0027parameters\u0027) depends on \u0060bboxWidthChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxWidth.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"f58dd952320a1f38289a220d31d51b016c94305673922de68c967b04b1bfadf2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060useIsBboxSizeLocked\u0060 (slice \u0027parameters\u0027) depends on \u0060useCanvasIsStaging\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/use-is-bbox-size-locked.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"2848c15450d70c48e5cfb49f601cd7a15a8eea8c9a414c6ced630cf3b3e7d141"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060useIsBboxSizeLocked\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHasFixedDimensionSizes\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/use-is-bbox-size-locked.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9465f4535fa94e4300d414ba577feb72c3865e5739691e441e21ad393ff1a24"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamCanvasCoherenceEdgeSize\u0060 (slice \u0027parameters\u0027) depends on \u0060selectCanvasCoherenceEdgeSize\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceEdgeSize.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"41635092f89e24fb5a364dab177ab47ce508cc047dce55f30dea4cfd921328ce"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamCanvasCoherenceEdgeSize\u0060 (slice \u0027parameters\u0027) depends on \u0060setCanvasCoherenceEdgeSize\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceEdgeSize.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"37d8479f5f158334a19adaf95328701e6e04e49b4f9f23581be376613ddbd2fe"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamCanvasCoherenceMinDenoise\u0060 (slice \u0027parameters\u0027) depends on \u0060selectCanvasCoherenceMinDenoise\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMinDenoise.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e8f25d799821d7037b29ca3d0139e9f64620940a603962ef05c5a9d487f5f8a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamCanvasCoherenceMinDenoise\u0060 (slice \u0027parameters\u0027) depends on \u0060setCanvasCoherenceMinDenoise\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMinDenoise.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"366932851fb8a9b6a1d3db5bf884f336ff81df31425ab5ac743fe91aaf69e2cc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamCanvasCoherenceMode\u0060 (slice \u0027parameters\u0027) depends on \u0060selectCanvasCoherenceMode\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMode.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"381547bf08e232d0a44e7a91cc816e7bc2f4d055e0e9e3364978f4b3d2eca5e9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamCanvasCoherenceMode\u0060 (slice \u0027parameters\u0027) depends on \u0060setCanvasCoherenceMode\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMode.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"eaf89a7d8512677dfc2c56353be09f5d3ebb232b2594985f775498301ce3b1bd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamMaskBlur\u0060 (slice \u0027parameters\u0027) depends on \u0060selectMaskBlur\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/MaskAdjustment/ParamMaskBlur.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"db78348c2bd70681070617612e6636b5f3570a99b9a646e6bf5a104a5a0f9522"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamMaskBlur\u0060 (slice \u0027parameters\u0027) depends on \u0060setMaskBlur\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/MaskAdjustment/ParamMaskBlur.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cd440df15bb2c8e816d81bbb20617954c793832319447b99102b8efef06cf90"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamInfillColorOptions\u0060 (slice \u0027parameters\u0027) depends on \u0060selectInfillColorValue\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillColorOptions.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a0a63c1ecef77b04442170fcd6045d7afcc55c972480396300cd5402364d84e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamInfillColorOptions\u0060 (slice \u0027parameters\u0027) depends on \u0060selectInfillMethod\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillColorOptions.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d9a8b1acc727b94c635a516f5cb2c0a7c8a572084db71c32602cd0d5bfb145b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamInfillColorOptions\u0060 (slice \u0027parameters\u0027) depends on \u0060setInfillColorValue\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillColorOptions.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3d28eb83c4e11db93a78e5a95cfab9cfd62b534048982672f5975f458b7c9b7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamInfillMethod\u0060 (slice \u0027parameters\u0027) depends on \u0060selectInfillMethod\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillMethod.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"f241a1679af98a9e87e36280b2e8b9efcd5ca5589701a84e60ce908c3f169370"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamInfillMethod\u0060 (slice \u0027parameters\u0027) depends on \u0060zInfillMethod\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillMethod.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd9841c71ffcf3347fa5fac4e97c5df3f78fc6ee71e812883c912218b0a81304"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamInfillMethod\u0060 (slice \u0027parameters\u0027) depends on \u0060setInfillMethod\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillMethod.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe70eb0a0dad80d0a1cee787eec68a8f598c0b84caaa55e36bdfb2e8bebc4ed3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamInfillOptions\u0060 (slice \u0027parameters\u0027) depends on \u0060selectInfillMethod\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillOptions.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"a003ade8f2b34d1fdc32487985396d39b2346595e3cd7507c15150853c4cef0f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamInfillPatchmatchDownscaleSize\u0060 (slice \u0027parameters\u0027) depends on \u0060selectInfillMethod\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillPatchmatchDownscaleSize.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1b5b2f03087639273e6151b6f9917453e7030c6e3dbdd6c5d7ff69d2974a27b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamInfillPatchmatchDownscaleSize\u0060 (slice \u0027parameters\u0027) depends on \u0060selectInfillPatchmatchDownscaleSize\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillPatchmatchDownscaleSize.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4cb6eb2acbe949ac2df896cfbdde0dd73b6a0f5898bcf97a3da66b9f46c2c23"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamInfillPatchmatchDownscaleSize\u0060 (slice \u0027parameters\u0027) depends on \u0060setInfillPatchmatchDownscaleSize\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillPatchmatchDownscaleSize.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"0599225c7495f19db04e7e4d4839d236264e0cc282fdc405e706e4cdfb5fba9e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamInfillTileSize\u0060 (slice \u0027parameters\u0027) depends on \u0060selectInfillTileSize\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillTilesize.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"64319933309e98db835178134e8a1e64278fc18f4ddfc21dcba88089618c98c3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamInfillTileSize\u0060 (slice \u0027parameters\u0027) depends on \u0060selectInfillMethod\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillTilesize.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"e293d5266e53857dfb1ee321d839d8a23c79c21582d614436c7ab9712a9a3ad2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamInfillTileSize\u0060 (slice \u0027parameters\u0027) depends on \u0060setInfillTileSize\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillTilesize.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3f6e3e04513377e6bf4a117ed288ba6713286d692f572da54d00805a5e08645"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060NegativePromptToggleButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHasNegativePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/NegativePromptToggleButton.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"c171641995837c6284c118bd588c22215424107fa573a7eae5660dd94c990e00"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060NegativePromptToggleButton\u0060 (slice \u0027parameters\u0027) depends on \u0060negativePromptChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/NegativePromptToggleButton.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"17b1910adf587eb5f8619e5fb5497b7a67b19eeada14a2ce6afe50a45d39b36b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamAnimaScheduler\u0060 (slice \u0027parameters\u0027) depends on \u0060selectAnimaScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamAnimaScheduler.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"309179aee1a422d6783d66e6ac4f07cf0c95c7a82c8c4ca104783028738118dc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamAnimaScheduler\u0060 (slice \u0027parameters\u0027) depends on \u0060setAnimaScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamAnimaScheduler.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b4dbf542cd1fa65bed0583078c058faece2bea22c88a9ac7342609558a391d3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamCFGScale\u0060 (slice \u0027parameters\u0027) depends on \u0060selectCFGScale\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamCFGScale.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"62988a856156e562ade02476f467bea1d9695ab4a77aec433cc4be422bada4da"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamCFGScale\u0060 (slice \u0027parameters\u0027) depends on \u0060setCfgScale\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamCFGScale.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"84d478626ae77cfb9774937687c5b3466878031a3220029e8fb2d7f5da2f3592"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamErnieImagePromptEnhancer\u0060 (slice \u0027parameters\u0027) depends on \u0060selectErnieImageUsePromptEnhancer\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImagePromptEnhancer.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2f3b5d1dadc180bbbaa5535f83b07c21ea2389946daa6a94addfcc5ba40711c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamErnieImagePromptEnhancer\u0060 (slice \u0027parameters\u0027) depends on \u0060setErnieImageUsePromptEnhancer\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImagePromptEnhancer.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f45efba4441448286f286ae4778d0c3eaedf0778ba39cec0709bef80c95bf96"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamErnieImageScheduler\u0060 (slice \u0027parameters\u0027) depends on \u0060selectErnieImageScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImageScheduler.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"167fc648d46ac714d3930c9a4fc90cb00f85305256ac6c117be0a9edd79a60f2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamErnieImageScheduler\u0060 (slice \u0027parameters\u0027) depends on \u0060setErnieImageScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImageScheduler.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"5301f1b993abe1585fafd227330f8706dcb3637d59eebddd0c4690b2705c7f63"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFluxDypeExponent\u0060 (slice \u0027parameters\u0027) depends on \u0060selectFluxDypeExponent\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeExponent.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4ed4604bc7624dec333333de3c693057a89720f20762fdcf3e0ac1f74f709e9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFluxDypeExponent\u0060 (slice \u0027parameters\u0027) depends on \u0060setFluxDypeExponent\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeExponent.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"58a59b854c8c1264549b20fee204bdad2b5234f477ba317f9644c683a54c5e0e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFluxDypePreset\u0060 (slice \u0027parameters\u0027) depends on \u0060selectFluxDypePreset\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypePreset.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d3333e9f4ec681ac66386034c14c865798a8a5dfba92b64bdc3cbe985441f1b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFluxDypePreset\u0060 (slice \u0027parameters\u0027) depends on \u0060setFluxDypePreset\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypePreset.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"adbb9669726487cc0a6f539d518d2ebbad8dfc0efdc5125f3ac68b53cf7d3a74"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFluxDypeScale\u0060 (slice \u0027parameters\u0027) depends on \u0060selectFluxDypeScale\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeScale.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1cbf3471ea4e5c756babed1009df4a3f045c366e31be0ad3a5daddb80441f75"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFluxDypeScale\u0060 (slice \u0027parameters\u0027) depends on \u0060setFluxDypeScale\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeScale.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"95d14eecfe1b2436600bad5086dc02b2b2560bbe6b1e35ff0a6aee449711e781"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFluxScheduler\u0060 (slice \u0027parameters\u0027) depends on \u0060selectFluxScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxScheduler.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"6feb646c7dc206e7a5a5f0f7ab2a5e3606b5e6feb8356dbfe6003a602af358b2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFluxScheduler\u0060 (slice \u0027parameters\u0027) depends on \u0060setFluxScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxScheduler.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"b22034de0aa0a848293be446bda3693f9731543da938df005f2707b60616c439"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamGuidance\u0060 (slice \u0027parameters\u0027) depends on \u0060selectGuidance\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamGuidance.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"e442bdd4d23af2bcd9a47181a11f1e47ef21e14dae4326e7290f835f336869a2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamGuidance\u0060 (slice \u0027parameters\u0027) depends on \u0060setGuidance\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamGuidance.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"3937f556fd4e25c307fac5d11a1aa890f02f820ce89a250a11bfa3fb16ddf11e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamIdeogram4ColorPalette\u0060 (slice \u0027parameters\u0027) depends on \u0060selectIdeogram4ColorPalette\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4ColorPalette.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e3187681a8e039986d625e02b63a3b3ae2d1d72e16509725f4c9b5e59aecc80"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamIdeogram4ColorPalette\u0060 (slice \u0027parameters\u0027) depends on \u0060setIdeogram4ColorPalette\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4ColorPalette.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"26d5f4e4f607134d99611e694eb15bbd9567e38abb8947d4f2213ca5679ff925"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamIdeogram4GuidanceScale\u0060 (slice \u0027parameters\u0027) depends on \u0060selectIdeogram4GuidanceScale\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4GuidanceScale.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"b906a7c4b1b35c6d1731c09af0dc21264a9a8e156ac063451c8d2ee83e228ef9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamIdeogram4GuidanceScale\u0060 (slice \u0027parameters\u0027) depends on \u0060setIdeogram4GuidanceScale\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4GuidanceScale.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"b918733b9415da825b8de0b891a2fad90fc1561d602f61ed011c6898e982e4ef"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamIdeogram4Mu\u0060 (slice \u0027parameters\u0027) depends on \u0060selectIdeogram4Mu\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Mu.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"74b6c5c6a2601c07bbbc6e8948c6330fcdea4af3e01509ce5ac192083ea7e34c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamIdeogram4Mu\u0060 (slice \u0027parameters\u0027) depends on \u0060selectIdeogram4SamplerPreset\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Mu.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"b383604b2fd861dacb1d7801f630dcf00726e464fae0761af37e834d8bd8a8e7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamIdeogram4Mu\u0060 (slice \u0027parameters\u0027) depends on \u0060setIdeogram4Mu\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Mu.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cb116d1747bf1c6f8ac2fb40f0990b207fa1465aba1bd5fa831be6b784071f5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamIdeogram4SamplerPreset\u0060 (slice \u0027parameters\u0027) depends on \u0060selectIdeogram4SamplerPreset\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4SamplerPreset.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fbcd591cc2e80104a230cde385c66e9fbe4e7fba59bfd37fb2f1583c7974758"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamIdeogram4SamplerPreset\u0060 (slice \u0027parameters\u0027) depends on \u0060setIdeogram4SamplerPreset\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4SamplerPreset.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"5eccfeb750371d26b5225fd0be81d7c6b3419987e0ec72161ba38d7719ac4185"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamIdeogram4Steps\u0060 (slice \u0027parameters\u0027) depends on \u0060selectIdeogram4Steps\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Steps.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"265c24966511290f2a0c5c19636ce2816dfc3ecdc8ecb8ed5a7724c571b19099"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamIdeogram4Steps\u0060 (slice \u0027parameters\u0027) depends on \u0060selectIdeogram4SamplerPreset\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Steps.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4b1ecf73054ec0b5ba4c57b5d55ae4285177969eb17963a10f84e412b84d8e0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamIdeogram4Steps\u0060 (slice \u0027parameters\u0027) depends on \u0060setIdeogram4Steps\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Steps.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e55132f4cd3b6d397ae0152435ecc6ef01a9ac6ca89bcc5aa4f5acc40c8bc4d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamMiniMaxH3Duration\u0060 (slice \u0027parameters\u0027) depends on \u0060selectMiniMaxH3DurationSeconds\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamMiniMaxH3Duration.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd8e1a79d5504cd3321a9908078b9425a057c1b63f2d380b2d63a5c27814be41"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamMiniMaxH3Duration\u0060 (slice \u0027parameters\u0027) depends on \u0060selectMiniMaxH3OutputMode\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamMiniMaxH3Duration.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"7167c770cea8e4c524c3ee50ab49df8c53d2596f482b00c6b057bfc75e4ebed1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamMiniMaxH3Duration\u0060 (slice \u0027parameters\u0027) depends on \u0060minimaxH3DurationSecondsChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamMiniMaxH3Duration.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"05a4bbcd96665c3474b95c0310708b13633117ee91b887d65728f44933d33cbc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamMiniMaxH3OutputMode\u0060 (slice \u0027parameters\u0027) depends on \u0060selectMiniMaxH3OutputMode\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamMiniMaxH3OutputMode.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"5de7d30b3b61c374feed077938bd61daf1b78d01c7daf3285a7b7395999dd363"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamMiniMaxH3OutputMode\u0060 (slice \u0027parameters\u0027) depends on \u0060minimaxH3OutputModeChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamMiniMaxH3OutputMode.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"44d6d6ed8a5cdee6cb86347f8e5ae93d05a49011c1028f29259c7acda93465e0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamNegativePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060selectNegativePromptWithFallback\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4042c6139edf65c24926d8d12b217ea503373dc1824e6bbd8ec7541f881ee54"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 stylePresets: \u0060ParamNegativePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060selectStylePresetViewMode\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"879037f72b57a08a02456d21410d8fcce0450b818eece23d0b3de014e5e371e3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 stylePresets: \u0060ParamNegativePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060selectStylePresetActivePresetId\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb1ce670716fd326e473c1a040a3a22003a9ff16be62407bf95eaf14004e274f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamNegativePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060negativePromptChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"da55400bf752952584de76cd5cda7e5cb1523b6380fde218474a773fee51a2ba"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 prompt: \u0060ParamNegativePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060usePrompt\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"852ec588abb04ef0a74929abef51b6f9e2dfaea922601cf305f245ed533692ed"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 prompt: \u0060ParamNegativePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060usePromptAttentionHotkeys\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0836cb3dcdfa5585d56b268f417cff208f44e3e69cf58456a51a9f17e6e8dba"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 prompt: \u0060ParamNegativePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060PromptPopover\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"c71e27d37517cc0f631d822054b272585e95763c43d903bb548b398d1e41ad71"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 prompt: \u0060ParamNegativePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060AddPromptTriggerButton\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c649cd5fd627ada7e2d900f2fa129eb35f884d3f9e8cdedb052454f82b5bb44"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060usePromptHistory\u0060 (slice \u0027parameters\u0027) depends on \u0060selectPositivePromptHistory\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"57487f99e29e666748c73dd1de513df3b415d7641506705561001fe816aac431"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060usePromptHistory\u0060 (slice \u0027parameters\u0027) depends on \u0060selectPositivePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f2384144ba103789c1c5d72066d84b71e3b3d660bedf3d504892ae4decbd6f4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060usePromptHistory\u0060 (slice \u0027parameters\u0027) depends on \u0060selectNegativePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"a59fc981e360f024069b9d05bc69652e6fdd86a8b365a56fe9197bc440d56cb9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060usePromptHistory\u0060 (slice \u0027parameters\u0027) depends on \u0060positivePromptChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"5371a239c878f30fbf1cd368ec4e46d43ffc39eb88521817d9c8fb224e549fb4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060usePromptHistory\u0060 (slice \u0027parameters\u0027) depends on \u0060selectModelSupportsNegativePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"42197c2099aea8b35fa5110a0523fbc2f99add05907c4cc49e1c44df7eb6d7cb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060usePromptHistory\u0060 (slice \u0027parameters\u0027) depends on \u0060negativePromptChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3f4b291d09fc09324590b11a16d7d43c6d1b23bacb28adc788f32763f513877"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 stylePresets: \u0060ParamPositivePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060selectStylePresetViewMode\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"bac303f4fd34a69b81c25adc8c8ffc64b2c987a5726fd5fb78962fd287aec5e2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 stylePresets: \u0060ParamPositivePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060selectStylePresetActivePresetId\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"f626873c7ffc8acca6e77911fe672e4a29f89e8d274c2763fdd2cb7a9ac36ed7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 prompt: \u0060ParamPositivePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060clearPromptUndo\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"16d6f283aeeb7300a4b842a7b9807bd04bb2a6ad3f0527411c75cc9767dcc6c6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 prompt: \u0060ParamPositivePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060usePrompt\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a72f7423fd4647ac2869ef06210caaaf168989cdf0a39e24bfd98a29946ed31"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 prompt: \u0060ParamPositivePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060consumePromptUndo\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f01d6b33f9dde650cfb342bf1863caf89c263e6841c5a94a4aa366bad78e9a1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 system: \u0060ParamPositivePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"53cdb73cbaf5987596bc0754d0790e60e72a66a33b6e0ff37ef80e8f9de972f5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 prompt: \u0060ParamPositivePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060usePromptAttentionHotkeys\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":262}}}],"partialFingerprints":{"codehealthFindingId/v1":"aed5ca17aaf9919d956de39ef13ff95d5c5450944ad865984bd8f2e7c407357d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 dnd: \u0060ParamPositivePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060DndTargetState\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"c946a89cd0b355423006b060cadec8520d504ad4bf027dcc524dafaafccb1a31"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 dnd: \u0060ParamPositivePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060singleImageDndSource\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1ca9988ec30361e04ff89d424771b1ee7ea5217add0233877b49d22b6972eda"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 prompt: \u0060ParamPositivePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060PromptPopover\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":320}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bab621ce5d865f678393656d463b920c656947949f03e32e15c26bea8d284f3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 prompt: \u0060ParamPositivePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060AddPromptTriggerButton\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0869abb948bf1ef4efa107146f5c330168e3a725089a17cce40c6eda9431983"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 dynamicPrompts: \u0060ParamPositivePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060ShowDynamicPromptsPreviewButton\u0060 from slice \u0027dynamicPrompts\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"debf03356e0ef5996e19ac376f7e5898c1d0ac4c8cd1290777173cf6ff1ca801"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 prompt: \u0060ParamPositivePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060ExpandPromptButton\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"b08b2d4e2309911790d2d4e41cdb438fad592d22293653ad763133051e646a5a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 prompt: \u0060ParamPositivePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060ImageToPromptButton\u0060 from slice \u0027prompt\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ff3c9d48319302d5b9c5517c1de8adb539005969a218adc95ef099250ba7efb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 dnd: \u0060ParamPositivePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060DndDropOverlay\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fb92df995486ef988ac3c4ec94cf08edf48bb99364da4d51bdd0a145f94ca47"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamQwenImageShift\u0060 (slice \u0027parameters\u0027) depends on \u0060selectQwenImageShift\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamQwenImageShift.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"624cad75ef3affcb0a7b36ed3e9a795039291bdba12f528fdd6789a38e0eecec"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamQwenImageShift\u0060 (slice \u0027parameters\u0027) depends on \u0060qwenImageShiftChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamQwenImageShift.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4d240799de7c3c8259948337961a45d98283d0301d626b5cb0a60dbaad42e34"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamScheduler\u0060 (slice \u0027parameters\u0027) depends on \u0060selectScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamScheduler.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a88e6696568ea911ea05cf84c0ff755353b42757dbd9ae9c4098bf9b8c35082"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamScheduler\u0060 (slice \u0027parameters\u0027) depends on \u0060setScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamScheduler.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"05f5a87f93cb661ac2b503d28e352a2b103a8761aa0b01cb59b6c6d79b5e5d5b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamSteps\u0060 (slice \u0027parameters\u0027) depends on \u0060selectSteps\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamSteps.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab7472806e1ed1a1c64148a701d5b3fede7a134b521134bcee0510eb7bc5b51c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamSteps\u0060 (slice \u0027parameters\u0027) depends on \u0060setSteps\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamSteps.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"9286969c054055cb02291092932c36a4fd6f1d19d44b5289b9f79ad4a837ee4a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamWanGuidanceScaleLowNoise\u0060 (slice \u0027parameters\u0027) depends on \u0060selectWanGuidanceScaleLowNoise\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamWanGuidanceScaleLowNoise.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"09a55ac229d6236f61780d8693423833357f6405b0c121f1fbba0ef81da55634"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamWanGuidanceScaleLowNoise\u0060 (slice \u0027parameters\u0027) depends on \u0060selectCFGScale\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamWanGuidanceScaleLowNoise.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dd8ac432b38b470320ad7f6c3a00438032cc5ab4620924f404e1c8d809474a0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamWanGuidanceScaleLowNoise\u0060 (slice \u0027parameters\u0027) depends on \u0060wanGuidanceScaleLowNoiseChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamWanGuidanceScaleLowNoise.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"39f4decafe0e4993c60a1ba98669372e421cdf1d9b77b7bbc425b100eeb1125b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamZImageScheduler\u0060 (slice \u0027parameters\u0027) depends on \u0060selectZImageScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamZImageScheduler.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"badf36dfdb6fce4da1b2cba620da35ea70db81c85ea3d2b253d9fbbd9fe826c0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamZImageScheduler\u0060 (slice \u0027parameters\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamZImageScheduler.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"78ee31a51fd6783d0286ad307362f75605a7f7560abf7208bd5a6c79b7c602ad"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamZImageScheduler\u0060 (slice \u0027parameters\u0027) depends on \u0060setZImageScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamZImageScheduler.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc405333044f962350e170264a183cfafc2059d45ba932c3326317ede529890d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamZImageShift\u0060 (slice \u0027parameters\u0027) depends on \u0060selectZImageShift\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamZImageShift.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f252d80c06197e7b6f00a50cc1c25f20fc824632687a96d7c97aab7a2db70e8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamZImageShift\u0060 (slice \u0027parameters\u0027) depends on \u0060setZImageShift\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamZImageShift.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe9c85a0d24d7010ad768677a2f2a72db0061a4b429e1618bf8078013ee4e478"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060PromptHistoryContent\u0060 (slice \u0027parameters\u0027) depends on \u0060selectPositivePromptHistory\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/PositivePromptHistory.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"c27cbb5e8a0f1347eefd173e17081215ad50974b9eea1699a77db9730ceb8766"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060PromptHistoryContent\u0060 (slice \u0027parameters\u0027) depends on \u0060promptHistoryCleared\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/PositivePromptHistory.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"7550b21b9827449371e8ee5c73d691f370029b2b31269e65846a9163c196004b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060PromptItem\u0060 (slice \u0027parameters\u0027) depends on \u0060PromptHistoryItem\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/PositivePromptHistory.tsx"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"475f71913a7eb4df855f15c9cd3ecb6f1edb4a58de269c0053dea79c79a43f34"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060PromptItem\u0060 (slice \u0027parameters\u0027) depends on \u0060selectModelSupportsNegativePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/PositivePromptHistory.tsx"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa5ae067ae434152e2b0e5d1edae309d6b0c2031fc54d1a8b72273d3c6e161cb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060PromptItem\u0060 (slice \u0027parameters\u0027) depends on \u0060positivePromptChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/PositivePromptHistory.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"821a41ab4a5b4a979ecc65a5462c09e711146fb1c6f8b85996e58b65f10f79bb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060PromptItem\u0060 (slice \u0027parameters\u0027) depends on \u0060negativePromptChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/PositivePromptHistory.tsx"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b0481ff89a5fd63a5a189df5638195cb48726c2f208ae1a2bee3c1713aedf32"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060PromptItem\u0060 (slice \u0027parameters\u0027) depends on \u0060promptRemovedFromHistory\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/PositivePromptHistory.tsx"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"18106650652cbe504c2b82a99dcb443def788c35ed4f35d6e510e3dfe3adab85"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsAspectRatioSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectAspectRatioID\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"232fd0181a74cf62066c41ee43771dfe173f2b8865c1da52187b5f80158fb9ad"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsAspectRatioSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectAllowedAspectRatioIDs\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"57d1284e5a0ab92ffe4974d325863e1fd7a1187be8f042c459e50ab6dc0c6518"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsAspectRatioSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectAspectRatioSizes\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"6189127acb1c44e8b6c84168e2fbb75e74e01bdc94c4bebcc46b0c1e0116304c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsAspectRatioSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zAspectRatioID\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"edc4276786f05dbb5ce202c0e50f29994451c9c66f38b480869fff735b1e8dd1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsAspectRatioSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060isAspectRatioID\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"368ef022a6dc6cfef9b045addcc2f54b1d2fc950fe25186be5b15cc539a55c14"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsAspectRatioSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060aspectRatioIdChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"31d572ec08f5a983fcdaed948edc8a2e5d4e279f4fdc5c0ef6e7e905e5436d98"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsHeight\u0060 (slice \u0027parameters\u0027) depends on \u0060selectOptimalDimension\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsHeight.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d8d3909c82ca7cd7db19585ec889e52e18cdd3456bca4a6d320fb144e9f2bdb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsHeight\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHeight\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsHeight.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"2710b506d3a956ea0be2b78cd5222ed23e12d3ad1c2e6629d7f849ceee19edc6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsHeight\u0060 (slice \u0027parameters\u0027) depends on \u0060selectGridSize\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsHeight.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cb724774d1e1ed23874d3be1afd188228caf6f9305ffc2b52421c97ad8b15f5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsHeight\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHasFixedDimensionSizes\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsHeight.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"1db0ab91c6e12ef0bdeda7495031353a31b5832a7fa14507914da27d72eab1a7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsHeight\u0060 (slice \u0027parameters\u0027) depends on \u0060heightChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsHeight.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"3697282f9fea3643586d9215f20cdc0a0207315b17a4d045786c5f0b1df8adf1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsLockAspectRatioButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectAspectRatioIsLocked\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsLockAspectRatioButton.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6030ee2c1c1a3856e165b69e30b47f3bee5a114ce4b5f8f820a5d8c108ef639"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsLockAspectRatioButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHasFixedDimensionSizes\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsLockAspectRatioButton.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"f625534b70a98a3d56031eac8e4e98a9e891224f3c623144d740788e26d5a0bd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsLockAspectRatioButton\u0060 (slice \u0027parameters\u0027) depends on \u0060aspectRatioLockToggled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsLockAspectRatioButton.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c9a71e7d08c3664bfa2672fd56f25f96fa4c929fc4f2ca61d1e21330f05c641"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsPreview\u0060 (slice \u0027parameters\u0027) depends on \u0060selectWidth\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsPreview.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab88737c072d9df5e3b5e09440c9876a02630c7d89a6966b895721990125ec26"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsPreview\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHeight\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsPreview.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d80ce5e9abec3c2d1e1fe175b5fc8ecfb314d484f2ec9559fc46c014d8869a1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsPreview\u0060 (slice \u0027parameters\u0027) depends on \u0060selectAspectRatioValue\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsPreview.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"671a332cbca6e331931ef8e90dfb77d9139391ba46fd3a60179fa0069e9868c0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsSetOptimalSizeButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectWidth\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSetOptimalSizeButton.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"7526fb09d6484edfc9ef0bfb9e54cd4ea9e60d48e36a3ab86a2b713d4dd10763"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsSetOptimalSizeButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHeight\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSetOptimalSizeButton.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"973aa2ceeac4608b48637e25639b73ddc4078184f540a17b749f7def1ccedd32"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsSetOptimalSizeButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectOptimalDimension\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSetOptimalSizeButton.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffc911944d2fb24478397587f18ce4dc94437ada87cbde3aa7470a26b56440fa"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsSetOptimalSizeButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHasFixedDimensionSizes\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSetOptimalSizeButton.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ab42242549e41d714c23d1f355f88f4dad59069e2e14d90e74ca27439b5036f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsSetOptimalSizeButton\u0060 (slice \u0027parameters\u0027) depends on \u0060sizeOptimized\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSetOptimalSizeButton.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"945d98134d0edf92317928eb066d84b7a9f3de1690090487cc053a11945c7155"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsSwapButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHasFixedDimensionSizes\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSwapButton.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"17d3fb07cddd880e6b53355976261a4a6d3117c6105efa0d9ac7f845a8a588eb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsSwapButton\u0060 (slice \u0027parameters\u0027) depends on \u0060dimensionsSwapped\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSwapButton.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"37af5f17aba75f7cc0b5835e49a1c50307deb4cac319d26264301aa8999bb178"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsWidth\u0060 (slice \u0027parameters\u0027) depends on \u0060selectWidth\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsWidth.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"247d6c8cf44da0629052eea66d5309211b7a215b73695eadff4ceece6f2cae55"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsWidth\u0060 (slice \u0027parameters\u0027) depends on \u0060selectOptimalDimension\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsWidth.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"1166fab9604beb552102e9cd3326360fd9b4e7b3642de9a9a4d2460de7d340d5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsWidth\u0060 (slice \u0027parameters\u0027) depends on \u0060selectGridSize\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsWidth.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"59377b87770b02a47cbbeeef2db4939b69c24f661eafde79059e5d66f50c691c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsWidth\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHasFixedDimensionSizes\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsWidth.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"624b05197325feabdc500f97109fb215dfb2230edfdfa6b297e500a31a2a555b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060DimensionsWidth\u0060 (slice \u0027parameters\u0027) depends on \u0060widthChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsWidth.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad2cba171fde1b1ce318f011231e8a69a3acc0632ffeca2b4bcfe97d5a085c9e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ExternalModelImageSizeSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectResolutionPresets\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelImageSizeSelect.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"859ecc6faf0c357a867834bab996b9eef0d9b7310d77ffe7f91a81174ef740da"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ExternalModelImageSizeSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectAspectRatioID\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelImageSizeSelect.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"34aae954ce17648c3d1ffb2050d330c0716b2c31fbc0c33b19cece08f65fd9c7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ExternalModelImageSizeSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectImageSize\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelImageSizeSelect.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cdd21492a85d1bf3b9d9ee1d9a8bbe2c6ce0e31f65ced7cb55a118514b25657"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ExternalModelImageSizeSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060resolutionPresetSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelImageSizeSelect.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2de7fb8b832174d3abfe354d239d224a50ff01511e2a5c1f3e62be4899c1663"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ExternalModelResolutionSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectAspectRatioID\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelResolutionSelect.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"412221ae50a14b6d9b3c2a16726ff0da4483abf52a7246858a024daad4559fd8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ExternalModelResolutionSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectAspectRatioSizes\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelResolutionSelect.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fc2a80afeaa1a7a346fa4a1ad031f6a315941fd48e6b7ed200a340fa35d18bb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ExternalModelResolutionSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060isAspectRatioID\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelResolutionSelect.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fdf889399bedc2f350412cd09855e14b9e9f2e2ab085ad163c1f3b64b6a61f2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ExternalModelResolutionSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060aspectRatioIdChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelResolutionSelect.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"d399cd6e97916d2c40ace46a5004b86bb9e206de3201908569dc61b61655c7cb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060GeminiProviderOptions\u0060 (slice \u0027parameters\u0027) depends on \u0060selectGeminiTemperature\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/GeminiProviderOptions.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef6b0be1a56b434b6000614e34925974ae91a24ddcae87e92eb363574a38972d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060GeminiProviderOptions\u0060 (slice \u0027parameters\u0027) depends on \u0060selectGeminiThinkingLevel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/GeminiProviderOptions.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cd46b9e4fb9d970a8729857e406146212fb956d224198a8a75a017a2a853439"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060GeminiProviderOptions\u0060 (slice \u0027parameters\u0027) depends on \u0060geminiTemperatureChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/GeminiProviderOptions.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"333aa43868cb32825b703b334427b2bdc2a328c6893c7f0ec22f444a180a4d44"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060GeminiProviderOptions\u0060 (slice \u0027parameters\u0027) depends on \u0060geminiThinkingLevelChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/GeminiProviderOptions.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"f721f382fc541cfbfcf95694735a0948e43d30fa0758319d12c84546e097bcba"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060OpenAIProviderOptions\u0060 (slice \u0027parameters\u0027) depends on \u0060selectOpenaiQuality\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/OpenAIProviderOptions.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"813263cfe18dcd82fbc3836cf8d0ee6ded63857c4367cd9c9b9486f17b62ab45"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060OpenAIProviderOptions\u0060 (slice \u0027parameters\u0027) depends on \u0060selectOpenaiBackground\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/OpenAIProviderOptions.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"deedcde4e43e7b5d65e3dfd2df39590f7e0bb38cc49abe2b49817cb3c14ed9e9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060OpenAIProviderOptions\u0060 (slice \u0027parameters\u0027) depends on \u0060selectOpenaiInputFidelity\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/OpenAIProviderOptions.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"6924e6220fb1c0b0b9575812a84ceddac9bc527f9a714c4c2840478f5703b05b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060OpenAIProviderOptions\u0060 (slice \u0027parameters\u0027) depends on \u0060openaiQualityChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/OpenAIProviderOptions.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"d26e32c3f4ba307d33d4c6bea95b0d7fbb1315dbba4f9842bc9d99ceba717989"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060OpenAIProviderOptions\u0060 (slice \u0027parameters\u0027) depends on \u0060openaiBackgroundChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/OpenAIProviderOptions.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"85fd5aafc7ae39b58d74295641505fbc1e3a4eee49dc37175113638f7e48b8fb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060OpenAIProviderOptions\u0060 (slice \u0027parameters\u0027) depends on \u0060openaiInputFidelityChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/OpenAIProviderOptions.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"c77c3a5067c0fa6692afb279e9efedae396c7763fb38aab47e655203bb52056f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060SeedreamProviderOptions\u0060 (slice \u0027parameters\u0027) depends on \u0060selectSeedreamWatermark\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/SeedreamProviderOptions.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"08ba5a3a646333c2a9e6aa95b1131430b158e64177f3a439a2240748636a243a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060SeedreamProviderOptions\u0060 (slice \u0027parameters\u0027) depends on \u0060selectSeedreamOptimizePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/SeedreamProviderOptions.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"3612f4defa3a9c8717d8e1f0b8b20dc84afb64c303c4a4de0af5fa4f444ba083"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060SeedreamProviderOptions\u0060 (slice \u0027parameters\u0027) depends on \u0060seedreamWatermarkChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/SeedreamProviderOptions.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc381bf3ad67030c89139416a437f6d1cd7f7f2652d5cae9b089a75cc10e93bd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060SeedreamProviderOptions\u0060 (slice \u0027parameters\u0027) depends on \u0060seedreamOptimizePromptChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/SeedreamProviderOptions.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdf395847e06a8aa1f815e137f70fd3306202630e672623650651896269b3a70"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2EnhancersSettings\u0060 (slice \u0027parameters\u0027) depends on \u0060selectKrea2RebalanceEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2EnhancersSettings.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"06cbc1fc6483534496b6fb32f2a340e582c95b862bc3545704f5a04e376c1f69"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2EnhancersSettings\u0060 (slice \u0027parameters\u0027) depends on \u0060selectKrea2SeedVarianceEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2EnhancersSettings.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f9acc137efbdc6a0003d2b0a76ea753ef8336dfd532c0df7e250bb130f3ec59"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2RebalanceEnabled\u0060 (slice \u0027parameters\u0027) depends on \u0060selectKrea2RebalanceEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceEnabled.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"8feae84cafa04fc47c66d2a2efbf844833053acab926333470d3fc2e0f8bac75"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2RebalanceEnabled\u0060 (slice \u0027parameters\u0027) depends on \u0060setKrea2RebalanceEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceEnabled.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"58df197ce529b4d9f17d2803d340196f66ca4404462584dcf53596d8632d48db"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2RebalanceMultiplier\u0060 (slice \u0027parameters\u0027) depends on \u0060selectKrea2RebalanceMultiplier\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceMultiplier.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"22c849e0c81a59184d341df28d88552be96756de96ecba7ba2821c7a014df002"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2RebalanceMultiplier\u0060 (slice \u0027parameters\u0027) depends on \u0060setKrea2RebalanceMultiplier\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceMultiplier.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"acb502d365d4f3130ea6b9497fadf3d48dbd88d36f2efa0fb82f279560524c38"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2RebalanceWeights\u0060 (slice \u0027parameters\u0027) depends on \u0060selectKrea2RebalanceWeights\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceWeights.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"3498e0881208b3614619952c2c134111a922945139d0d26451145696596d527f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2RebalanceWeights\u0060 (slice \u0027parameters\u0027) depends on \u0060setKrea2RebalanceWeights\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceWeights.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6c1c12e05896e59970e4fe43e174e16baa37143704367066a942dca85f00bae"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2RebalanceWeights\u0060 (slice \u0027parameters\u0027) depends on \u0060isValidKrea2RebalanceWeights\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceWeights.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"e37caf83e7d58fdbdbf509cd01d4d5f25c997d6b901a5222167182ab5a7782af"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2SeedVarianceEnabled\u0060 (slice \u0027parameters\u0027) depends on \u0060selectKrea2SeedVarianceEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceEnabled.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"5674b7398e996c7c7e7cae33ca996cc0a77c27d6842634008d60d2e30941666b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2SeedVarianceEnabled\u0060 (slice \u0027parameters\u0027) depends on \u0060setKrea2SeedVarianceEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceEnabled.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b6dbf6be44ba25eb92dff33b7df9e452a264145e88fb69ba102e45deabc74b0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2SeedVarianceRandomizePercent\u0060 (slice \u0027parameters\u0027) depends on \u0060selectKrea2SeedVarianceRandomizePercent\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceRandomizePercent.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d70825d409d477e0c290dc1751890497391e4a297c173e4caebbf0b00faeea6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2SeedVarianceRandomizePercent\u0060 (slice \u0027parameters\u0027) depends on \u0060setKrea2SeedVarianceRandomizePercent\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceRandomizePercent.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc7790b14db4fe08d5bd2af67fb2abb8604599344a7d4cb9d7b1dfe678903c2c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2SeedVarianceStrength\u0060 (slice \u0027parameters\u0027) depends on \u0060selectKrea2SeedVarianceStrength\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceStrength.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d86c90b78e494be3481a796a0e04a17df78e1fa81b8df0aa46a99f4befb6833"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamKrea2SeedVarianceStrength\u0060 (slice \u0027parameters\u0027) depends on \u0060setKrea2SeedVarianceStrength\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceStrength.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e8e44d376b4136d937f21721cb2d4c57b9cbbb5b63ae48b821d3da7f9ab937d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 ui: \u0060NavigateToModelManagerButton\u0060 (slice \u0027parameters\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/NavigateToModelManagerButton.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5ba533458bfea97dfe58317852471af87a4122ca811b3c91a5162938b54755e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060UseDefaultSettingsButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"789a7d989a30831f9d4729823d8bd17cc8afbf248940dac895019193811ceee5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060UseDefaultSettingsButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"03eec19c1c7d95bacc3fb3727e5a8d056920d19bf2181265b1701653c4711502"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060UseDefaultSettingsButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectSteps\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"1851d0f10a6901ca377bbffaaa61552e5ef32888656943efe4d9d2d5017a4efb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060UseDefaultSettingsButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectVAE\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"a387928d6f2bcf580a0b3a081c6045064090f9ad736622c9efda50acf81faf51"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060UseDefaultSettingsButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectVAEPrecision\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"5934187c2c271940627df4b1545b268fcd5e8996d8c14c8616a3be1c3b92481f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060UseDefaultSettingsButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectWidth\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"504e7b7163a3200cc713aa875a26578c139ea8b2f5c8a45ed9b90a7d293d6191"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060UseDefaultSettingsButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHeight\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"da36a7877ce8606a44c53fd8e0fdf9616228f7770b82bd8a2ec7bd3f9035fc6e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060UseDefaultSettingsButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectGuidance\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdbce1ac2e42e2d416fdfc78411e60bf553ebb0fd812d0b624311ce2014d7cc2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060UseDefaultSettingsButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectCFGScale\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7d91610d6bbe0e2a2f3e79cad0adfb941629c9206d38e46b67e1386118f3110"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060UseDefaultSettingsButton\u0060 (slice \u0027parameters\u0027) depends on \u0060selectCFGRescaleMultiplier\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"769b4432e9deae891418f77d3ce1854889a34b6460bbd0d178a04572e9d11e77"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 ui: \u0060isExternalModelUnsupportedForTab\u0060 (slice \u0027parameters\u0027) depends on \u0060TabName\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/mainModelPickerUtils.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"39f7645adc4b429c0f784182ad831b12291ae50e3ba0e9f82ec8831728c7310a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060selectSelectedModelKeys\u0060 (slice \u0027parameters\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb8eacc9d746c1159d8f35bb58eb80b768fd92ac93a6f783f638dbce61e77cea"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060selectSelectedModelKeys\u0060 (slice \u0027parameters\u0027) depends on \u0060selectLoRAsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9724b4fa518bd139241f919a89089762d2a7fe180b36f94aaee7250bf1e2988"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 ui: \u0060ModelManagerLink\u0060 (slice \u0027parameters\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfd4a7ac3b76b19335a04a563438a5d55847c1645404da5ef3394992c6922a7c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 modelManagerV2: \u0060ModelManagerLink\u0060 (slice \u0027parameters\u0027) depends on \u0060setInstallModelsTabByName\u0060 from slice \u0027modelManagerV2\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"f04a777bf0d8d1a3c2bb9eaa68271e2d57fcb285a23e0224f7aa38722e7532d6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 auth: \u0060NoOptionsFallback\u0060 (slice \u0027parameters\u0027) depends on \u0060useIsAdmin\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"12c7299c48f222725af3dcd7a4dce94a44b018c21c31c02a89175bb5f55652ef"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 modelManagerV2: \u0060getGroupNameFromModelConfig\u0060 (slice \u0027parameters\u0027) depends on \u0060MODEL_BASE_TO_LONG_NAME\u0060 from slice \u0027modelManagerV2\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"64927ba7bff6bf67b6c377c6502071bdbc4a5017cb38bc1572722b8b5596c413"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 modelManagerV2: \u0060getGroupShortNameFromModelConfig\u0060 (slice \u0027parameters\u0027) depends on \u0060MODEL_BASE_TO_SHORT_NAME\u0060 from slice \u0027modelManagerV2\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef40f8eab30693a8489e5d2b09f26ab89508ab45aeebbb91efc7bba1412712b5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 modelManagerV2: \u0060getGroupColorSchemeFromModelConfig\u0060 (slice \u0027parameters\u0027) depends on \u0060MODEL_BASE_TO_COLOR\u0060 from slice \u0027modelManagerV2\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"4820a60c7448c0cf5caba543432106acd6ee32e6c5dc9743e64453a49680a6a8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 modelManagerV2: \u0060ModelPicker\u0060 (slice \u0027parameters\u0027) depends on \u0060ModelImage\u0060 from slice \u0027modelManagerV2\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":436}}}],"partialFingerprints":{"codehealthFindingId/v1":"b502a2de4cf5e72aa97889ae562db9146edb9113e2b9e6af9c7dc7fe8a4fa117"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060ModelPicker\u0060 (slice \u0027parameters\u0027) depends on \u0060BaseModelType\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"b79454cf8ae7d26d7e628be4d42634f4fa0e1fb498f3370cdf38d8dca93fbebd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 queue: \u0060PostProcessingPopover\u0060 (slice \u0027parameters\u0027) depends on \u0060useIsQueueMutationInProgress\u0060 from slice \u0027queue\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/PostProcessingPopover.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc7f787d4e3582f6d69ffb6cd8fd185bf1e7e0669c230e3dcb28631e3b209cca"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 ui: \u0060MissingModelWarning\u0060 (slice \u0027parameters\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/PostProcessingPopover.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9152963cb5bdbdfa70e271268b078ec15e1c3b63bb89ed4c22e17e03431edbf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 modelManagerV2: \u0060MissingModelWarning\u0060 (slice \u0027parameters\u0027) depends on \u0060setInstallModelsTabByName\u0060 from slice \u0027modelManagerV2\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/PostProcessingPopover.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ba07da407c7e6776e632000239e0a4bbc372b087c5fb580b9533130fea58222"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060Prompts\u0060 (slice \u0027parameters\u0027) depends on \u0060selectModelSupportsNegativePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Prompts/Prompts.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"7afa86766360ce34c015895dcf1c16b90cd206c83eeb93dbb8d775b68f614179"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060Prompts\u0060 (slice \u0027parameters\u0027) depends on \u0060selectModelSupportsRefImages\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Prompts/Prompts.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"f630807a74ed41f1e182ca0e28525ef918cd44205bbbd3abae428d52fc7cdd5f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060Prompts\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHasNegativePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Prompts/Prompts.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ebd8ad473e2e28fd84299950bf78fd9dafc21b843046275ae7935c65afcb5cb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060Prompts\u0060 (slice \u0027parameters\u0027) depends on \u0060RefImageList\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Prompts/Prompts.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"96ed08f22341c3a9189e3c41925f001579f1cdfb0f2e69eccdfe11755b701604"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060UpscalePrompts\u0060 (slice \u0027parameters\u0027) depends on \u0060selectModelSupportsNegativePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Prompts/UpscalePrompts.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ee77c3a9b14191c6821731ed8f2782b9587a5d201394efa5c7427fc227a5b0b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060UpscalePrompts\u0060 (slice \u0027parameters\u0027) depends on \u0060selectHasNegativePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Prompts/UpscalePrompts.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"c01df25b0487cdba7d673c63c385445681a88cf81bf5dd30dacbbc5de723847e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 stylePresets: \u0060ViewModePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060getViewModeChunks\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Prompts/ViewModePrompt.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"7baf0f94a6a3b1a16d78004cbd4d0d771ad7a626995dde22b599ff97e68585a4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 stylePresets: \u0060ViewModePrompt\u0060 (slice \u0027parameters\u0027) depends on \u0060viewModeChanged\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Prompts/ViewModePrompt.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fd4025e769e3304718855d6355a7ec65c4996f0407d63780d71eac714bac0ae"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamSeamlessXAxis\u0060 (slice \u0027parameters\u0027) depends on \u0060selectSeamlessXAxis\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seamless/ParamSeamlessXAxis.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8785e49408ddba394fd502f70f4c91f114246aba77876171b382c5b085ea5ce"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamSeamlessXAxis\u0060 (slice \u0027parameters\u0027) depends on \u0060setSeamlessXAxis\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seamless/ParamSeamlessXAxis.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"3af4866c60927c703edeb0b2fc4a538c656739b9de7a0d9e3ac58fadeb1431f6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamSeamlessYAxis\u0060 (slice \u0027parameters\u0027) depends on \u0060selectSeamlessYAxis\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seamless/ParamSeamlessYAxis.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"42735437574a40875b0fa09def29d2800b5ab9fde60c5ba1735dfbf20742d617"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamSeamlessYAxis\u0060 (slice \u0027parameters\u0027) depends on \u0060setSeamlessYAxis\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seamless/ParamSeamlessYAxis.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"8eb66c1d55783d6ccfb19485acbec3dcc0ce7c32800c1adfceba37f117f4919a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamSeedNumberInput\u0060 (slice \u0027parameters\u0027) depends on \u0060selectSeed\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedNumberInput.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"146c2ae0886c2182528c25284fd870376dde06c6103a79ee199150ebb8c2e945"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamSeedNumberInput\u0060 (slice \u0027parameters\u0027) depends on \u0060selectShouldRandomizeSeed\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedNumberInput.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"755db52188dbc02ddf8007bf20dfd3f54da189c85e0570899d88c3e47531ad4f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamSeedNumberInput\u0060 (slice \u0027parameters\u0027) depends on \u0060selectSeedControl\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedNumberInput.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"99c5d271ff99e72843a7cf52f016ef464c1d03f56b4b8313fc384d0260dd80d0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamSeedNumberInput\u0060 (slice \u0027parameters\u0027) depends on \u0060setSeed\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedNumberInput.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c1780b83c7e44b8ff05402316b56dd3da824225c8f990e8371cbe36ce9a8034"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamSeedRandomize\u0060 (slice \u0027parameters\u0027) depends on \u0060selectShouldRandomizeSeed\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedRandomize.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"e80a5a78af3e1efebf4e58e09f41987a25d3c08e353a445424354ffb0017f1ee"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamSeedRandomize\u0060 (slice \u0027parameters\u0027) depends on \u0060setShouldRandomizeSeed\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedRandomize.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"55da93b2665f1cb8f472c85c431138107052719b3004253dcb0813403d12c890"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamSeedShuffle\u0060 (slice \u0027parameters\u0027) depends on \u0060selectShouldRandomizeSeed\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedShuffle.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7a3774ac16681971fa982523b289e9b8e80979abdac30baefe300ba21bc25a8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamSeedShuffle\u0060 (slice \u0027parameters\u0027) depends on \u0060setSeed\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedShuffle.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"37af3791f34a2d9b10d35c0fbfc9d616cc24bf776a67dfdd956452970bb8c451"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamZImageSeedVarianceEnabled\u0060 (slice \u0027parameters\u0027) depends on \u0060selectZImageSeedVarianceEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceEnabled.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c07ce146ee93b7ad0294aeb7cdc8a40e5b2d665ed62212cbf0ac92cf509213c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamZImageSeedVarianceEnabled\u0060 (slice \u0027parameters\u0027) depends on \u0060setZImageSeedVarianceEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceEnabled.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5afe7504f78303cdb485fcff7c0da41b536d5c13b86c2810b5a8ef1e1b5a344"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamZImageSeedVarianceRandomizePercent\u0060 (slice \u0027parameters\u0027) depends on \u0060selectZImageSeedVarianceRandomizePercent\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceRandomizePercent.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"97d37083a0a9125c01b413fe1f2eccefca356718d27d0da394481dc01d7881d8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamZImageSeedVarianceRandomizePercent\u0060 (slice \u0027parameters\u0027) depends on \u0060setZImageSeedVarianceRandomizePercent\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceRandomizePercent.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"e371f582afa71a0f34e04e1e05b5499efbf97cce93ae056be3331fba3b836e63"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamZImageSeedVarianceSettings\u0060 (slice \u0027parameters\u0027) depends on \u0060selectZImageSeedVarianceEnabled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceSettings.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a499ed6acdc6e618a9c2f057b591b2b642ab0fdb53d18df28473247350d785f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamZImageSeedVarianceStrength\u0060 (slice \u0027parameters\u0027) depends on \u0060selectZImageSeedVarianceStrength\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceStrength.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4d58c21ec9cd94f3eeaabae527fbf8495150b9d289889f8c8fe8108f8e6a92b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamZImageSeedVarianceStrength\u0060 (slice \u0027parameters\u0027) depends on \u0060setZImageSeedVarianceStrength\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceStrength.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"90c1f32f368b0c5b058d96b371f2df171f5a21e51c40bbe702f390f1644c6ab9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamTileControlNetModel\u0060 (slice \u0027parameters\u0027) depends on \u0060selectBase\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileControlNetModel.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c77a4b73e9cf9dbe21483513a5b43786edb2a480a4a39979ecd210cae7c8358"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamUpscaleCFGScale\u0060 (slice \u0027parameters\u0027) depends on \u0060selectUpscaleCfgScale\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleCFGScale.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c1e7cbbfcbd201972619ad188392038a9a61114825ba3b6d1f5c98fc7f1079e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamUpscaleCFGScale\u0060 (slice \u0027parameters\u0027) depends on \u0060setUpscaleCfgScale\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleCFGScale.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"dba284534b9bd91410e5942663633987c2e7f7715afc904594e75de73c541f3a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamUpscaleScheduler\u0060 (slice \u0027parameters\u0027) depends on \u0060selectUpscaleScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleScheduler.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c7b5fe4ebe5f5997a0de911ab6bbbf08961d9e262d8560f78b269c447664ef4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamUpscaleScheduler\u0060 (slice \u0027parameters\u0027) depends on \u0060setUpscaleScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleScheduler.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2b85cfc032ebdaa410f32dc58d08a11cd1153fe95e2ab96cb5465dcb0c649e2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamColorCompensation\u0060 (slice \u0027parameters\u0027) depends on \u0060selectColorCompensation\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamColorCompensation.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"055d6678733d9d8acead5ac895b8de40bec3f4a1d4f37ff45aa05a8491848d5e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamColorCompensation\u0060 (slice \u0027parameters\u0027) depends on \u0060setColorCompensation\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamColorCompensation.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"e71a9ee5b87dbc3e3ced86aae7187b862c7895d223bd67229911266c09ced8a7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFLUXVAEModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectFLUXVAE\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamFLUXVAEModelSelect.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f4369317eb1941bd0e4c6f91ba3382dc79a227c90cb8d67257e3ae4e3357e71"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamFLUXVAEModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060fluxVAESelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamFLUXVAEModelSelect.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"35e775a45e770d7f37e8b76414f80533048858bbc535ae51f3c3a450afdab102"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060ParamFLUXVAEModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamFLUXVAEModelSelect.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbe4ae3c859eb520e6b8610a47657fd6c2615bbd2d1a852d01a4b8830126747f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamVAEModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectBase\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEModelSelect.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"dae39879ab04b14e748be51534d831eebfc51c93577c7e59c1b099fa1514a752"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamVAEModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060selectVAE\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEModelSelect.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"032ecc2ec008fb8cd0e045c999ef4086e822b6e0e41f561d4e0c909e1543ff13"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamVAEModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060vaeSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEModelSelect.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"73783da617683f3857c1e834a6877366609f989d3affddf6a9abf1a74dba6503"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060ParamVAEModelSelect\u0060 (slice \u0027parameters\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEModelSelect.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0e32d4f460d0274de356154f2daf57eb2a5fd23d318f67eaa35aaa5cff3c69a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamVAEPrecision\u0060 (slice \u0027parameters\u0027) depends on \u0060selectVAEPrecision\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEPrecision.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"bba2a3d150eb100ccf03b78e05940c329246055ca9ab831642c8e36d813b55fd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060ParamVAEPrecision\u0060 (slice \u0027parameters\u0027) depends on \u0060vaePrecisionChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEPrecision.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"399f7f8c32ae4fb87297e0a2bd3f5700a68c19aba5273cc9d2ddddb14d73a97b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060zUpscaleState\u0060 (slice \u0027parameters\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"41b7ce84d285473754d9fa84ae4e11b113fbfc95e60331a79fa151c5477824e0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060zUpscaleState\u0060 (slice \u0027parameters\u0027) depends on \u0060zImageWithDims\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8947d8c12bbf0b16d61ca21cdbad264ccc90de303042be985bb661299103d21"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 controlLayers: \u0060slice\u0060 (slice \u0027parameters\u0027) depends on \u0060ImageWithDims\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2e3d37942c3b1d8fdfc672dce4629324d2d64eca4597bbbf18c65d4f39cf117"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 auth: \u0060slice\u0060 (slice \u0027parameters\u0027) depends on \u0060logout\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"37d970b3a89e923ebd3f0e293ba08f66070f06469d271f5389988d5c8c97aa38"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060CLIP_SKIP_MAP\u0060 (slice \u0027parameters\u0027) depends on \u0060BaseModelType\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/types/constants.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"1828529651793fa449713c0a669d476a4c94a9f5031475afc7bf0161e05b4ea0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060(module)\u0060 (slice \u0027parameters\u0027) depends on \u0060zSchedulerField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"eff256d1c932c9a2f417761c350f91d9d2f752e9a4e8a620be94a438f04af0de"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060(module)\u0060 (slice \u0027parameters\u0027) depends on \u0060zFluxSchedulerField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"c545d7b920c1863b82ebdcd333961d90cdc6d24d8b4148db836a0f3d62fab2a8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060(module)\u0060 (slice \u0027parameters\u0027) depends on \u0060zZImageSchedulerField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4cd09e0bc1d27c537f62b17fe095c6d53264b433438a5359392e3c922e9cb31"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060(module)\u0060 (slice \u0027parameters\u0027) depends on \u0060zErnieImageSchedulerField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab23ac12c1b0d6bb071ccf86bb0abc6c8d3190cce92f07331b672ac575407131"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060(module)\u0060 (slice \u0027parameters\u0027) depends on \u0060zAnimaSchedulerField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"39e5e364db5f61f003b1aff66bfe19081be262bfac7735cac120671c76a5b8ac"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060(module)\u0060 (slice \u0027parameters\u0027) depends on \u0060zIdeogram4SamplerPresetField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b3502d42295e9d6fcca7f9770d572aacebf3c9b4755ca53ccba480c6e0ab613"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060(module)\u0060 (slice \u0027parameters\u0027) depends on \u0060zFluxDypePresetField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf65e30ac3321a905d08f12d76282ca2393092b4f2c7336a0acf3636a83d447e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060(module)\u0060 (slice \u0027parameters\u0027) depends on \u0060zFluxDypeScaleField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"cea0ccc6820bdcf17ce7c435e0147d7ff6a1503d9b605da03a40083a76236048"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060(module)\u0060 (slice \u0027parameters\u0027) depends on \u0060zFluxDypeExponentField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"34d9cd8ce093835166e64c3a5e2d17ccc1356e3b8973b292ee2f70106a3af68b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060zParameterModel\u0060 (slice \u0027parameters\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"56412bfda7b52e7e344278e7f3b4f98b3e2503ac06571f2e539391af5b612f2f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060zParameterModel\u0060 (slice \u0027parameters\u0027) depends on \u0060zExternalModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd5b1ad9fc59386c99f8d910fba49a54ed41bcb35d3637fe1bf9bb9fe1a692b1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060getOptimalDimension\u0060 (slice \u0027parameters\u0027) depends on \u0060BaseModelType\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/util/optimalDimension.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2c0d3184ed9ddadf569a863b2f45001972fa720d42651e554024cdc7283f22c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: parameters \u2192 nodes: \u0060getPidDecoderBaseForMainBase\u0060 (slice \u0027parameters\u0027) depends on \u0060BaseModelType\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/util/pid.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"634563b527cd20a6bcfa14fc155ec2b8811acc0741474b14ac569e189c780599"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: prompt \u2192 controlLayers: \u0060ExpandPromptButton\u0060 (slice \u0027prompt\u0027) depends on \u0060selectPositivePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"abd2cc62f6d69917ecfb45eed7d4c0bbd86cd751dd5435f4fc7465ce79d4602c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: prompt \u2192 systemPrompts: \u0060ExpandPromptButton\u0060 (slice \u0027prompt\u0027) depends on \u0060openSystemPromptsModal\u0060 from slice \u0027systemPrompts\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7f7ee399addf54a15d71172b2e54aad0467404f30cb5f9860558eae14c6b22e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: prompt \u2192 controlLayers: \u0060ExpandPromptButton\u0060 (slice \u0027prompt\u0027) depends on \u0060positivePromptChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"877bd4c808da452e563ebbd5c5474a738d778dc799c201c4553834dfb0ec8c42"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: prompt \u2192 ui: \u0060ExpandPromptButton\u0060 (slice \u0027prompt\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e1858f2b2acc7ebe50ac799946ef1b28aa83442e3f1b33f2036af411b5e2e6c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: prompt \u2192 modelManagerV2: \u0060ExpandPromptButton\u0060 (slice \u0027prompt\u0027) depends on \u0060setInstallModelsTabByName\u0060 from slice \u0027modelManagerV2\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"3026ca5ab8b128d94f370ce59cdb9e36f2c70571b326418bebdd69e1ae286ae2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: prompt \u2192 parameters: \u0060ExpandPromptButton\u0060 (slice \u0027prompt\u0027) depends on \u0060ModelPicker\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"921f6d80e9a9ea48c145d13d00c26797ebdeb10414efbf54a12b9d6675cf3c89"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: prompt \u2192 controlLayers: \u0060ImageToPromptButton\u0060 (slice \u0027prompt\u0027) depends on \u0060selectPositivePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ce92dd972d80ce5685a3a2029423b9bd6bcd4600431f467fed1a6530d55d969"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: prompt \u2192 controlLayers: \u0060ImageToPromptButton\u0060 (slice \u0027prompt\u0027) depends on \u0060positivePromptChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d7235306f2831b78d5079db3027a4161cd5920ccd32bee7d11c921426f61046"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: prompt \u2192 ui: \u0060ImageToPromptButton\u0060 (slice \u0027prompt\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"a98d9d97e8bcd1ccf65e4f23b27b4b1ceec0ac5d80e5af97f08d7a6f19dc0903"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: prompt \u2192 modelManagerV2: \u0060ImageToPromptButton\u0060 (slice \u0027prompt\u0027) depends on \u0060setInstallModelsTabByName\u0060 from slice \u0027modelManagerV2\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c7a5c8a8b05cc4f7b1c06320cc0c2de330056617088da290a39e0df24e3ede4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: prompt \u2192 parameters: \u0060ImageToPromptButton\u0060 (slice \u0027prompt\u0027) depends on \u0060ModelPicker\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"d00944c9795069bb406e20eba0ef818f8f2aba0607e574b4a7edc83f1eb0d839"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: prompt \u2192 controlLayers: \u0060PromptTriggerSelect\u0060 (slice \u0027prompt\u0027) depends on \u0060selectModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/PromptTriggerSelect.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"70c1020732cc8aa5662e951e9c7a98967f68391621d01a1390b7181ada34f8e8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: prompt \u2192 controlLayers: \u0060PromptTriggerSelect\u0060 (slice \u0027prompt\u0027) depends on \u0060selectAddedLoRAs\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/PromptTriggerSelect.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9013051e3c430039a6794791c1f3f56b4933cdb937d93b377559ed6b997e784"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: prompt \u2192 system: \u0060usePromptAttentionHotkeys\u0060 (slice \u0027prompt\u0027) depends on \u0060selectSystemPrefersNumericAttentionWeights\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/usePromptAttentionHotkeys.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"22505880b741a44ab315f67619d2450563a4c6d1ee79dedf81ee6e324f47feab"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: prompt \u2192 system: \u0060usePromptAttentionHotkeys\u0060 (slice \u0027prompt\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/usePromptAttentionHotkeys.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"3170f21145fb1c977147aabf5bbaea84439aa536be4e3d0e87faafbb91aef609"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 toast: \u0060ClearModelCacheButton\u0060 (slice \u0027queue\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/ClearModelCacheButton.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"64115048dc2a389757d33582383d9473a076e9fe806b67c6b7ff920547705d93"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 ui: \u0060TooltipContent\u0060 (slice \u0027queue\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdee6a9d2b08863d4721859f7d8c8fb37634041a2ee2c6307517364fd990db25"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060QueueCountPredictionCanvasOrUpscaleTab\u0060 (slice \u0027queue\u0027) depends on \u0060selectIterations\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"a95d4d064589211620f20fd0eeff754d44f0405601e7d40939e9d59619b14778"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060QueueCountPredictionWorkflowsTab\u0060 (slice \u0027queue\u0027) depends on \u0060selectNodesSlice\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d77c3064a15afaea867429ca74d4191d7df1aef98aa01475ea3592b4a9b660c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060QueueCountPredictionWorkflowsTab\u0060 (slice \u0027queue\u0027) depends on \u0060BatchSizeResult\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"520ea80329775183fe9f6ef3fffc5c888c32d2d862a19d18ac57376a34bad4d7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060QueueCountPredictionWorkflowsTab\u0060 (slice \u0027queue\u0027) depends on \u0060NodesState\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"69506952d5665181e9d1610878a871ce63a51d602d195cc11ed8ee9ccea36fc3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060QueueCountPredictionWorkflowsTab\u0060 (slice \u0027queue\u0027) depends on \u0060getBatchSize\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5772c239accbbfbfa4e081cb83bd7936fa10fdb2b1849ebd05bb0e6b2714510"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 dynamicPrompts: \u0060IsReadyText\u0060 (slice \u0027queue\u0027) depends on \u0060selectDynamicPromptsIsLoading\u0060 from slice \u0027dynamicPrompts\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"52e1fa566b701995c02fa0c4651019a87091ceb6bddbf1315cfb97481ae2dd1d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 gallery: \u0060ReasonsList\u0060 (slice \u0027queue\u0027) depends on \u0060selectAutoAddBoardId\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"d25f2ca84ba74362dd0699d5af787c57ef60443dcc885d110eadf6beefa430ac"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 dynamicPrompts: \u0060InvokeButton\u0060 (slice \u0027queue\u0027) depends on \u0060selectDynamicPromptsIsLoading\u0060 from slice \u0027dynamicPrompts\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeQueueBackButton.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1fb3cc53c12ca8e42482e5d9da7db3fad8b696844dc9cf3235de8b88e817295"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 ui: \u0060QueueActionsMenuButton\u0060 (slice \u0027queue\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueActionsMenuButton.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"2be4eb3426acc08220bb53b36ddab491c12725c504f4096f0d2a57e9ba9bcaf4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 ui: \u0060QueueActionsMenuButton\u0060 (slice \u0027queue\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueActionsMenuButton.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"42f1f3d274b0f7144c163b2ebec4afcce1e2f0470c0613818741a899437d4a71"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 system: \u0060QueueControls\u0060 (slice \u0027queue\u0027) depends on \u0060ProgressBar\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueControls.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"852c841d2971d53cb5088819d01193311a6e8edb77d4a24797797ec2c80f3646"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 auth: \u0060QueueCountBadge\u0060 (slice \u0027queue\u0027) depends on \u0060selectIsAuthenticated\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueCountBadge.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"97945ce539005075e4ccebf904c04f51420fd48ad8ddc74917c5843f95ecbe7a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060QueueIterationsNumberInput\u0060 (slice \u0027queue\u0027) depends on \u0060selectIterations\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueIterationsNumberInput.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"24eb97b67473a889e4fe3e243601515c0af128f4b709538e8a138a9b230a935b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060QueueIterationsNumberInput\u0060 (slice \u0027queue\u0027) depends on \u0060setIterations\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueIterationsNumberInput.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"f045b9b8f9fa5549db9cc00579404f56196428b805f2cbc8fec132b3ef75228c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 auth: \u0060QueueItemComponent\u0060 (slice \u0027queue\u0027) depends on \u0060selectCurrentUser\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueItemComponent.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"6aa11f2b5f70bb74fc33f2f74885d6ef5577bb629af50c353af6cbdbc505cfa8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 gallery: \u0060QueueItemComponent\u0060 (slice \u0027queue\u0027) depends on \u0060DataViewer\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueItemDetail.tsx"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"e035899d3a94277015610bd9659fd0875b5d49f15cd6d7b5e43a122a2402fc6d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 auth: \u0060QueueTabContent\u0060 (slice \u0027queue\u0027) depends on \u0060useIsAdmin\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueTabContent.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"37555e19758f50438bf95a0363d2ad38a546d5541b8608a229f6c31f7a89b408"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 toast: \u0060useCancelAllExceptCurrentQueueItem\u0060 (slice \u0027queue\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useCancelAllExceptCurrentQueueItem.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"8016b253d5e84f4d2df48e8c5516ae68c307afe0b0473b7fe2bf4e69d5f58be3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 toast: \u0060useCancelBatch\u0060 (slice \u0027queue\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useCancelBatch.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a19a3254f647dc108a5c28e30cc2577ac8744585f8e0b5570413413cc1a9145"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 auth: \u0060useCancelCurrentQueueItem\u0060 (slice \u0027queue\u0027) depends on \u0060selectCurrentUser\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useCancelCurrentQueueItem.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"062b4373b38ab89151309830624787d713fc19f500e394931d2b0e546d6466a8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 toast: \u0060useCancelQueueItem\u0060 (slice \u0027queue\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useCancelQueueItem.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb4399b579ad81d3a612b832e3dea1bd531770734cf71b6cbabb1de5442f0719"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 toast: \u0060useCancelQueueItemsByDestination\u0060 (slice \u0027queue\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useCancelQueueItemsByDestination.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ce9378088f9bf368e579183941fd3c7b463c2dce2a6db8f210e071aadbdd065"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 auth: \u0060useClearInvocationCache\u0060 (slice \u0027queue\u0027) depends on \u0060useIsAdmin\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useClearInvocationCache.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"4035d33e02302cbd7812a0dcff2baf84b5aae9157dc05c49aef56846d5b51376"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 toast: \u0060useClearInvocationCache\u0060 (slice \u0027queue\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useClearInvocationCache.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3329310f75a9a4d2694378fc5c32c584a8d33b89cb5ce034db952a89669346e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 toast: \u0060useClearQueue\u0060 (slice \u0027queue\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useClearQueue.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"2936967aaa9d3f0c36871c759df78da3cc77c6c7a79e6eb78cf534cf26b8db25"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 toast: \u0060useDeleteAllExceptCurrentQueueItem\u0060 (slice \u0027queue\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useDeleteAllExceptCurrentQueueItem.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"39919bd496b6ac8c682707f70a07e8306642a4e11bc34a965069a39efbe0b0c1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 toast: \u0060useDeleteQueueItem\u0060 (slice \u0027queue\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useDeleteQueueItem.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"77991de20b4f6dbfc661f3ace52e871d0b25df3cfb907ae253103218f5a6b7ab"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 auth: \u0060useDisableInvocationCache\u0060 (slice \u0027queue\u0027) depends on \u0060useIsAdmin\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useDisableInvocationCache.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"dccc3b6089e6775173332c2062f7bdc6905eb461de6b3e113d5f0a8d83958f41"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 toast: \u0060useDisableInvocationCache\u0060 (slice \u0027queue\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useDisableInvocationCache.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"a46dd567544ced06228965b20a4b733292d6e33f08a7c58d71bb514f44325f2d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 auth: \u0060useEnableInvocationCache\u0060 (slice \u0027queue\u0027) depends on \u0060useIsAdmin\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnableInvocationCache.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"043f99c708ea6f733d1bba19d7b19d7135390755c0fbcc6657dc5ee99df2794a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 toast: \u0060useEnableInvocationCache\u0060 (slice \u0027queue\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnableInvocationCache.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"b062de615a5f1dfa4e41d9a8a1d576d8703009c408100720e9fd3d2c4bb1b722"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060CanvasManager\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"d524059b43b39519d5f09ae61f1bcb34bce1ba245cf92da97785687d862d51e5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060selectCanvasDestination\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"f28f4281f5df3134c64052dec783cfe9cc483ed617dfc88bca5d0cf4699eb397"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060GraphBuilderArg\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"aec5e3ccb1338ea3ae45722be76f2289450487847449616c8b95eb115ef10872"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060buildSDXLGraph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"a784c88a8652e87a453ad3ecc0539c4368f90cf1d65324150d8c7fec1eb84ed6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060buildSD1Graph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ab29d127c7c32cc8db793b4675b4547ca609ea1722faf10ac90c1941ca83699"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060buildSD3Graph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"34d8bf5955a92fc8b5a3bae5fb642cb6c153b9077c8427adc4dc46aebe2bcc2d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060buildFLUXGraph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ba624d05d8b47325cb3c59d0d5a7781bc125b61bcef968ee185bb111aa5939a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060buildCogView4Graph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"900540b8afa2e112a24ed9cb4db0e70f7f47f2f8634a3683a40eabe905b4e717"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060buildQwenImageGraph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"03f133a67528efd7c7553b0b440dacb82c128136b6452d1e188ef8d011363752"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060buildZImageGraph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"11ebe8ddf1ed57e1e37047fb8e98d1265f4fd5eabc74c94a08e52d6adf103d44"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060buildErnieImageGraph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c1a4c32990b7b1efb3f1368a740362b536ddbc6deed15b11e03eb81aec0a0c3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060buildKrea2Graph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ccf5aafa5604591dadaab1923a3f5f2d198dae992bf9f3093bb70ac6c185a45"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060buildIdeogram4Graph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"5984a7b576e4ec32b97b0a1e9c1394a3bd3429c522aed2a499c1b80abea5db3b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060buildExternalGraph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce14c5f7dce11b8afd16992dafa30ee10ba9f5d099f03095c738b14d04a74f60"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060buildAnimaGraph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1b16b8488892cc9a7f044d0063cc148af3f6c77a644f2c927e0bf6ae7bbeb47"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060buildWanGraph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0762fbc567fdc920530b16246d31a0bf830ce13f610865abee76abaa029c1e0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060buildMiniMaxH3Graph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec926380b3cd4d3e3832e5b55dd27c0f66a2d99c5d53c80b5f93077760344c64"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060UnsupportedGenerationModeError\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"a842918904d6361b4908c7ab2807caf3d13bcaebd8b5266402145347d635d9aa"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 toast: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"68577a62869970e04f3addecdf8f7bd4754a91edfb4d4e046e797fa2e26d0fde"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060prepareLinearUIBatch\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1affde94786a7c45e30b7477f19df651400fc5a51b8ecfd446434ad987868d0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060BaseModelType\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f1984247119951cc2fbf024f125d83b293090414496b92936d74721f2210faf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060positivePromptAddedToHistory\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"681e53d1c25bbdd95844de449b1a90599d20b89cd1227fcefaf376cc20f13af0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060selectPositivePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"352696c351f9919cd85bdebaaad9c79f471621778bb1b6b0b49731dc446a9919"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060enqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060selectNegativePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f308291b7bd6f797ccaa98bd3fddf52c40273b5f0b6cdc37cc5540155003bde"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060useEnqueueCanvas\u0060 (slice \u0027queue\u0027) depends on \u0060useCanvasManagerSafe\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8bfd0931ed2aad0ee30d4fb661b4166d10af7a76d4591c1d998971c16ba4df9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060GraphBuilderArg\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0d8e2b2266cfc7bdf1724cf4db0c86ff074de8206f4cc6d255b9fb1a274bf63"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060buildSDXLGraph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"be5773132cb9ae7a65e11d82b8a8a2e3e74d057a56ebaeb15248bb4fa2b55567"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060buildSD1Graph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"b06428a17aab2351921b5b9baaeec47bb79661d6f4b2577e4971ed154fb83a15"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060buildSD3Graph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"1beeca964702c1424bccd4cc31db9f156ffc7128d2eaa05b1aa7f7b8e4f200a0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060buildFLUXGraph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"51f37aa0b0ef056bed4026bed411910733e995b371b7554e13d44ce0368c923d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060buildCogView4Graph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"d418dab58da053e93cc46041b3e646840093e118daba54c925b79f914d0bca0d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060buildQwenImageGraph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b3ecc2fb31c72e3acad2047f6c307d6acf48a5a6ab7f80f6e7aa64137888aa4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060buildZImageGraph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"eeba7579d7bc177e62bbe3f5f5d9e5cabdd9fbfd618b7839c614503d7bac6517"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060buildErnieImageGraph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d66315ff02399b65bb5b9eec42ac4aef3643b10c345e36c82974dcb9537cd7b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060buildKrea2Graph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"71c4712d69688823cceae1670c3dd7d3ade11c4b73c03184984ce94413f25cf6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060buildIdeogram4Graph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"a267744f7ad68028de9c13ac8890eba87d9ef71f138491bfbbe1865c3d8a546e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060buildExternalGraph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1af32b5b438f608be51e9e1d0c42bbfa536aec7b7aaa3538338c9918c961694"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060buildAnimaGraph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"f635262625c183ae7ad293facec69a1b52804161956504822b9a8be1cc1a7d7c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060buildWanGraph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"f15de8d5418ec2c24c001ab170be5a0138a9d1b4fb221f272ad6c0f3db95b17d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060buildMiniMaxH3Graph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"304732ac2ce6e6ed8b44d18c5a93acd62d7e7a422db9f039ee6d3149ee3208e1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060UnsupportedGenerationModeError\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8afeab4817ffc82a89c0333b7cba4938e9637efab4685edb4d12a4c76e260b7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 toast: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"c483b99ebb68f5410c303b95d7f2409b99dae8c3369bdaaa2974a03e7570b0ad"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060prepareLinearUIBatch\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"16167b7c230bfc77bf7746ff2c388bb6c4a31832792324e163441c00b0fb62db"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060BaseModelType\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3cf0eb8eba2d3ae9f95d50790237cccfa4b1aaee5fdc2fa27edafad14b8cd05"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060positivePromptAddedToHistory\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aa6f3f0d2d3150b2552ecc41a4223792774aef4256590168f4d0e18288597d9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060selectPositivePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e0105ef798f82ff95029196db7a7230f8aae2f721f8d18a9d14b2aa69057b1c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060enqueueGenerate\u0060 (slice \u0027queue\u0027) depends on \u0060selectNegativePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"89955d4c216a116c56899c7c0cd50a3d00165cba41e838fe97c8a6c944c3ca77"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueUpscaling\u0060 (slice \u0027queue\u0027) depends on \u0060buildMultidiffusionUpscaleGraph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueUpscaling.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"573dd5c9bcc3dad405546c4cc7febabf40a371f7419ddc124a809acdf9ac53bc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueUpscaling\u0060 (slice \u0027queue\u0027) depends on \u0060prepareLinearUIBatch\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueUpscaling.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf923ef2194bcdb9965022c351f31b3e5a83e70192fc5d4bcfbaa336cc7e76a9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueUpscaling\u0060 (slice \u0027queue\u0027) depends on \u0060BaseModelType\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueUpscaling.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce86f19361289affec12c4c7ec389235fb87f823ecd0ae4576d755c53625a953"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060enqueueUpscaling\u0060 (slice \u0027queue\u0027) depends on \u0060positivePromptAddedToHistory\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueUpscaling.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6bdeaa4a94f72c54404f6f8b087ca84094282aad3af4c7ece40b34b864ebb39"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060enqueueUpscaling\u0060 (slice \u0027queue\u0027) depends on \u0060selectPositivePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueUpscaling.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ae8b51e1bc8a4f913cf2b4fb59e85f808dd3d9f72887427a00e97d82ddcb1be"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060enqueueUpscaling\u0060 (slice \u0027queue\u0027) depends on \u0060selectNegativePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueUpscaling.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd193c7748dd58255050a223713f2a54d2818b0c06b012bb9369ca0869a05fc4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060getBatchDataForWorkflowGeneration\u0060 (slice \u0027queue\u0027) depends on \u0060selectNodesSlice\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9c7ffb98039e72ab6b777ab894bb6cd975057254cecf4025690050ee008a739"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060getBatchDataForWorkflowGeneration\u0060 (slice \u0027queue\u0027) depends on \u0060isInvocationNode\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"120f12e906ef679038d07544cabc4564659bd5f4e322e0bf8ca53193219590a2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060getBatchDataForWorkflowGeneration\u0060 (slice \u0027queue\u0027) depends on \u0060isBatchNode\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d950e64e9ee864402b50d47318467e55420853757ae2bd6bb840fc937f8ea49"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060getBatchDataForWorkflowGeneration\u0060 (slice \u0027queue\u0027) depends on \u0060resolveBatchValue\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"f19b65eb79eb5789e7293a683fee8ce03b82693ba562d19955c371fec92a1062"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueWorkflows\u0060 (slice \u0027queue\u0027) depends on \u0060Templates\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b6573fd3d05b71dfa9dcfd010035a72d52bedd4eb03fa1e97c28bd935489640"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueWorkflows\u0060 (slice \u0027queue\u0027) depends on \u0060buildNodesGraph\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e40649560e47bd6f65c5a20ce498eabc491cf2387d34ac54a69249fa577eb0b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060enqueueWorkflows\u0060 (slice \u0027queue\u0027) depends on \u0060buildWorkflowWithValidation\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ea7149c04e9106042515e4826c5e1d4e6f0ea9265f5aea6b05129a8454eaaee"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060useEnqueueWorkflows\u0060 (slice \u0027queue\u0027) depends on \u0060$templates\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"94331f2ac66acfb6fcbda16129953adfc9dcd18835375d8e932917cf3de8bb36"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 ui: \u0060useInvoke\u0060 (slice \u0027queue\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"076bb4e677791aa0557be42f35fce17f796367f25c7765ca16ceda36ccbf1d6d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060useInvoke\u0060 (slice \u0027queue\u0027) depends on \u0060selectSaveAllImagesToGallery\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"db2952bf9d7e8082c9ca89579dd7d3b5d04dd8704a69b99e926bb7ad2e80eb94"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 ui: \u0060useInvoke\u0060 (slice \u0027queue\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2e99dd86c2b3ef71a6def5960d045cd1065e1069ae88f1a9b8588e3a7801e6f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 ui: \u0060useInvoke\u0060 (slice \u0027queue\u0027) depends on \u0060VIEWER_PANEL_ID\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"b80b90251186c8c86c227705e1987d4f2aa2777789932638777adff0721e900d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 ui: \u0060useInvoke\u0060 (slice \u0027queue\u0027) depends on \u0060WORKSPACE_PANEL_ID\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"a916fa734526d2bc4bfaea7a157a86476d2ace5b3ee70aea97e9452a7b219e63"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 auth: \u0060usePauseProcessor\u0060 (slice \u0027queue\u0027) depends on \u0060selectCurrentUser\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/usePauseProcessor.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e6686c17984f8c71307d18e62ff12a183809f8cf9ab49b93cbdd3c33fb9b94c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 toast: \u0060usePauseProcessor\u0060 (slice \u0027queue\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/usePauseProcessor.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"007b1a0f586b4b5ee09b9a30c82218a8c58e84ee762cb9ae399dae08d40a7a75"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 toast: \u0060usePruneQueue\u0060 (slice \u0027queue\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/usePruneQueue.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"89d5524335bde47cffd0f0b9ad93138ff4dd3cdfe66bded26ce2d7b13989d0d4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 auth: \u0060useResumeProcessor\u0060 (slice \u0027queue\u0027) depends on \u0060selectCurrentUser\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useResumeProcessor.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"3677f68eebb593290771b4447d1db162fb66b33099a044b3a99e456fc3699fbd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 toast: \u0060useResumeProcessor\u0060 (slice \u0027queue\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useResumeProcessor.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e6d231be8129c8c0ef3c0fe7101d41aa839915bc3a0db23ae588f85a438e4e2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 toast: \u0060useRetryQueueItem\u0060 (slice \u0027queue\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useRetryQueueItem.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b173aed445f084fbea9d1487478b98ef18664fd5dec85bb0e3294fccfa20370"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 ui: \u0060UpdateReasonsArg\u0060 (slice \u0027queue\u0027) depends on \u0060TabName\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"818a1590408d0458176f0505a42e3fe08a3d81e9798d001b0200eb73e69ed4ec"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060UpdateReasonsArg\u0060 (slice \u0027queue\u0027) depends on \u0060CanvasState\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"35021aace8d355c3d64cf9fdf8a2027b6ba1a9fdfc31e61f06cf87c0e1599323"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060UpdateReasonsArg\u0060 (slice \u0027queue\u0027) depends on \u0060ParamsState\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"271899bd57ceea3d755ab60f5b5244ba50039175761271b65277ab9067dfdf19"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060UpdateReasonsArg\u0060 (slice \u0027queue\u0027) depends on \u0060RefImagesState\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"81b0f3156ef56a2e955955367fcff89a9181d8273566fc1a387aedcbf4e64294"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 dynamicPrompts: \u0060UpdateReasonsArg\u0060 (slice \u0027queue\u0027) depends on \u0060DynamicPromptsState\u0060 from slice \u0027dynamicPrompts\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0045252c4058f50b82de850b98b63bba00cbfcefe5bbf46698d60d6de76fcc8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060UpdateReasonsArg\u0060 (slice \u0027queue\u0027) depends on \u0060NodesState\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"857512691ec23f8b0a5514d3880505d566906cc65969b8b10926a0ff7e0c645c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060UpdateReasonsArg\u0060 (slice \u0027queue\u0027) depends on \u0060WorkflowSettingsState\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed41c06f913a132c13b30524c86c0ff1e445fb18cc75fd9546d0737bf9e4110a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060UpdateReasonsArg\u0060 (slice \u0027queue\u0027) depends on \u0060Templates\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"deb8850c86fd982c6005d550d418edf071ed8a05cd5c64a63271a0bf0197601a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 parameters: \u0060UpdateReasonsArg\u0060 (slice \u0027queue\u0027) depends on \u0060UpscaleState\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"07f2a105e7b3c18830c6bc99cbb1cb960f77f5a9da80e5d763f23945d52eeb07"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060UpdateReasonsArg\u0060 (slice \u0027queue\u0027) depends on \u0060LoRA\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fe133e50b70dc82fe448ce01bf753e77bd5c5422b766c0c476dc2b096134683"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060selectWanWiredConfigs\u0060 (slice \u0027queue\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff4a6d2082b5cc913f48aa6f5a08430a4e7e19de6635401b7b7ea32e1c16459a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060debouncedUpdateReasons\u0060 (slice \u0027queue\u0027) depends on \u0060selectMainModelConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"d55688df979965b4dd0fddf16e6c3025e9311c9f6ea1fc9f6fcfdd3249c8df2e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 parameters: \u0060debouncedUpdateReasons\u0060 (slice \u0027queue\u0027) depends on \u0060isFlux2KleinQwen3Compatible\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"80a822fd503c24c211aea24dcb50e2097ffcc6f4f87c5ae1c4fc9b03b795a6e2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060useReadinessWatcher\u0060 (slice \u0027queue\u0027) depends on \u0060useCanvasManagerSafe\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"713dec7defde1a5c18036253f583d686ec1360b17a8f07f8ebc7805c105ebf6e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 ui: \u0060useReadinessWatcher\u0060 (slice \u0027queue\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e0875e0428250fb7ab926d2cbd7a85cddc99e892bf00e87086b00338c755bc2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060useReadinessWatcher\u0060 (slice \u0027queue\u0027) depends on \u0060selectCanvasSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"20b6a86739443b80f39d38ed29a255fb68185af5dc026bf398c3253efba2317c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060useReadinessWatcher\u0060 (slice \u0027queue\u0027) depends on \u0060selectRefImagesSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1a646e9bfbc4bf758b5354a48c5a0b3ead98ff7d1be692caa07192394b1f212"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 dynamicPrompts: \u0060useReadinessWatcher\u0060 (slice \u0027queue\u0027) depends on \u0060selectDynamicPromptsSlice\u0060 from slice \u0027dynamicPrompts\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b504ee8ebd0c8619855f6e9558a2b65e1f8b7201be602bff06ac8bb80f339e5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060useReadinessWatcher\u0060 (slice \u0027queue\u0027) depends on \u0060selectNodesSlice\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"45ede2a1cef7716472ca9879034046f93022b65261b60f0c8f78ee1eb654d560"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060useReadinessWatcher\u0060 (slice \u0027queue\u0027) depends on \u0060selectWorkflowSettingsSlice\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"0070732ba524fb4d486b8b7ad904c02014469d0fa7334cb9ede5279bd5d927fa"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 parameters: \u0060useReadinessWatcher\u0060 (slice \u0027queue\u0027) depends on \u0060selectUpscaleSlice\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f85ab5408db831a36ffd224be13dbc2b8a426ff800f9a7720528b85f6752a3a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060useReadinessWatcher\u0060 (slice \u0027queue\u0027) depends on \u0060selectAddedLoRAs\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8b877a1c08c1f793aecfded1230b8551c4bac887c8693c83d10836992b1b9b4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060useReadinessWatcher\u0060 (slice \u0027queue\u0027) depends on \u0060$templates\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"c86b8e24d5fc763d767b0dca1b0fc134106d10d91bcf0ec2275ac52ad2157a8b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 dynamicPrompts: \u0060getReasonsWhyCannotEnqueueGenerateTab\u0060 (slice \u0027queue\u0027) depends on \u0060getShouldProcessPrompt\u0060 from slice \u0027dynamicPrompts\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f634b76c041608a337c1d40c15217a367f415d82d5b73a08ae3e78ebe524cf0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060getReasonsWhyCannotEnqueueGenerateTab\u0060 (slice \u0027queue\u0027) depends on \u0060isValidKrea2RebalanceWeights\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":586}}}],"partialFingerprints":{"codehealthFindingId/v1":"a364a3d6c9dada903f5c10c46d9e3a600f9e13412d03c9ad84af81190db8e53c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 modelManagerV2: \u0060getReasonsWhyCannotEnqueueGenerateTab\u0060 (slice \u0027queue\u0027) depends on \u0060SUPPORTS_REF_IMAGES_BASE_MODELS\u0060 from slice \u0027modelManagerV2\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":624}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b36017522510d8d508f6c56a0fcf54e81c730a2241e294a8fcf18e0801b6149"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060getReasonsWhyCannotEnqueueGenerateTab\u0060 (slice \u0027queue\u0027) depends on \u0060getGlobalReferenceImageWarnings\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":631}}}],"partialFingerprints":{"codehealthFindingId/v1":"62e6ea6110bb9c8cfaebf12924ea8adb90d801e6ab4f1edfb39b7ac6684dab73"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060getReasonsWhyCannotEnqueueWorkflowsTab\u0060 (slice \u0027queue\u0027) depends on \u0060isInvocationNode\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":658}}}],"partialFingerprints":{"codehealthFindingId/v1":"b33295cae090a2e9329ca706864873a65ac3dd40e9733f7e8e337ef071214c3b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060getReasonsWhyCannotEnqueueWorkflowsTab\u0060 (slice \u0027queue\u0027) depends on \u0060isBatchNode\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":659}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dbee6dd2b03584cbab57ef91d33299defb052e39e6d40667d77b1d0f1a15228"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060getReasonsWhyCannotEnqueueWorkflowsTab\u0060 (slice \u0027queue\u0027) depends on \u0060isExecutableNode\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":660}}}],"partialFingerprints":{"codehealthFindingId/v1":"f73869062ade875861e0f0d734b3b44322627eea1b77bc3306fb97942bbd2acf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060getReasonsWhyCannotEnqueueWorkflowsTab\u0060 (slice \u0027queue\u0027) depends on \u0060resolveBatchValue\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":680}}}],"partialFingerprints":{"codehealthFindingId/v1":"6402b844111b8c2dd583a26fd915c36675e0bd1006b925ca807d6440d294bb94"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 nodes: \u0060getReasonsWhyCannotEnqueueWorkflowsTab\u0060 (slice \u0027queue\u0027) depends on \u0060getInvocationNodeErrors\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":710}}}],"partialFingerprints":{"codehealthFindingId/v1":"0580f39c1b73031baf37675a158ecbdd82bf155b4ab2af166784593740cec989"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 parameters: \u0060getReasonsWhyCannotEnqueueCanvasTab\u0060 (slice \u0027queue\u0027) depends on \u0060getGridSize\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":874}}}],"partialFingerprints":{"codehealthFindingId/v1":"acc0ab5fd5708875b64b31d10e1c5ed8b1a0d8cf9c7acf5d7afb9bd53e478d9a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 parameters: \u0060getReasonsWhyCannotEnqueueCanvasTab\u0060 (slice \u0027queue\u0027) depends on \u0060getPidScale\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":874}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d56cd36bc3d2ec629ed4c8678aec0a9606f81a76311e5ca0e2d93d7b4a2893d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060getReasonsWhyCannotEnqueueCanvasTab\u0060 (slice \u0027queue\u0027) depends on \u0060getControlLayerWarnings\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":1472}}}],"partialFingerprints":{"codehealthFindingId/v1":"a51f5e6dc87675d5e7e8dcca71d1d91d9cee9ec5a9aaa0e619800800d5d55f22"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060getReasonsWhyCannotEnqueueCanvasTab\u0060 (slice \u0027queue\u0027) depends on \u0060getRegionalGuidanceWarnings\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":1503}}}],"partialFingerprints":{"codehealthFindingId/v1":"db70e947ac3632ddbecda761125f0b65b4619c47c5d43c011ccd48946b1f0e57"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060getReasonsWhyCannotEnqueueCanvasTab\u0060 (slice \u0027queue\u0027) depends on \u0060getRasterLayerWarnings\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":1518}}}],"partialFingerprints":{"codehealthFindingId/v1":"af9af0dfe123bf099f3f2b72b8cc6114dc189225ee7817bfe4c64afb4dbf05c9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: queue \u2192 controlLayers: \u0060getReasonsWhyCannotEnqueueCanvasTab\u0060 (slice \u0027queue\u0027) depends on \u0060getInpaintMaskWarnings\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":1533}}}],"partialFingerprints":{"codehealthFindingId/v1":"59618833d77d489fd86babfa029a4aefc3916a2a9eb371a69b9ca0f59a3a49b7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: sdxl \u2192 controlLayers: \u0060ParamSDXLRefinerCFGScale\u0060 (slice \u0027sdxl\u0027) depends on \u0060selectRefinerCFGScale\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerCFGScale.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fd1ca2bd519d059ea91b8eda204dd20f3ac451a5eea4529aef35d6ebb240dce"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: sdxl \u2192 controlLayers: \u0060ParamSDXLRefinerCFGScale\u0060 (slice \u0027sdxl\u0027) depends on \u0060setRefinerCFGScale\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerCFGScale.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"dec6593e6c90cfdbf1a12bda3eb0ba4bc14511a19a8a164630e428ab3ebb2179"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: sdxl \u2192 controlLayers: \u0060ParamSDXLRefinerModelSelect\u0060 (slice \u0027sdxl\u0027) depends on \u0060selectRefinerModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerModelSelect.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"eaf5b6a0b380bba50cfe33eb2f44b8490dcab59acaad2260e8fe231aa5a6883d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: sdxl \u2192 controlLayers: \u0060ParamSDXLRefinerModelSelect\u0060 (slice \u0027sdxl\u0027) depends on \u0060refinerModelChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerModelSelect.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b13706ffd8ff631b75b9fbb985b7657c8d2d4e6fc23ca101a2a852dbee7df33"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: sdxl \u2192 nodes: \u0060ParamSDXLRefinerModelSelect\u0060 (slice \u0027sdxl\u0027) depends on \u0060zModelIdentifierField\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerModelSelect.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb6bbe79fd26c02d52b49dc2181c72cf581d3126f1f1cdf52e25b883d3311d33"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: sdxl \u2192 controlLayers: \u0060ParamSDXLRefinerNegativeAestheticScore\u0060 (slice \u0027sdxl\u0027) depends on \u0060selectRefinerNegativeAestheticScore\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerNegativeAestheticScore.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4264e4a3136753a0c75d1035e01a1a7aa55c745d9e13e5ea64d6334a462dc06"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: sdxl \u2192 controlLayers: \u0060ParamSDXLRefinerNegativeAestheticScore\u0060 (slice \u0027sdxl\u0027) depends on \u0060setRefinerNegativeAestheticScore\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerNegativeAestheticScore.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"09229d0d14445ccb7ef1905d4de15ae4ea9cd84f9a02bbc31a84effc673adc60"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: sdxl \u2192 controlLayers: \u0060ParamSDXLRefinerPositiveAestheticScore\u0060 (slice \u0027sdxl\u0027) depends on \u0060selectRefinerPositiveAestheticScore\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerPositiveAestheticScore.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f8e07a28cea4979723628ea1252c1a0e8f896e3cb9c2266b52c96024e20ac3d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: sdxl \u2192 controlLayers: \u0060ParamSDXLRefinerPositiveAestheticScore\u0060 (slice \u0027sdxl\u0027) depends on \u0060setRefinerPositiveAestheticScore\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerPositiveAestheticScore.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fb7b2bbbfb8be81c737f03547c0417829a3762b6d633dd8215a7a1bed14a775"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: sdxl \u2192 controlLayers: \u0060ParamSDXLRefinerScheduler\u0060 (slice \u0027sdxl\u0027) depends on \u0060selectRefinerScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerScheduler.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4e0a2401030575a767ed7146999f6f03a342df1a8db92c25f71804533c8acb4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: sdxl \u2192 parameters: \u0060ParamSDXLRefinerScheduler\u0060 (slice \u0027sdxl\u0027) depends on \u0060isParameterScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerScheduler.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"b49fd2f7aa1843a16ce7f6081edc22c16630fb0964c34a3cf5ebb77a3b271a00"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: sdxl \u2192 controlLayers: \u0060ParamSDXLRefinerScheduler\u0060 (slice \u0027sdxl\u0027) depends on \u0060setRefinerScheduler\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerScheduler.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"f26cb5bb30ebdc46d1c4815a99af4b74b3cc67945ca0b64d0b808697ac541afd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: sdxl \u2192 parameters: \u0060ParamSDXLRefinerScheduler\u0060 (slice \u0027sdxl\u0027) depends on \u0060SCHEDULER_OPTIONS\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerScheduler.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d86fb08dd9107adefec1a5dd2525350f4f3d8dfeb7355d0175962a6fce85b2c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: sdxl \u2192 controlLayers: \u0060ParamSDXLRefinerStart\u0060 (slice \u0027sdxl\u0027) depends on \u0060selectRefinerStart\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerStart.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"038c030a225edabdc7461eebf4e12598b5efbc6e1526ccfc465906e28db59263"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: sdxl \u2192 controlLayers: \u0060ParamSDXLRefinerStart\u0060 (slice \u0027sdxl\u0027) depends on \u0060setRefinerStart\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerStart.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"d96b1bd43eea60bdd2edb72b2806dca842a9f44a4882b52e17f638dd149125f0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: sdxl \u2192 controlLayers: \u0060ParamSDXLRefinerSteps\u0060 (slice \u0027sdxl\u0027) depends on \u0060selectRefinerSteps\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerSteps.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"7659899ad0c055267f53b7c9b79b0a29e101685c2f80a012e3cf822189a375cb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: sdxl \u2192 controlLayers: \u0060ParamSDXLRefinerSteps\u0060 (slice \u0027sdxl\u0027) depends on \u0060setRefinerSteps\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerSteps.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"39855457b111c17829325f379be4293e00fcc54a936a8e472eb24fad43327f9d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectVAEKey\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"083df02a74f24dfee03a273b429a05656c89a4f17694a94081580c35b74231e6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsFLUX\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"d12a50f4e3dd727a8e6cfd0024339f68cfc6ba44f5fbbb0e2d62793d5e33a31d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsFlux2\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d743c28a3aa32c856b3637f593ecc9938cd812a717b7d276985b612f18b3aaf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsFlux2Dev\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"e868c120238feaedbfd325e2905330326e645a24bff4720c98be22d78c78297c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsSD3\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"b820dc2bab9b1aebeaecc8f7a46e6bce81c238c091cfa8a04313c99c0c73ca61"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsZImage\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbdd78dffb4a6dfb4f8625eee1a6f99445096586fe35007a25cb907982bef461"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsIdeogram4\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ff10d020435d9b90d330374f86d82eda685090d05884bd97377f505d01022e2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsExternal\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"74c8f89ba8aef3e00dac9b49a61ed8d1a834cda84f277cba607b51eb4ded3e07"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsQwenImage\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"8032e1d4967679c7cc5437f74878a31b64cca16d53d21042d85c8ed027b11d7c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsAnima\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f1910f21c55977b4b43013d32ce29038929b6f28d7f72631723f086ddb57989"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsErnieImage\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce206a63754f0d5830a31060e955259d6b3f2b5dd98b34728f7816fe60702dcd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsKrea2\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6ef039e287e3409dabd4d1af69d625b3a82162b645673ba24ab9b25352436af"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsWan\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"cadb5123b8f14c71e4633ed147c00c830a2d37a51c5fdbf74f874c613c81d45a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsMiniMaxH3\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"a88555aa1356be7fa53c176fa3d1c600ce29d61c3acb9db6e7fc05b5fad4ed5a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"9822534bb7bd0e49ad59991ef0218f633cfe47bb02bcb9fbc5555f5c32286198"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamFLUXVAEModelSelect\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ce6d49446c462e3cdfe982de95fdfe8a758041267bf4d0b8a596f52a4c0044a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamVAEModelSelect\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed9b9933812f896dd98c05cfa0b3189a38a0b96bca4c5a0b752e683e338fa8e7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamVAEPrecision\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e92fc895edb747bb399891b64e9f381b95c9c234a0d01bab69197b959caf6ff"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamClipSkip\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"704d79b9e290e99442f807e945e0aa3b8f5bc7de3a43c150542d47ba2abe2232"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamCFGRescaleMultiplier\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"842f24f21c0c322244facb884417186931dd8369d159f80d2ebf0d4e95123130"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamSeamlessXAxis\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"5151cab91fec408ad4c4e9f92ec87c014f23d1c23704ba2916568440b4af51a1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamSeamlessYAxis\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e5518952bb536e99189b393b933312e0138d333cd9539f4d98507ae10697bd5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamHiDiffusionToggle\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb30bf8502e64913228202dfac5c453e3be34359c7b2703d836a5dcc96fc0e8b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamColorCompensation\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"45b71ac0d1c6b21ba02a1c7b399e67c124a4178b5e85bb49e437b0f68c54830a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamHiDiffusionRauNetToggle\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"838304dc0dfe2c8c8cd5b185a67e9cf92134b16d4c1714ec202bdbdad48800dc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamHiDiffusionWindowAttnToggle\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"98a1cab61eea4c938c248860f9b6a1c9868a4288e87ff3af2288623c0ffca82e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamHiDiffusionT1Ratio\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"de70db2035acc00e22a80888bc0627aff33574f69abb88387f52e81c6870d65a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamHiDiffusionT2Ratio\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"efddebde2880200208dd7cf3e8b6f6022b4f3c946e0d4437119374a91a8e163b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamT5EncoderModelSelect\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"f71ea780bf0fdff9f0ebc6e9e4ac28900b34a32f74293c728b8b0ecf93a94bea"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamCLIPEmbedModelSelect\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"3be5d8ac8f207f76b7a07fa13f3d1a74ff542b98f739993f9b6eadccc91b6d2b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamFlux2KleinModelSelect\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"c59f2920d74815e5547105772e6453f5a1362082e3c3a5f7b316e50024f13ab7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamFlux2DevModelSelect\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"025f40fe9795c7d28d4aa35573761e43b96f2ec18bef549db571add5422a6871"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamCLIPLEmbedModelSelect\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"9893ce8b644470428ae534d54d411b8782d88d7f41db658894469a664e226d17"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamCLIPGEmbedModelSelect\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"eed95005f275e0ac044b2b1b4236650f5954d821cd699bc021d59186d9f0b320"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamZImageQwen3VaeModelSelect\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"e06a0262203093ba5a2d2116293bdcc0d80ffe4f31ce5b7f97f61dea31dd7dbb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamQwenImageComponentSourceSelect\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c56f7ba247373e8a1ba07d5cd3479f3d2ebc569091b90a170ef0ff0e7c2e77d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamQwenImageQuantization\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e1902fa1f9697489d5969aec170a0c97ac7ef20e4d4e1b60cb0cba00a18be5f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamAnimaModelSelect\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f372b6681923b4151bdb602287ab9b27680a10a037d967f06e6794162244e82"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamErnieImagePromptEnhancer\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"630f4e755d412edb17cf31428e1f90e2ca084eb876db8fb1b541c6763cd47e6d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamKrea2ModelSelects\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"35fd05db2e4957c0d3b04563fa2f9dafad115ba4f618f3d04e462baee4a63437"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamWanModelSelects\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"83fb95d0a7eb2d190a203c981a678dd660b742834aff4b451e0c1a610ff04956"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamMiniMaxH3ModelSelects\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"db6845b9d18a9d35f04b1744d62fa7cee7da882004d415b1864c983f57aa8c88"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamIdeogram4Steps\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"1601163a889fac74642b0d091a79c7c3f23513081d30953ca9876503394cddd1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamIdeogram4GuidanceScale\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cfa9ffaa1f9c53e2b1b6e33c894f4913b8f342d27a2f96eae0cf54b74e31e0d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamIdeogram4Mu\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"65abf20c7570e676d894205d2bd4e237b6cc013e1a536f641800d787c4bb970b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060AdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamIdeogram4ColorPalette\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"336b2c11a5372f10c1ee77d74140358af3bd158ce4adb6165f78828bfadf33da"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060UpscaleTabAdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectVAEKey\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbb9ece370b74f9136a27705d077b63e72e8dcde32614fbbeadf6b44a77deb63"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060UpscaleTabAdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsFLUX\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc520c3c6fe03faa6c88d5bb5575914ed8179d21a82e129fdd36229e23f8953a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060UpscaleTabAdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsSD3\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"18c6eddec31009e13fb65999957ca9526d2822d655302a96d94d83bfd03c6d12"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060UpscaleTabAdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a10f67d8d94a0b50330116bf1654ecf895f2feeca2215af16a46c3acce995aa"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleTabAdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamFLUXVAEModelSelect\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"760aa7127f7e73a3bf5c1d59f83c7336b0f870e5e951f502c1df0acf7b8e142e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleTabAdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamVAEModelSelect\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"33dd34935c702774146b2dae9d86633f5021452d000c0967f5ca2977797e14f0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleTabAdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamVAEPrecision\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"01d0de1a29be400c45604005ccdbe701480d25e649e07fff6fe6a4faf54b088d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleTabAdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamSeed\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9227b7a2b5e43b1442baeab2b591b669e26b566ef418dd8685abccc2df38ede"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleTabAdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamTileControlNetModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"d71a8d57e086b119bbf251a880e46997b95611f3127df60ed905aa74e62ca292"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleTabAdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamTileSize\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"a69f052014f80a2aafc3a9d9ad7e926d3527546853ba8850b35ca1a71f92b4b6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleTabAdvancedSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamTileOverlap\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a7a73582510da91998de62407a68377f411455561c464bc5c4a9e6839f309c5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060CompositingSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamCanvasCoherenceMode\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9d67d51359358f831960f20cf80859d3c2b92df551ed17bee5d377308361c73"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060CompositingSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamCanvasCoherenceEdgeSize\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"68bcf25fa89c34970167899ab35d81ec636d3fe61413912055d163267ce22585"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060CompositingSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamCanvasCoherenceMinDenoise\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"dca78859b2477124b17aea726928c8e05d1dd580ed5e69a8c523cedbc075f39f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060CompositingSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamMaskBlur\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"65a419edcb13cc234ec94bcdd22bf91a93b076d2e7ee156a0194f8f3c1f1371f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060CompositingSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamInfillMethod\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"54529a90602154785a411b03395742ff9284f157b76d04c272e0c8811e48eab9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060CompositingSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamInfillOptions\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a6a61bb2dd6b8fc3481eae18a377b17899fcd34f225bfae9557255a20fae2d0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060ExternalSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsExternal\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"b04b677972c7865dfa773d92426bd8b0e237b1bea262489bc6971c035bc2f2b7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060ExternalSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectExternalProviderId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4a9093038b21ec96d50c07d921ad5d740ce0b3cfe8549e2ed0f47cb57e11a76"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060ExternalSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ExternalModelResolutionSelect\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"3278e40506626c111c8cf770588f88a264feba6307c9a669ee97c382ea2c8b46"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060ExternalSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ExternalModelImageSizeSelect\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"f91eed343d00609b9d538f5e0154cef2fb164a6ad3b80d933a943a5d766d9f83"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060ExternalSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060OpenAIProviderOptions\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"d67efbc5f5b7e7a3957f02f49d672518a89caf42b687e21a2b3ba2486b2596db"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060ExternalSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060GeminiProviderOptions\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca4ca9260b60a8e9ff9f2cfe625f2d647d97a677b6bf82f62849a98076a8e76b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060ExternalSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060SeedreamProviderOptions\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c79e46ce38f2a75b4fb28bf1846921bc25b6295153950eab270ac6f0663f319"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectBase\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0b82eb2aab44e842a4f9ba9565038510561fec6dd8403fe1b0c1c2a3927272b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsFLUX\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"a28f6329242943ff133601eb138e91863b612eb1a75ac659e902f2c4cdaebd63"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsFlux2\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a6cb4d3015b1e79ca460d6973e443fb8866f7c40e93ff9acd5c9263cb0288b3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsFlux2Dev\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c8f9881d0334212213d8f2e6ff32c141475a74a9e54a0c3b99279a02176de93"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsZImage\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd0a6c99ec4237510b2e6649e11710cd922426a30ddd7eb2cef90ec9ae8e953e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsErnieImage\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"79f6936a034ec0aa6189d7047f6fe5122d98b0131161d1ead4e4874a8b8149f8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsIdeogram4\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"e81476b60a4ddd33e8cc520bd1ad65c33097e527b78c06b2b49290bf8d907701"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsExternal\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"503724de4eda1e7dbb07f6d9543afd0d38b7bf3384bcf08f4be1980590119fb0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsQwenImage\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff6dcb13049da3a1b000eaef2373cc4108350a3a8378d4093e97a10882c42fbd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsKrea2\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"c93c7154d5280767ded4ded33b2c9ef2a2d0db5cdb8581bd7ce452fdd03025b2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsAnima\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a32d1a408f80cf24674f095eed43f931c74b9dd3bab2552bc8c0dc8ad5e3520"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsWan\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"144c6a303df3e66b7f02072cca65454ac4337c2b045fba8ee652172e48daec20"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsMiniMaxH3\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f43fb6237a61b48ac04b0cded8b6945206cbdff71d1ec227f10cc812adb295e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectFluxDypePreset\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"06a24260c8ceec7f30757e2cda033d8890b6cc4a1e222e10fc7a87835e37b1db"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectModelSupportsGuidance\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"10d147c4f2b2f2f0671f2fbf0edf876b738f18ab5982f850cfb4d84aa64df2bd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectModelSupportsSteps\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"f04a5e6dcdd425482f3f3be7729e91444c79a5c587a38cc2d09843e33b1aca7b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060getIsPidSupportedBase\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"2070b452fb33ca8058029352ba74a675e3f305b2106c074868e2876b81f4d125"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectLoRAsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"9171732a9fd1bf0318df50f58ba77f9be93053c5a0aa3ccb9737432fe2405ef7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 lora: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060LoRASelect\u0060 from slice \u0027lora\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"0575eac1489fcb98c20128003307fa70b8b4bd1371de803abc46d8a84e71cc4f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 lora: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060LoRAList\u0060 from slice \u0027lora\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"c807f328dedf97ca1839dcac101862a8e6fcee31f7e44415e5d67ca3c9555495"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"b468eba4c3affa09428790ff2e5a2feeb720c9f2cfe222e307b626b246076df7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamFluxScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"ace15792d4ed84f59b4df38699ebde44c51a9c56ad01cd4ef9ab8bbe413d050e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamZImageScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"089f65d09ace80115489c27e4a4332576485fa9f3770a646e173831c48b17bbf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamErnieImageScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c468d385dabffb299aebea9d7331e917b2a76e5cb0c18f341e253ebc77d85ee"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamIdeogram4SamplerPreset\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"acf5e905554cf7f2f9bf0a3114d511c9c691f3fc97f0d1090729e1f10b16bb5c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamAnimaScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"31406df5528b4457221352743d5893a0d5f5a07ec59b0c14c93748764d2a06a4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamSteps\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb6473123c5bb6588fc8635881482253439c8010828990517525f06c0f97fc12"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamGuidance\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"76a69e6d298225f17a736284eb184b6dc8b01e3bf4a18398cbef222795117c5a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamCFGScale\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"8383bed40383ab9338e20fe546e235c2d434a06844a9b29033062b8166af862c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamWanGuidanceScaleLowNoise\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aa448cab54cb6f7e73721bf2ca607e944314edb39f1a8bff60cd010fc42dcb6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamMiniMaxH3OutputMode\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"15e91f6ef752b2972cad63aea38f4f4839c9641c1d524444ae6a7bd4930a3327"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamMiniMaxH3Duration\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a6f228c0e6fcd45e6e9b1c7e593692358319e41ebd99134f0c163dcbc9c1faa"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamZImageShift\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"87cf4220f50d502a28afbad8803d95750040ce1da077c6f3ddaeae738fd50f56"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamQwenImageShift\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"d663a4afeb6ce91b75153f4c57adb3d4397fbf0ef5e28241d3884e652e06adb0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamFluxDypePreset\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ae946ca0a4878eee7692fd6e20ad83108fd767c18e308737a7a9e6b5488684d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamFluxDypeScale\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcfa6c34842606fe9ec682ee29f2156f58f9985b3c544a672ee12e1cbce808cf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamFluxDypeExponent\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"337a78589fb64b6f9d8e1cce977c778476f469e1930c92b7f88e3d936d365191"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060PidSettings\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"2348c44de06af78e3ba3a0a016ad50302cecd524d6eabafd061ae42f754bedec"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamZImageSeedVarianceSettings\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"40a232eba480960cf9459c7b755c11ad42a3602f48fab8999e9e103b825fc0ba"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamKrea2EnhancersSettings\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"90d4d23a9bbd21d926dd0834849f10d91fa0a69ce98d55969eca8b91ba101471"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 ui: \u0060MainModelPicker\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"6482acd2da99f559e44905b53b80e7143afb193fa4007d900ae3deb9d242e13b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060MainModelPicker\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060modelSelected\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"82b87b197e7c7961bf205471296093beaa07a760bf92a7c2c6454dd07f13d4be"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060MainModelPicker\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060isExternalModelUnsupportedForTab\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6d244d0afd6fab1250db66db0493730d68aa90b05b0f840c37707cdb4e7a446"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060MainModelPicker\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ModelPicker\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"b391fa34ca9af679f4a09ef45eeb8926115597a60db75f84243743e1c2d9d0fa"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060MainModelPicker\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060UseDefaultSettingsButton\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ec5ef62a55bf026387fad91a135377452ef9d9154eb473cf341ae82581d65d4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060UpscaleTabGenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsFLUX\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a220dea7f37cb6da89b0ed8993bce9fc9f835190f937648b0b3cea8443183a0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060UpscaleTabGenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectLoRAsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"82d68fa705e77ca86a725fe4467257f56c93a3584ea9ec9e3d53f49aedb14c46"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 lora: \u0060UpscaleTabGenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060LoRASelect\u0060 from slice \u0027lora\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"56413ecf18e8d2299a9e866d3c61068fc97c57202d3e338686c685e3465598ab"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 lora: \u0060UpscaleTabGenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060LoRAList\u0060 from slice \u0027lora\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"857c8756fa21478ad5187de28cfcc5e829d5cd224ebc2bd9947b13fbfd29554e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleTabGenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamUpscaleScheduler\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c246167481730d2b231fc4e0748dce6d493f7e02cc3faecd04dd7efb1188656"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleTabGenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamSteps\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"dab9018a2d8c2eb36db74937323d8e9cc7cd61d04008ac1f5c229d04fb1706ea"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleTabGenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamGuidance\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f7865c40ca3a21efa2f682b3486335f4ce2e3d9c8a34c173e487bf5098385a7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleTabGenerationSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamUpscaleCFGScale\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a601b5ac66f62c99ab2d6424b0ead8e623b43351e11e3004c271d2b7b2ce039"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 nodes: \u0060BASES_WITHOUT_STANDARD_SCHEDULER\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060BaseModelType\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/generationSettingsVisibility.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"2367b734478c9c8edf2a410b13475a2f323cd881d1db1c7112b0314cd25dd420"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060selectBadges\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectBbox\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbe2d2971e343db774b175001fbac22b061034ea4dc0f03fea749a46df047d27"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060selectBadges\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectShouldRandomizeSeed\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"01ee4c06a80c1f61b5268e098688e3a3ec8eb80f37e0bd5b5106968474c9cbb1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060selectBadges\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectModelSupportsSeed\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"830cbe71e27ed53273829590f0ba0acd6e81a1fb968153357db2217298f5d252"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060CanvasTabImageSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectScaleMethod\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"158efbc64b59d115404c90f80cc032fe7377457fb6e7bcaf4266a8724e75c024"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060CanvasTabImageSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectModelSupportsDimensions\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"57ac1344790d1250baef44a4b062dd33de24cae2c15907008afed16db41a1690"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060CanvasTabImageSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectModelSupportsOptimizedDenoising\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b5022d71b6b7ffa2c19f9ae97e070e5a473f01448730f175e7c65df0571988e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060CanvasTabImageSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060BboxSettings\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"868154b8d24d01de53d655c229039919502603c8861243b9037ce26796a0e539"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060CanvasTabImageSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamSeed\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab0547093bdef6978a36ba7843b90ec1128a784b0c98a73ca92fa15fd3a1ec7a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060CanvasTabImageSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamOptimizedDenoisingToggle\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"aada8d29bb997cdef84bcddeccee648f27a084fbcd18ee883624808f4d704261"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060CanvasTabImageSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060BboxScaleMethod\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"65ebc8e099669d1de38c92216fece911426a8df5d3ee9c0269737f4b66af0f15"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060CanvasTabImageSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060BboxScaledWidth\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b8b452e894d412a0c841bef8056f8143cdc78f752351f648c50efc88b201cfb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060CanvasTabImageSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060BboxScaledHeight\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"543338036f901075a2e314616727ac70ef8ed4d3042ed37ca70b886deb18641a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060selectBadges\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectWidth\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"2952e6707c6cff5436e87e7d140680ebd92074020bf75481003594c51a915136"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060selectBadges\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectHeight\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2b3c809c947a826665c4ff2d730e8cc141d97a153db506fc7b181b38e59625a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060selectBadges\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectAspectRatioID\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"89fcb76ffd24361668917e90dca2dcc6d33982ddd2f39030e4ed748c06a3c3fb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060selectBadges\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectAspectRatioIsLocked\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3c00a760510eb519bdfd67679899a50c498edcc7d1ab58dca2740b85d3c69d3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060selectBadges\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectShouldRandomizeSeed\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"502d7e6dc71e67e81464272fff39cd195bc8a115d9cef4c1d4d8198f30bf0106"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060selectBadges\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectModelSupportsSeed\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc880335f032be13db88153daeada131250757a0fae4825cd143deaad4a0f9e9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060GenerateTabImageSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectModelSupportsDimensions\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"9aac6ccde54e8836d4b334ea6f42a8081e6e99e1ddb0ab61a32ef421c8c28aad"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerateTabImageSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060Dimensions\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"c14b53b2e53d95f6df4d11a300374f0908433f7a9747f5c38acd68f6c6ab27fb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060GenerateTabImageSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamSeed\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"b00a31647a154b9b76949aee7a9155460fbf80583856e0173325232c4b030292"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060selectBadges\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectParamsSlice\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"0311b0c8a90deb2fedb8fa8053a85de8ae1bb7bcd210f63ed6bcc658963d433d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060RefinerSettingsAccordionContent\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectIsRefinerModelSelected\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ab1b16ec0b1205b9208718c7e5fe8401be3de1c2fb09bc01fcf2a9346e41159"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 sdxl: \u0060RefinerSettingsAccordionContent\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamSDXLRefinerModelSelect\u0060 from slice \u0027sdxl\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"15f1129e1601a8e42acd9808fade18a4242a7f124d215bf8da83106b92ddc027"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 sdxl: \u0060RefinerSettingsAccordionContent\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamSDXLRefinerScheduler\u0060 from slice \u0027sdxl\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"731dda8fdb485cba39d871d6fe44a231139def0b239ab2de14343299a695fa3e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 sdxl: \u0060RefinerSettingsAccordionContent\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamSDXLRefinerSteps\u0060 from slice \u0027sdxl\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"135ebe1841fbc090b5ac1c02d00abb9b5256b997bfea4cca974343f0e0e65c90"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 sdxl: \u0060RefinerSettingsAccordionContent\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamSDXLRefinerCFGScale\u0060 from slice \u0027sdxl\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3d45527be6a84f6599601cf368723a86f9c477a5b4481a1e64c4de8849a4262"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 sdxl: \u0060RefinerSettingsAccordionContent\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamSDXLRefinerStart\u0060 from slice \u0027sdxl\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"7edc9f212847118a1af18d96d8be6f481ad6f3a699bd221b70cc084c22730acf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 sdxl: \u0060RefinerSettingsAccordionContent\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamSDXLRefinerPositiveAestheticScore\u0060 from slice \u0027sdxl\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f8f9112e1178979f1b79f92610781b6f08ad9f3a01d89ac1ccf6074e0b0fd02"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 sdxl: \u0060RefinerSettingsAccordionContent\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamSDXLRefinerNegativeAestheticScore\u0060 from slice \u0027sdxl\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e650b81d31af1bd8ef7b667b2f71845dd34b735590ab46a7f5586af6ef249f2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleInitialImage\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectUpscaleInitialImage\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b9e73a5658223418b8c4b81e42e15c83bb32a319a37209a2b306e684b475cd3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 dnd: \u0060UpscaleInitialImage\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060SetUpscaleInitialImageDndTargetData\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"247a636f044577df74b5c51c9b9550d85602a92065399aaeb19929302638f6c2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 dnd: \u0060UpscaleInitialImage\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060setUpscaleInitialImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"98de3a325420c9f6af8ae632e77b5db7b4bfcfedf03612fb736f22178cab4f24"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleInitialImage\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060upscaleInitialImageChanged\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"54572e3ec4430e9fb159a38f28e71a1cc56ec6ff74aa993236492819c4e338e8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060UpscaleInitialImage\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060imageDTOToImageWithDims\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"50b0de27cd62ab6a0e3bec3b3005c33d1fa1d495b835fa6170f3b08738372f93"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 dnd: \u0060UpscaleInitialImage\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060DndImage\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a63cb9f186b7202af2983b21ea375e65fba3694ba862a4070be1b8a9a421561"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 dnd: \u0060UpscaleInitialImage\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060DndImageIcon\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"7519d578082ce585b02c4e8925171309a0a0c40a295ce8a54e2f9a7bb0e3effb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 dnd: \u0060UpscaleInitialImage\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"540ad58137979ef134c5ef69d62dd1c180afe345092cbeba12c13f901e7807cf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleScaleSlider\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectUpscaleScale\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleScaleSlider.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"f601b2af86b9be5c90b37290c30169d890996af019e4cf13dae8b9b85cfc6ae3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleScaleSlider\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060scaleChanged\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleScaleSlider.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3dcea20eca38ad238bdc7a34c0ebc3e95775eb14fc7435be494e846069836e5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060selector\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectUpscaleSlice\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce57d323ab5d19dad83e91414598f8f0e4a7cddd0a0ef9f318c58c58eacbbe2e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060selector\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060getGridSize\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d0486b3dbd2619cd4a31c7b4d89c6f5e7a21097ce35a1357eed7cbffd81f9c7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamSpandrelModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"8227512b7323fbcc4f22ad6718a0bd596b1b253f6222dd0e28ac4d8568e98629"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamCreativity\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"61836b606715ed256f6d495da0295e1236ecce806653caa178687ecc30ca297c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleSettingsAccordion\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060ParamStructure\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc5a30b99968ac913ee30e9b8ab0c0bdf7607177107f9a41fac21d4322b6233c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 controlLayers: \u0060UpscaleWarning\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectModel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfc6f89dd024c474733095b0cd053ee17c98211562f9f72512ce1b73367e0d03"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleWarning\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectUpscaleModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"224169a2a4d6f99ce66e2f3fe14feea7247b07574347055347cfd25daf7999d7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleWarning\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectTileControlNetModel\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"67820a75376e3abd19801380658ca2f954d2e5827aa35ab7ce3cb856e6a22d6f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 auth: \u0060UpscaleWarning\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060useIsAdmin\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"cee7498bb38ac554e60b56ce9654ee164dad3f3157f62f864d04c825d2a9af85"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 parameters: \u0060UpscaleWarning\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060tileControlnetModelChanged\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"961842fd3ddae4594f28651765bb35205cbf7c3de11e58d59fafcc67c942fd12"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 ui: \u0060UpscaleWarning\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"206bff0693de007a1310f4764f6300ab626a7504d60bb51ea58aa7ac87ea8bd7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 modelManagerV2: \u0060UpscaleWarning\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060setInstallModelsTabByName\u0060 from slice \u0027modelManagerV2\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee8f3951983633cfd1799dbc7617e63ffaa403eb6ad43f23efcb01b831730d2c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 ui: \u0060useExpanderToggle\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectUiSlice\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/hooks/useExpanderToggle.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cebe9a79132adaed999acecae4efa009e6ae8ebc54b01bced7dae38e340818e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 ui: \u0060useExpanderToggle\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060expanderStateChanged\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/hooks/useExpanderToggle.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"a56fba35101b3e7811ee6ef207bc11c70dd5f2b1e1d6a4875ae70a2701650555"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 ui: \u0060useStandaloneAccordionToggle\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060selectUiSlice\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/hooks/useStandaloneAccordionToggle.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ca847edd2fce89522081f10026c61a11ca3ed0823139ee0cc5906667f0812c2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: settingsAccordions \u2192 ui: \u0060useStandaloneAccordionToggle\u0060 (slice \u0027settingsAccordions\u0027) depends on \u0060accordionStateChanged\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/hooks/useStandaloneAccordionToggle.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"f435db5dc7057a6e719a0b7d7324eea7c455490f0283a3b4779ea1703384a08e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: stylePresets \u2192 controlLayers: \u0060ActiveStylePreset\u0060 (slice \u0027stylePresets\u0027) depends on \u0060positivePromptChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/ActiveStylePreset.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4e3c6ed0a1be4e03e3708f91fb795bfd86e5f68982944c5b65d021188cf378d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: stylePresets \u2192 controlLayers: \u0060ActiveStylePreset\u0060 (slice \u0027stylePresets\u0027) depends on \u0060negativePromptChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/ActiveStylePreset.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"14baada826ade5f38e517632c8741f81e11382faddd43225d5b72bd4bc5c75e4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: stylePresets \u2192 toast: \u0060DeleteStylePresetDialog\u0060 (slice \u0027stylePresets\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/DeleteStylePresetDialog.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"71708deed61f4e3aa030149f778b2e832502aaa498b2fc82509e61f02898222b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: stylePresets \u2192 toast: \u0060StylePresetExportButton\u0060 (slice \u0027stylePresets\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetExportButton.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"203e31daaa515141216efe95fa841d38222125cfc7bdd38bfbcf81889855e9f8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: stylePresets \u2192 toast: \u0060StylePresetForm\u0060 (slice \u0027stylePresets\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetForm/StylePresetForm.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"9843eed65abf640785c2be836c6f320336fa3c31bc90ce30a25642c7acea6a4d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: stylePresets \u2192 toast: \u0060StylePresetImportButton\u0060 (slice \u0027stylePresets\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetImportButton.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"e264d9d264cc91597d707fae2412af9524e5e39042421e19f0916f59ce2f8a81"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: stylePresets \u2192 controlLayers: \u0060usePresetModifiedPrompts\u0060 (slice \u0027stylePresets\u0027) depends on \u0060selectPositivePrompt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/hooks/usePresetModifiedPrompts.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb2588a1202f919d0c7590a77319db84b2831311460a9c5c6bb7d7dae06d5033"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: stylePresets \u2192 controlLayers: \u0060usePresetModifiedPrompts\u0060 (slice \u0027stylePresets\u0027) depends on \u0060selectNegativePromptWithFallback\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/hooks/usePresetModifiedPrompts.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"47f2f30a169249a23a07aaef3941baf5387db52bd7214723424d85ae41e16af0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: stylePresets \u2192 controlLayers: \u0060slice\u0060 (slice \u0027stylePresets\u0027) depends on \u0060paramsReset\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/store/stylePresetSlice.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"442a81d5ac84a8feb96e02685471f97041be17a7b4a1501b3cfed6f6ad6120f9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 auth: \u0060AboutModal\u0060 (slice \u0027system\u0027) depends on \u0060useIsAdmin\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/AboutModal/AboutModal.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"268e5e5a3888a22c2b199dd751bffe12455e5ec0466677cb3c05553d634c8a1f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 gallery: \u0060AboutModal\u0060 (slice \u0027system\u0027) depends on \u0060DataViewer\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/AboutModal/AboutModal.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"c30a0399271b78aec60cd72a7baa8811dc6b742bc5e5dce29a471d20fc94e533"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 controlLayers: \u0060useRegisteredHotkeys\u0060 (slice \u0027system\u0027) depends on \u0060useIsUncommittedCanvasTextSessionActive\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0b0c12bc1cfc1e82bd6c256e6671252b8a15a7dc47a772dcd92d0a22fa322d7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 ui: \u0060useSharedInfoHotkeyTarget\u0060 (slice \u0027system\u0027) depends on \u0060selectActiveTab\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useSharedInfoHotkeyTarget.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3250192ec31bc7bded2784363bff5e65c6bff5e5d419a6f6dbb21532e81f151"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 gallery: \u0060useSharedInfoHotkeyTarget\u0060 (slice \u0027system\u0027) depends on \u0060selectHasMetadataViewerItem\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useSharedInfoHotkeyTarget.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"937099fb962373076e712092989056fa699f75a0d620130136ef5a8fc9d0a0a2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 ui: \u0060useSharedInfoHotkeyTarget\u0060 (slice \u0027system\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useSharedInfoHotkeyTarget.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c6f1bcc7605cc4daeb6d66501cc5aa3ef57d2d5ada2982194dc6b22340e2c37"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 ui: \u0060useSharedInfoHotkeyTarget\u0060 (slice \u0027system\u0027) depends on \u0060VIEWER_PANEL_ID\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useSharedInfoHotkeyTarget.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"78f271d8b78371f9bafd6620b1820927e3638761e80c9a317d15353158b31efd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 queue: \u0060ProgressBar\u0060 (slice \u0027system\u0027) depends on \u0060getUserScopedQueueCounts\u0060 from slice \u0027queue\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/ProgressBar.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d6f13d14af9b24c1cabb30e7b17594c5545c2b954979439866332f78646485e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 auth: \u0060SettingsGenerationDevices\u0060 (slice \u0027system\u0027) depends on \u0060selectCurrentUser\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsGenerationDevices.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"6686df631119c1c8c02a62c526b6bc4573bfa16bde281776fead3d6725a0b7c7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 toast: \u0060SettingsGenerationDevices\u0060 (slice \u0027system\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsGenerationDevices.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"4778c714c5d5c190b607eb0f8e925a3740ce746cc6d51d9a98a5adbb113dcf00"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 auth: \u0060SettingsImageStorageMaintenance\u0060 (slice \u0027system\u0027) depends on \u0060useIsAdmin\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageStorageMaintenance.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"11f2c98dc85dec6cb0b739e9ecb0dd1e884c9d77bb9c512b0f76f4d96c95eb76"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 toast: \u0060SettingsImageStorageMaintenance\u0060 (slice \u0027system\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageStorageMaintenance.tsx"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd4af80e88c131a11adcebd30d890d9796868ef5a04e03a22c5bba5f261d01dc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 auth: \u0060SettingsImageSubfolderStrategySelect\u0060 (slice \u0027system\u0027) depends on \u0060useIsAdmin\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageSubfolderStrategySelect.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c75bab87930839a7122124f5e932dff04c5af7019afab253de6f9c752124f5e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 toast: \u0060SettingsImageSubfolderStrategySelect\u0060 (slice \u0027system\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageSubfolderStrategySelect.tsx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"0daec22c5e5f4460e50a993662c66505c933d132c1a371afc9eca36d652cf3c0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 auth: \u0060SettingsModal\u0060 (slice \u0027system\u0027) depends on \u0060useIsAdmin\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"c47518f6bd6676cf6e0dce67074cdc6b764b5ea7b97a8d719b56b15fce145bcd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 controlLayers: \u0060SettingsModal\u0060 (slice \u0027system\u0027) depends on \u0060selectShouldUseCPUNoise\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"47a9149cfff58411a92b3362c7f074c296d3c9be4139ff4e1b0877f80037c4e6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 ui: \u0060SettingsModal\u0060 (slice \u0027system\u0027) depends on \u0060selectShouldShowProgressInViewer\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4b169178d96efece776ce02f372e5c3fc45add9d9a22d41fee798a3f30618bb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 toast: \u0060SettingsModal\u0060 (slice \u0027system\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"91bf8dc6e492037aa7c6cd23462fdd825a4dce5f5a6189eb7bb25aa33e30b4ea"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 ui: \u0060SettingsModal\u0060 (slice \u0027system\u0027) depends on \u0060setShouldShowProgressInViewer\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"b941ecced8ec1bb234632436bbbb4125aacee6dd3926a8bdc465592f9a7ac684"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 controlLayers: \u0060SettingsModal\u0060 (slice \u0027system\u0027) depends on \u0060shouldUseCpuNoiseChanged\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5d438218a8e5fd31660999eac4f60b452388b84001f9ef17f258b153c6c77f6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: system \u2192 toast: \u0060useClearIntermediates\u0060 (slice \u0027system\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/useClearIntermediates.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dcbbc62299b3b0bcd657a90943ecba976f1a09bbe547a1c4ceb286d7e7c23c0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: systemPrompts \u2192 toast: \u0060DeleteSystemPromptDialog\u0060 (slice \u0027systemPrompts\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/systemPrompts/components/DeleteSystemPromptDialog.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d9fd8076dbcf55f9e4969081f84d1dc16d43384da0f977ef8447fe4d38f50ba"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: systemPrompts \u2192 toast: \u0060SystemPromptForm\u0060 (slice \u0027systemPrompts\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/systemPrompts/components/SystemPromptForm.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a0f5e2bf091e07fa421b148146d537b06aac6566be7f285d4c3f02e23556d98"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: systemPrompts \u2192 auth: \u0060useCanEditSystemPrompt\u0060 (slice \u0027systemPrompts\u0027) depends on \u0060selectCurrentUser\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/systemPrompts/hooks/useCanEditSystemPrompt.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"866874781a50c8b3bfb37b1536a811b7113b027a16ce489e507dd7295ce1e649"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: toast \u2192 gallery: \u0060ErrorToastDescription\u0060 (slice \u0027toast\u0027) depends on \u0060ExternalLink\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/toast/ErrorToastDescription.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad1addfa832a83c7b96bfde2e3fd297005419e288e2984d463a569bbc1cabb33"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: toast \u2192 controlLayers: \u0060toast\u0060 (slice \u0027toast\u0027) depends on \u0060nanoid\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/toast/toast.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3c0787d82643992ac5ed4f68c8e73b959fc7910c8f93af8221567718c4848ef"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 customNodes: \u0060TabContent\u0060 (slice \u0027ui\u0027) depends on \u0060useIsCustomNodesEnabled\u0060 from slice \u0027customNodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/AppContent.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"69edd450668c9565e9800e5941adc92c9ebebdde4a68e87f416c542cb8aff0b2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060FloatingCanvasLeftPanelButtons\u0060 (slice \u0027ui\u0027) depends on \u0060CanvasManagerProviderGate\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bbd96e794c083563cce58c8d4928e47239adc64dbe6b2fe3067962a7263c568"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060FloatingCanvasLeftPanelButtons\u0060 (slice \u0027ui\u0027) depends on \u0060ToolChooser\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"5383a1599a6e8b02e3e2d8f2b8ee4803206e8eff9e34f01da243bbb16f9e3cd6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 queue: \u0060InvokeIconButton\u0060 (slice \u0027ui\u0027) depends on \u0060useInvoke\u0060 from slice \u0027queue\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"953de318ed8289da1b3fa8f72a459584e70af711170f8682e8cac67f8d1bf1cb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 queue: \u0060InvokeIconButton\u0060 (slice \u0027ui\u0027) depends on \u0060InvokeButtonTooltip\u0060 from slice \u0027queue\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"7aff02068209d396ece452f3b34ac8bf55a4923eb7db95bd00f025bf735865d7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 queue: \u0060InvokeIconButton\u0060 (slice \u0027ui\u0027) depends on \u0060InvokeButtonIcon\u0060 from slice \u0027queue\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4df748e521d34a5850c552c49da2f7fdb65022234ddf1078a10f19ba7cbdf0f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 queue: \u0060DeleteCurrentIconButton\u0060 (slice \u0027ui\u0027) depends on \u0060useDeleteCurrentQueueItem\u0060 from slice \u0027queue\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b933c8314b5b4f37b95829f0b5fb4b7d207cedebedce298d71c383dcbe29690"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 queue: \u0060DeleteAllExceptCurrentIconButton\u0060 (slice \u0027ui\u0027) depends on \u0060useDeleteAllExceptCurrentQueueItemDialog\u0060 from slice \u0027queue\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9c04396d1a535d810addc5d77619480ec7dce119bcc900a2dd8ae3acfbabd16"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060ParametersPanelCanvas\u0060 (slice \u0027ui\u0027) depends on \u0060selectIsSDXL\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"eae3885c16d89dacfe5c294cb2c7519060f3bd7c6d3a23b7a9bdaceb8d3d5d64"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060ParametersPanelCanvas\u0060 (slice \u0027ui\u0027) depends on \u0060selectIsCogView4\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"230497b8eecbfb3c283e52e6fecdd2fa1b0508a3f545560d35e22f71566dc47b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060ParametersPanelCanvas\u0060 (slice \u0027ui\u0027) depends on \u0060selectIsExternal\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f91fb9aa16943d9199671ecbaa89570fd85a5deab225cba50ab872c224cec2e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 stylePresets: \u0060ParametersPanelCanvas\u0060 (slice \u0027ui\u0027) depends on \u0060$isStylePresetsMenuOpen\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2086ea134d0dd824f1b7cb614674cf82c9741bd3036c7430ea8cbd1885cab8d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 stylePresets: \u0060ParametersPanelCanvas\u0060 (slice \u0027ui\u0027) depends on \u0060StylePresetMenuTrigger\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f5599735b5297d65c809ed0be53e4c633eecd048d1e1fb2bfe6cd04ab47ec7d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 stylePresets: \u0060ParametersPanelCanvas\u0060 (slice \u0027ui\u0027) depends on \u0060StylePresetMenu\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad47f88c9095d9b4fb327336d16937054bc35591d4d4c2600d52f8d9bb7f387b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 parameters: \u0060ParametersPanelCanvas\u0060 (slice \u0027ui\u0027) depends on \u0060Prompts\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d38a92e6233f060d84abba3a1d48c4a6a0918627b3ba31b01d894623dab67fb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 settingsAccordions: \u0060ParametersPanelCanvas\u0060 (slice \u0027ui\u0027) depends on \u0060CanvasTabImageSettingsAccordion\u0060 from slice \u0027settingsAccordions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"b26867edf8b097583b482ad5d6aa8fe281cb48e9424b11749f7c76073f92d140"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 settingsAccordions: \u0060ParametersPanelCanvas\u0060 (slice \u0027ui\u0027) depends on \u0060GenerationSettingsAccordion\u0060 from slice \u0027settingsAccordions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"480b7069352ad11844dfcbdde768b29a8a7d0f4c7eac3cea68980bd0429f1de2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 settingsAccordions: \u0060ParametersPanelCanvas\u0060 (slice \u0027ui\u0027) depends on \u0060CompositingSettingsAccordion\u0060 from slice \u0027settingsAccordions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaf7cd6d51d092e912ef13d263df8478178e22531d61f527cad0c7d85b5417a5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 settingsAccordions: \u0060ParametersPanelCanvas\u0060 (slice \u0027ui\u0027) depends on \u0060RefinerSettingsAccordion\u0060 from slice \u0027settingsAccordions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"b28ed96cff1e6ee1e712dbe1040031ba3efbaaf59204eae59739cd4c734713e3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 settingsAccordions: \u0060ParametersPanelCanvas\u0060 (slice \u0027ui\u0027) depends on \u0060AdvancedSettingsAccordion\u0060 from slice \u0027settingsAccordions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"af0e221cb93afd14601e0229a5113d371ce42a47de50a690f1eedb4f7b0f82b8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 settingsAccordions: \u0060ParametersPanelCanvas\u0060 (slice \u0027ui\u0027) depends on \u0060ExternalSettingsAccordion\u0060 from slice \u0027settingsAccordions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"2584a751440e31f7010fd6ac4f3c6f46bc0c416e4e19b9afe326ae42414eb471"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060ParametersPanelGenerate\u0060 (slice \u0027ui\u0027) depends on \u0060selectIsSDXL\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"caeb6644381fff0730147f54d07eaae905dcd770c54c8a9eab014d86a9d95ca9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060ParametersPanelGenerate\u0060 (slice \u0027ui\u0027) depends on \u0060selectIsCogView4\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f622e199f55a99cf3cedb057b099c44c04df765cca4d5ca1a20db0ae1994b69"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060ParametersPanelGenerate\u0060 (slice \u0027ui\u0027) depends on \u0060selectIsExternal\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9a5c278b73ac42498b39bd5f997610d1d74adc8e13c65ff2b83c0cc9945df72"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 stylePresets: \u0060ParametersPanelGenerate\u0060 (slice \u0027ui\u0027) depends on \u0060$isStylePresetsMenuOpen\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"af4cbda934ca52e415a0b7aa652c5ee4d1ef90690ca042de5fed4f784e513527"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 stylePresets: \u0060ParametersPanelGenerate\u0060 (slice \u0027ui\u0027) depends on \u0060StylePresetMenuTrigger\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"21b7e82425ffb2ec0da4dfcac6a659a857db64cf135edc34a320140cfd75a5c1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 stylePresets: \u0060ParametersPanelGenerate\u0060 (slice \u0027ui\u0027) depends on \u0060StylePresetMenu\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"26fea0b955400843be0eea191c4f4b9660867d0893e9457c865d4ec6edb40373"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 parameters: \u0060ParametersPanelGenerate\u0060 (slice \u0027ui\u0027) depends on \u0060Prompts\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"97f66a82c2ed4fe536fb84f548d2927c641a9b7cd5c51353e6e28dcf5bc3b29c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 settingsAccordions: \u0060ParametersPanelGenerate\u0060 (slice \u0027ui\u0027) depends on \u0060GenerateTabImageSettingsAccordion\u0060 from slice \u0027settingsAccordions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"aee97757aa6b5db43cceddc6ca2cae5e62c541fc9ef0c3a2fff1e2360f0604c1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 settingsAccordions: \u0060ParametersPanelGenerate\u0060 (slice \u0027ui\u0027) depends on \u0060GenerationSettingsAccordion\u0060 from slice \u0027settingsAccordions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b90e027068bb05058204b79f6e38c26a8d78ab7f0fe3d312da6d0c192452c6a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 settingsAccordions: \u0060ParametersPanelGenerate\u0060 (slice \u0027ui\u0027) depends on \u0060RefinerSettingsAccordion\u0060 from slice \u0027settingsAccordions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"68862a5ac0da854bf52dfbf0aa4a9dd73506fe6a963161b5a2762b303480fca2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 settingsAccordions: \u0060ParametersPanelGenerate\u0060 (slice \u0027ui\u0027) depends on \u0060AdvancedSettingsAccordion\u0060 from slice \u0027settingsAccordions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cbc5bebd86624a8eed1f1b0e8702564a29f30334bc8bf8bf7d0a58924b90a16"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 settingsAccordions: \u0060ParametersPanelGenerate\u0060 (slice \u0027ui\u0027) depends on \u0060ExternalSettingsAccordion\u0060 from slice \u0027settingsAccordions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"4305efb79ca429ebf8ce620ec68001375721a2826214eb5f2dcdfd9da2bf3012"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 stylePresets: \u0060ParametersPanelUpscale\u0060 (slice \u0027ui\u0027) depends on \u0060$isStylePresetsMenuOpen\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"923e07f322243199b5bd6e37259e6e6fd6ad1a1834ba2723d388c94448595c95"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 stylePresets: \u0060ParametersPanelUpscale\u0060 (slice \u0027ui\u0027) depends on \u0060StylePresetMenuTrigger\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"40dbbd6df03884932b2b3bb72e6e5e63b672f0afe338942f805d9ee507c8cc2a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 stylePresets: \u0060ParametersPanelUpscale\u0060 (slice \u0027ui\u0027) depends on \u0060StylePresetMenu\u0060 from slice \u0027stylePresets\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"a70a0f17eeb93138f2ace4a423332258da039e7aec9637371c5af0fe8a3bbd87"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 parameters: \u0060ParametersPanelUpscale\u0060 (slice \u0027ui\u0027) depends on \u0060UpscalePrompts\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"56807bf391da9cd68e316595974ab9dfd359587086627d4a916032394fcf2400"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 settingsAccordions: \u0060ParametersPanelUpscale\u0060 (slice \u0027ui\u0027) depends on \u0060UpscaleSettingsAccordion\u0060 from slice \u0027settingsAccordions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"8507ee8a2824f0801ba5e336a146f94bc4c6afb0f36ddbf4ffefeddc9a78edf8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 settingsAccordions: \u0060ParametersPanelUpscale\u0060 (slice \u0027ui\u0027) depends on \u0060UpscaleTabGenerationSettingsAccordion\u0060 from slice \u0027settingsAccordions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cbbb87d338e1039f90db2e82cf70aec2a86f786130bb36cc1f509e9bbd464e2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 settingsAccordions: \u0060ParametersPanelUpscale\u0060 (slice \u0027ui\u0027) depends on \u0060UpscaleTabAdvancedSettingsAccordion\u0060 from slice \u0027settingsAccordions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"f581b47f95d13bacb3d2d9b0c73fd60fbc433b42ef7490d662030d6d44b289e3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 customNodes: \u0060VerticalNavBar\u0060 (slice \u0027ui\u0027) depends on \u0060useIsCustomNodesEnabled\u0060 from slice \u0027customNodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"fee0123bb42acf6d369ee41158d814c6be87ad6da2cb29316677538b554ea20b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 system: \u0060VerticalNavBar\u0060 (slice \u0027ui\u0027) depends on \u0060InvokeAILogoComponent\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"445d5b0b9b6b463f4dee677a68d5823b39197abe3512c27347cb63a48cffb94b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 system: \u0060VerticalNavBar\u0060 (slice \u0027ui\u0027) depends on \u0060StatusIndicator\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce482faed6fa461fdefae0074def5be715cb48e696ea87fbad55cd27f3d245c9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 auth: \u0060VerticalNavBar\u0060 (slice \u0027ui\u0027) depends on \u0060UserMenu\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"c39fe3458be9a0269ae7d53a0e2aa9f945708d63fd87ec17890a41fa47ecab79"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 system: \u0060VerticalNavBar\u0060 (slice \u0027ui\u0027) depends on \u0060VideosModalButton\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8dababa41d00e2c87a3087e937a32bca54385af8f87846594d2f01fa2c46cd3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 system: \u0060VerticalNavBar\u0060 (slice \u0027ui\u0027) depends on \u0060SettingsMenu\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"c917160c02da2b7869de719be2ca581324606969d71482bff619cb0306057ce3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 customNodes: \u0060CustomNodesManagerTab\u0060 (slice \u0027ui\u0027) depends on \u0060CustomNodesList\u0060 from slice \u0027customNodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/tabs/CustomNodesManagerTab.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcd8303df96262583a9d56af8ae6cadf73075da03d1ea62e6ffa338cd737a015"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 customNodes: \u0060CustomNodesManagerTab\u0060 (slice \u0027ui\u0027) depends on \u0060CustomNodesInstallPane\u0060 from slice \u0027customNodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/tabs/CustomNodesManagerTab.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2d786bd57947fd7b5c1cd8b92dab2cefd822a0301f5926dfa05aff79209377a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 modelManagerV2: \u0060ModelManagerTab\u0060 (slice \u0027ui\u0027) depends on \u0060ModelManager\u0060 from slice \u0027modelManagerV2\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/tabs/ModelManagerTab.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"18bca4029571d5749749999178fb8f5b3273dd00e62398b072bf722428c14447"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 modelManagerV2: \u0060ModelManagerTab\u0060 (slice \u0027ui\u0027) depends on \u0060ModelPane\u0060 from slice \u0027modelManagerV2\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/tabs/ModelManagerTab.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"466453b33d84addb7330e6e25803d26992ae38e3be8b7bf21bc028b5549aa95b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 queue: \u0060QueueTab\u0060 (slice \u0027ui\u0027) depends on \u0060QueueTabContent\u0060 from slice \u0027queue\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/tabs/QueueTab.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"feed5ae351b6e3ef4f87a4c37ab3bae953370e99f62fa1d01be98d7815cbc049"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 system: \u0060AutoLayoutPanelContainer\u0060 (slice \u0027ui\u0027) depends on \u0060selectSystemShouldEnableHighlightFocusedRegions\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/AutoLayoutPanelContainer.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"51caf625be6e62d4e358be8420806bce317a8ff2b7fed3dcc6a987e9f540771f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 queue: \u0060CanvasTabLeftPanel\u0060 (slice \u0027ui\u0027) depends on \u0060QueueControls\u0060 from slice \u0027queue\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasTabLeftPanel.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"33e35f8f36306870ec20890c430e6c54974283dbf6a033c2fdae505084a86e6d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060MenuContent\u0060 (slice \u0027ui\u0027) depends on \u0060CanvasManagerProviderGate\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"237724af30d4211841f652c8e46729aa8956756aa6c71db366fec3730763063d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060MenuContent\u0060 (slice \u0027ui\u0027) depends on \u0060CanvasContextMenuSelectedEntityMenuItems\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"5803fce5daade995853fcde57e9e1d99832cbadb82c1d78515dff6f4203cf0e7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060MenuContent\u0060 (slice \u0027ui\u0027) depends on \u0060CanvasContextMenuGlobalMenuItems\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"80671c8a994c962fc970b573f4ef7f479054612257c94d013cb09d49bcb8c9c5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060selectDynamicGrid\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"74eadaa9541f612d34474b7ce73e8910efcd727bee304b75a71d3c177897f569"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060selectShowHUD\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c9bdc0c2c059db8230ce9d221e16cb5ed52f0211f89c10c3d80ba176e36e2fe"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060selectCanvasSessionId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"261194b6716200f2928dcd8f83be188a9b51a53bc65c9d8f4f16873e9638c482"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060StagingAreaContextProvider\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"e57fa272629cc2570a010b66b068633df8ddad35f8a2de9ee75b277c94bca2d0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060CanvasToolbar\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0955943091f7be6b497d3e8bbc68e9df17c83776d74a8a46b05584e73f38bfe"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060InvokeCanvasComponent\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"530a447f62d9a8b39ddfc5d12631c90daa91b562721c639312d3b7abc1c6aef4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060CanvasTextOverlay\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"558b111e9ecaac7834759f44f8a86b49a2d4d1e1da5446312e2ea68215f4c9e8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060PinnedFillColorPickerOverlay\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecfa8009820bbdaf3f2653a5dac21a007485e0a3284912907d5e5875efc9c022"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060CanvasHUD\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ce058ae84f88c8a9d73b4035d28e34777b2fad6cfb7e92dc1e993be259cc50b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060CanvasAlertsSaveAllImagesToGallery\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"49c56bacf252bb7c6641bf752d430411b0ee024413dddd76844ad04e8d5a685a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060CanvasAlertsSelectedEntityStatus\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"787f33378d6defc9e2558d2ed97f52db4c44c0bb66046887c99e66031a295488"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060CanvasAlertsTextSessionActive\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ba04ac8368e895a546f0ae524f66e41c127ce2eed5f53f9849e72871b182a81"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060CanvasAlertsPreserveMask\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"814567646cae6b6a1fcb85d9dc007c6f90b60edb83466ab9caab2171ae459c45"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060CanvasAlertsInvocationProgress\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"b94a88898667265266081a6ea24a2a434b822bd1a72417355379b4b81d2559a0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060CanvasAlertsBboxVisibility\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d59f295b5a0d0a862f53b74ff5d99e67c5d552b6a0777108ee88c6370be410a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060CanvasBusySpinner\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd02046157115469b1e711b4cdc1a182bbbe170458f735a5c4243ca3c73faf7c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060Filter\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"25b8ffe949b27278075e8703af286f4d1f88384207ad62227f0fb9b998120c71"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060Transform\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"31b36abb0898e90536a4c5a1c3057043443ac93617102df426f72541956b5aac"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060SelectObject\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"85af3727c0fca29fe7fa7072a2afe82be11dafce5b72e289932eb6b91f30ebef"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060CanvasWorkspacePanel\u0060 (slice \u0027ui\u0027) depends on \u0060CanvasDropArea\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"7adc66376445a2ac3883a1fdfd5b411d90097946f85688e3cc6d9c8218984ae9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060$fallbackTool\u0060 (slice \u0027ui\u0027) depends on \u0060Tool\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewCanvasHeaderActions.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0eef1dc986725bb0bd7880806437bd36f0f6526e6ee6ee9fd547a747dcc9820"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 system: \u0060formatKey\u0060 (slice \u0027ui\u0027) depends on \u0060IS_MAC_OS\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewCanvasHeaderActions.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"26a76e6866e93d50bcc98ec813f5644ec9df88ab8c1bcf631ac9bac56c667ad6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060DockviewCanvasHeaderActions\u0060 (slice \u0027ui\u0027) depends on \u0060useCanvasManagerSafe\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewCanvasHeaderActions.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc8520c67bb8cccde1e0dcc275c43be7497824d12b5dedd25c845e58f32f2085"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060DockviewCanvasHeaderActions\u0060 (slice \u0027ui\u0027) depends on \u0060selectLassoMode\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewCanvasHeaderActions.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a66a047e9f2f225ac578bebc988213d0ed2d851181d0964fc3e7753f151b353"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060DockviewCanvasHeaderActions\u0060 (slice \u0027ui\u0027) depends on \u0060selectShapeType\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewCanvasHeaderActions.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7346e0700a3e78139e5ccacab251e9da8bd8f4b86c660bc9297541f0ef67459"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060DockviewCanvasHeaderActions\u0060 (slice \u0027ui\u0027) depends on \u0060selectBbox\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewCanvasHeaderActions.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"95218b9eebfd4ff21e0ea890661a77ae50f2415fff0a36d21e892c652bbb14c1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 queue: \u0060DockviewTabCanvasViewer\u0060 (slice \u0027ui\u0027) depends on \u0060useCurrentQueueItemDestination\u0060 from slice \u0027queue\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasViewer.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"838e0441821bac7ccc73c298357a1ee8e20102979297934909398beb6e18fe3f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 system: \u0060DockviewTabCanvasViewer\u0060 (slice \u0027ui\u0027) depends on \u0060ProgressBar\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasViewer.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cbaa1061b75e52be9fd9b0f8b8f60e21b4f312a9c4504bfb02bbf83ce7bc5ff"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060DockviewTabCanvasWorkspace\u0060 (slice \u0027ui\u0027) depends on \u0060selectCanvasSessionId\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasWorkspace.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"f98ca8f9adc0b2aac9ee7c56f7be7b447a31afa4ff0b54fc5412bdc786672025"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 queue: \u0060DockviewTabCanvasWorkspace\u0060 (slice \u0027ui\u0027) depends on \u0060useCurrentQueueItemDestination\u0060 from slice \u0027queue\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasWorkspace.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"532b25a0ce7a93aba64d8a774a081ee021fcbbb387e61281621e079856ef44bc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 system: \u0060DockviewTabCanvasWorkspace\u0060 (slice \u0027ui\u0027) depends on \u0060ProgressBar\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasWorkspace.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"4209f93083d96203bea1c1dd0886e6a3450a464da6c57e9af6d99adfb62d37dd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 system: \u0060DockviewTabProgress\u0060 (slice \u0027ui\u0027) depends on \u0060ProgressBar\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabProgress.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"0690495b3cc265a77dafb5c35f2704ddfb7b4e0baafe96a8acd4cc67bd32c52b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 queue: \u0060GenerateTabLeftPanel\u0060 (slice \u0027ui\u0027) depends on \u0060QueueControls\u0060 from slice \u0027queue\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/GenerateTabLeftPanel.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb96e5b23cacad199925c59cb74e2809de7df8f60f3bd51a5b4984c22f1efc24"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 parameters: \u0060InitialStateMainModelPicker\u0060 (slice \u0027ui\u0027) depends on \u0060modelSelected\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/InitialStateMainModelPicker.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"bde5228159b9b1a490bded1578a28d0112be8e71cce6797f7ca12054fe41523b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 parameters: \u0060InitialStateMainModelPicker\u0060 (slice \u0027ui\u0027) depends on \u0060isExternalModelUnsupportedForTab\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/InitialStateMainModelPicker.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b88a9e9555a391096d7e52eb74c4a59e0474bb6d2918e042657cf1e9f8841a7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 parameters: \u0060InitialStateMainModelPicker\u0060 (slice \u0027ui\u0027) depends on \u0060ModelPicker\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/InitialStateMainModelPicker.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2e19f8393927f5aaf93f9f2fa512cec0ac45b54aea3e9a90a36228d67a06f1d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 dnd: \u0060dndTargetData\u0060 (slice \u0027ui\u0027) depends on \u0060addGlobalReferenceImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5832b8a0f6a3e8ca6977d88612b7ecbd83c8225ab9e626595b2089b7c440d6c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060LaunchpadAddStyleReference\u0060 (slice \u0027ui\u0027) depends on \u0060getDefaultRefImageConfig\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd438e3755abea3fc8255766d7ff46a607690f898ce4b1844227163c9cfd7372"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060LaunchpadAddStyleReference\u0060 (slice \u0027ui\u0027) depends on \u0060imageDTOToCroppableImage\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b5c84fdb66868f68d4ce62161be64323768a98594eeb30385bcb5f7ed0ea1ac"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060LaunchpadAddStyleReference\u0060 (slice \u0027ui\u0027) depends on \u0060refImageAdded\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"99bb556b9ff6ba462c8042cde976f7a34e437481df8c15899d10cdd60399efe9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 dnd: \u0060LaunchpadAddStyleReference\u0060 (slice \u0027ui\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f60ef5f3018eb12b67faa075f5054976645185101dad96050e8389e6d9b58f0"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 dnd: \u0060dndTargetData\u0060 (slice \u0027ui\u0027) depends on \u0060newCanvasFromImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1be10f00466206028be7740c29a6e77a4f5f78c5ae9afdd135c0635d51ae071"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060LaunchpadEditImageButton\u0060 (slice \u0027ui\u0027) depends on \u0060useCanvasIsStaging\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed6b6513411e0cfc59ac14bf006543246517524589e01c6092a244c6c59a2741"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 imageActions: \u0060LaunchpadEditImageButton\u0060 (slice \u0027ui\u0027) depends on \u0060newCanvasFromImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"92911585d070c8f21fec0b31f5d8011b36224475cca979ad1d8b606fa8400afb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 dnd: \u0060LaunchpadEditImageButton\u0060 (slice \u0027ui\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b1f3dccfd24e400bf0ef29cbe3b2165667c75fb31540c4fc872019a7ecd9731"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060LaunchpadGenerateFromTextButton\u0060 (slice \u0027ui\u0027) depends on \u0060useCanvasIsStaging\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadGenerateFromTextButton.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"13e1f0a45b7a4fa074b88c56de2e22a2411350453d210139d515822fa0dad92d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 dnd: \u0060dndTargetData\u0060 (slice \u0027ui\u0027) depends on \u0060newCanvasFromImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadUseALayoutImageButton.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"60c9be39d97142f2f90d3b54a417202bd806de78ea6cb98a50cdbe1a554f5f0d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060LaunchpadUseALayoutImageButton\u0060 (slice \u0027ui\u0027) depends on \u0060useCanvasIsStaging\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadUseALayoutImageButton.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"9145aaef6b22afe4ece019b043e56d2875704358e0632db5ca97816642d1d24c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 imageActions: \u0060LaunchpadUseALayoutImageButton\u0060 (slice \u0027ui\u0027) depends on \u0060newCanvasFromImage\u0060 from slice \u0027imageActions\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadUseALayoutImageButton.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c818a8b592b97c63b6a936c08cbd064d523bbc99f51481e17246a7a8bb2a5c6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 dnd: \u0060LaunchpadUseALayoutImageButton\u0060 (slice \u0027ui\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadUseALayoutImageButton.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a807825c5f3c4742cab1fef757784a90b7020593cb6283fe43281b3b802d76a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 system: \u0060PanelHotkeysLogical\u0060 (slice \u0027ui\u0027) depends on \u0060useRegisteredHotkeys\u0060 from slice \u0027system\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/PanelHotkeysLogical.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"bebe99c41924e0f29101ea1fda8b040b38e0541bd64c4620eed5d8d138bb9397"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060StagingArea\u0060 (slice \u0027ui\u0027) depends on \u0060useCanvasIsStaging\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/StagingArea.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"f917f9d8a4ea477fa06e8d5dccbd47a29f9d18ec7b80abfa228a33e8566021cd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060StagingArea\u0060 (slice \u0027ui\u0027) depends on \u0060selectCanvasSessionAreThumbnailsVisible\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/StagingArea.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbbb7b45ffae719ee309894e666a138df83569db89d98745426fc3b28a35604d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060StagingArea\u0060 (slice \u0027ui\u0027) depends on \u0060canvasSessionThumbnailsVisibilityToggled\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/StagingArea.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bcabc1ee1239719674dd8871ac3968390f12275ca8613c64ed09db4cc786cb5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060StagingArea\u0060 (slice \u0027ui\u0027) depends on \u0060STAGING_AREA_THUMBNAIL_STRIP_HEIGHT\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/StagingArea.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1b9b97c99541f1ccfb80e4ed995516972a1f8537a1a0bf193f4517701a23d52"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060StagingArea\u0060 (slice \u0027ui\u0027) depends on \u0060StagingAreaItemsList\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/StagingArea.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"61b3f3470d66082b2fa98728622bab607a27e181031d10fd63beed9d49bdb92c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060StagingArea\u0060 (slice \u0027ui\u0027) depends on \u0060StagingAreaToolbar\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/StagingArea.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"0132a3d1c0c295196bc4c790cfb9b9e883f3b60b101a04bd14df3e67c2786245"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 parameters: \u0060UpscalingLaunchpadPanel\u0060 (slice \u0027ui\u0027) depends on \u0060selectUpscaleInitialImage\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"15b6cc76431ef4a89c065e6265e952370be9102299de6c052b81e5c53e1a1d05"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 parameters: \u0060UpscalingLaunchpadPanel\u0060 (slice \u0027ui\u0027) depends on \u0060selectCreativity\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a4bc176726a8d606af2ffb78f152edbb5991e7c48db5483afb8e6549bb4e4cd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 parameters: \u0060UpscalingLaunchpadPanel\u0060 (slice \u0027ui\u0027) depends on \u0060selectStructure\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"e86544c854f4e2b9b16066c581ef46210906c077f1040223162d6657c137d5d4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 dnd: \u0060UpscalingLaunchpadPanel\u0060 (slice \u0027ui\u0027) depends on \u0060setUpscaleInitialImageDndTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c8cf6fe74e49c5ef1ed0665e08b5067b0cfdd9fbc556d8a390423fcf86f6620"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 parameters: \u0060UpscalingLaunchpadPanel\u0060 (slice \u0027ui\u0027) depends on \u0060upscaleInitialImageChanged\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd8021ba27b2317c81efabda805f5fad3fd1b94e59c4b5be7e728e18af71dc9a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060UpscalingLaunchpadPanel\u0060 (slice \u0027ui\u0027) depends on \u0060imageDTOToImageWithDims\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"aad34dcd7d227e842c20249ca5f6ef8c48eb0422064a6aa0e831e1caa83d7d3f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 parameters: \u0060UpscalingLaunchpadPanel\u0060 (slice \u0027ui\u0027) depends on \u0060creativityChanged\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb88437858f0ca19f5e16d60d7a6df42da9e16815d9bd427e27d1c42b3dc5940"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 parameters: \u0060UpscalingLaunchpadPanel\u0060 (slice \u0027ui\u0027) depends on \u0060structureChanged\u0060 from slice \u0027parameters\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e518f3c1f7dec5638bb3475d558cc0d04a78caf4549c8494778cb231037f6fa"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 dnd: \u0060UpscalingLaunchpadPanel\u0060 (slice \u0027ui\u0027) depends on \u0060DndDropTarget\u0060 from slice \u0027dnd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"91c90a425ea50081bb7ba72f2f1bbceefadac802c643ca5d550a61a749a2ca6f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 queue: \u0060UpscalingTabLeftPanel\u0060 (slice \u0027ui\u0027) depends on \u0060QueueControls\u0060 from slice \u0027queue\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingTabLeftPanel.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ade6b09c02218e20dd0fb37b48d8a8a1141b550df496307c17bff0a96af2598"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 nodes: \u0060WorkflowsLaunchpadPanel\u0060 (slice \u0027ui\u0027) depends on \u0060useWorkflowLibraryModal\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/WorkflowsLaunchpadPanel.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"9252f11764e8df6182959430b749cfe8a44c34270c8956e4b36fa27f6a9c9ff5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 workflowLibrary: \u0060WorkflowsLaunchpadPanel\u0060 (slice \u0027ui\u0027) depends on \u0060useNewWorkflow\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/WorkflowsLaunchpadPanel.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b86c85fd62afbcc181327c05880a42b1276f8a6ec6edd03e916965d3102556e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 workflowLibrary: \u0060WorkflowsLaunchpadPanel\u0060 (slice \u0027ui\u0027) depends on \u0060useLoadWorkflowWithDialog\u0060 from slice \u0027workflowLibrary\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/WorkflowsLaunchpadPanel.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a6a143949c63d6ef793adcbfd20ea398fa40e03e7bdc6376a3048a3d535ed10"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 gallery: \u0060mainPanelComponents\u0060 (slice \u0027ui\u0027) depends on \u0060ImageViewerPanel\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"d88277c552f87807306969c5e6ac239e46e020208b7d6b2fc45971552e0c5b4a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 gallery: \u0060rightPanelComponents\u0060 (slice \u0027ui\u0027) depends on \u0060BoardsPanel\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d462c487c643c506f41e27fbf77f933a2b6ee58296a0a487d0bce31f739371b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 gallery: \u0060rightPanelComponents\u0060 (slice \u0027ui\u0027) depends on \u0060GalleryPanel\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"27d48f4c26ed258a43531483c8aa2415c0278a6aac88b7557c6e887f151bc4bc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060rightPanelComponents\u0060 (slice \u0027ui\u0027) depends on \u0060CanvasLayersPanel\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4ff6819ea82f05367c74de9a7723753fb5729257b24ef9ed29300f681bf7b56"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060GetCanvasToolModifierHintsArg\u0060 (slice \u0027ui\u0027) depends on \u0060Tool\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/canvasToolModifierHints.ts"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"841777c9c61c438b5b3cd62a04c55d5fbcc6c8e1f8f1a7f6c3f70b36232b457a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060getCanvasToolModifierHintIds\u0060 (slice \u0027ui\u0027) depends on \u0060shouldQuickSwitchToColorPickerOnAlt\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/canvasToolModifierHints.ts"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8cc02d5bb24c7ef0e40a4e37761a4fbbee4a5a57fbb30d5854678d59ddfcbb3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 controlLayers: \u0060getCanvasToolModifierHintIds\u0060 (slice \u0027ui\u0027) depends on \u0060shouldTranslateShapeDragOnSpace\u0060 from slice \u0027controlLayers\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/canvasToolModifierHints.ts"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"46da1654c54b369e54422316b60634dd76d45268eef7b0c11b6a65ebb4ecdb14"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 gallery: \u0060mainPanelComponents\u0060 (slice \u0027ui\u0027) depends on \u0060ImageViewerPanel\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"95767ae8d1705787afe2d23ca05accbbb9450b802867ae3201c7130e60b12b57"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 gallery: \u0060rightPanelComponents\u0060 (slice \u0027ui\u0027) depends on \u0060BoardsPanel\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"74cb76566431a063d7b4fbce34f32041514567267af381a1616d076c64ead61a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 gallery: \u0060rightPanelComponents\u0060 (slice \u0027ui\u0027) depends on \u0060GalleryPanel\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"65874e5f24fea465e68f335ea23336decd12b21adf6cc221d1f79c779108f9be"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 gallery: \u0060mainPanelComponents\u0060 (slice \u0027ui\u0027) depends on \u0060ImageViewerPanel\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"43d08864122a2bacc5726f583b8701b8b23be850acf444bbb19039b266791637"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 gallery: \u0060rightPanelComponents\u0060 (slice \u0027ui\u0027) depends on \u0060BoardsPanel\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"175b3493b882061621ebf1f84bf1290b4639b99835f51e4d5a73c58194ff555e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 gallery: \u0060rightPanelComponents\u0060 (slice \u0027ui\u0027) depends on \u0060GalleryPanel\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c2f82d6f9a74792a2164f9935f8be442fd6ba8b7f082d54be2364dcc911d8a3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 nodes: \u0060mainPanelComponents\u0060 (slice \u0027ui\u0027) depends on \u0060NodeEditor\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"097e5bd62aa8fe490cf40e8d115d7bad85d6d568195a97e3203caff15662f01a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 gallery: \u0060mainPanelComponents\u0060 (slice \u0027ui\u0027) depends on \u0060ImageViewerPanel\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"e706eece01504a83e12d1592190909af90c898f848249caafa392626528a97a5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 gallery: \u0060rightPanelComponents\u0060 (slice \u0027ui\u0027) depends on \u0060BoardsPanel\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef3a5c1e800ba4e89e80dcde0096909835c154bc0fff52fa2c7673dd8659cd5a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 gallery: \u0060rightPanelComponents\u0060 (slice \u0027ui\u0027) depends on \u0060GalleryPanel\u0060 from slice \u0027gallery\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a4dc0ded88efd428ef5b817f6cbe94717918119f862867f7fba13b47afb6b86"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: ui \u2192 nodes: \u0060leftPanelComponents\u0060 (slice \u0027ui\u0027) depends on \u0060WorkflowsTabLeftPanel\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"22fb2edf7ac4c08e1f334a74ff2331b780f02ddaf155d4f83f00c906dfd09e08"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 toast: \u0060DeleteWorkflowDialog\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/DeleteLibraryWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5c8f239d028ba0a4109c7a5495231b6f068713ce6543598505991c26cdd8d4d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060LoadWorkflowOptions\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060WorkflowV3\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7931c40c911851c94c6e18d0f3416aed68e0c52cb59c345fc343623dac41d33"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useLoadImmediate\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060useWorkflowLibraryModal\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bca5d45b9506f28073cab5bb1a4419ce4f45b5b89ddc5949065122d0427e61d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useLoadWorkflowWithDialog\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060useDoesWorkflowHaveUnsavedChanges\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3febea243a33851963c41ba55ae10fcae7edd96b6bdc6e2a90d93f76089f190"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060LoadWorkflowFromGraphModal\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060graphToWorkflow\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowFromGraphModal/LoadWorkflowFromGraphModal.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"821f80d9456a9ddee9e55ca694c7b47506ced960a8764a7ef4265dd95bef406c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useNewWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060useDoesWorkflowHaveUnsavedChanges\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ebb74249b67103c248e65b7dcecde751d6ab4a152afef915dcb79c2058694b2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useNewWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060useWorkflowLibraryModal\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e10be851e2c977bac48760c486bcced142f321a8012112c35a7891a2f5b252e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useNewWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060nodeEditorReset\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"053633d042c511e5d40662c6b05c22831d9767cd3ac3aa4d1d86ae4b590ffe23"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useNewWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060workflowModeChanged\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6b12c66034760f7c6e9793e7548b0eba2a396c68abf6036323fdad7e190c549"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 ui: \u0060useNewWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f1e09bab1a1cf6936f9b7f21d2a82c6617e69200d71752f0391078e2124f2e3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 ui: \u0060useNewWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060WORKSPACE_PANEL_ID\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"12de43e2aeb87c9416db5681a5e44a3846cac2b88c529ab90e42ca19880ceed3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 toast: \u0060useNewWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ec4de62db4c44baa6d9d90b68e7189986a7a1d974973f4cf1d473d255ce71c9"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060$workflowToSave\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060WorkflowV3\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/SaveWorkflowAsDialog.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"cee776ba03682d86f779a55a1dd030b48dfafd86203439ab33d7942d2e2979ed"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060LoadWorkflowFromGraphMenuItem\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060$templates\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/LoadWorkflowFromGraphMenuItem.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"f917914ca476276f3170cd276dbfd8e243d6f14975ae350bd70a01e4662cbd9d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060SaveWorkflowAsMenuItem\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060useBuildWorkflowFast\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/SaveWorkflowAsMenuItem.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"f615aa9f647333f510fd765c1aed2cda3fd3d25e96cced7a95ccc5472a950f27"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060SaveWorkflowMenuItem\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060useDoesWorkflowHaveUnsavedChanges\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/SaveWorkflowMenuItem.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b9df721471ee3908fd30e7285586e6aea193533d3ac4b06f3674aad64ea22bc"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060DraftWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060WorkflowV3\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useCreateNewWorkflow.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"5568a6bce917e6804775f83dcaead68306ffa131b50d0e92fd60976ed8c0fd36"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useCreateLibraryWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060workflowIDChanged\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useCreateNewWorkflow.ts"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2e3ed9de407f7e3a16a9c24aedcdf24f6247726bd1be14c3d8acb241156a9ae"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useCreateLibraryWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060workflowNameChanged\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useCreateNewWorkflow.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ec3d5f883a57cb3ab54fdcf6356fb17a761cea3da73d4d4edd046e605d8f941"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useCreateLibraryWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060workflowCategoryChanged\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useCreateNewWorkflow.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdd36569c874347be4e8227dc6fe049ac2234cd7bc26a0b3c5ae5dbb89d1a639"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useCreateLibraryWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060formFieldInitialValuesChanged\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useCreateNewWorkflow.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"99c246cdf2578fec51bbcb8fdad7ec1922430293853b7fc49eff0184de6ce4cf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useDownloadCurrentlyLoadedWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060useBuildWorkflowFast\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useDownloadCurrentlyLoadedWorkflow.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa6f3e901a4d9812b624519e0423d13345783b339df5b00c13deffc7aad1e6ca"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 toast: \u0060useDownloadWorkflowById\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useDownloadWorkflowById.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4cf40f3df144ddae657336054ea4dae86b8ca3e6ae3ee73b2b5283c80906e10"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useGetFormFieldInitialValues\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060selectNodesSlice\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useGetFormInitialValues.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"38560a6db64de9972e148f309322146d2e604146fd5a28194d7af6422cd1babf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useGetFormFieldInitialValues\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060getFormFieldInitialValues\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useGetFormInitialValues.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9221223ffca926c969f0f9319f992cc6eadc72132a25509d332dd1aa8104bc5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useIsCurrentWorkflowOwner\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060selectWorkflowId\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useIsCurrentWorkflowOwner.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"df2e2af680fb5b441601a9afae03a2d27f47457edc42eb80a9277913090f12a6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 auth: \u0060useIsCurrentWorkflowOwner\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060selectCurrentUser\u0060 from slice \u0027auth\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useIsCurrentWorkflowOwner.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7f162819a13767fa4fbc607cfccb0e4afe4da8b4d3c97e5bf0f85071123dd30"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useLoadWorkflowFromFile\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060WorkflowV3\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromFile.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab769ec29292b27868adcbacfe88660668c0486b2ea70d05ebd15db3bef09a9a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useLoadWorkflowFromImage\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060WorkflowV3\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromImage.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"826e6ae464c17e4b9f0db89cf610bc70c3dd78ff9a3eda53cf91930990ca3e3a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useLoadWorkflowFromImage\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060graphToWorkflow\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromImage.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"499cde79d2e7145c0e994d3b5441c0d2ae65b517ae19b997fb6414bec1ea8ae2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 toast: \u0060useLoadWorkflowFromImage\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromImage.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"13afc8c4cdef5ee8451f10af87a9a13745f20cdd96000151d5689b2e9fb90f80"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useLoadWorkflowFromLibrary\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060WorkflowV3\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromLibrary.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"d778086dfb1f6f17f003b18ec5e67646ef5f9e3969686c4c9aad44e3164cd357"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useLoadWorkflowFromObject\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060WorkflowV3\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromObject.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d73faa13c1ced9b78c9260cba5b9df6dae82450205680affd2f9c3d56654bb7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useLoadWorkflowFromVideo\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060WorkflowV3\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromVideo.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc2329483f12805b554a5ad635978dec41e91e95d1efdfb56ace5b75871b0197"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useLoadWorkflowFromVideo\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060graphToWorkflow\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromVideo.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"8830db3f68f2f450f2d122f18e792b77c16cf8ddacdf1a64a23e60d630dc02fb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 toast: \u0060useLoadWorkflowFromVideo\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromVideo.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6debd404b64e34d07d0b889f84a53ea9aabd313ca63321305b6547e83b4578a"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060LibraryWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060WorkflowV3\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useSaveLibraryWorkflow.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7bf31ddc994faf1ba1fcf96ebbb74a7411148a5275a2ba950a615bd4fcbf5f2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useSaveLibraryWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060formFieldInitialValuesChanged\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useSaveLibraryWorkflow.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a297652091b6d3693721ae3b829bc1b794389e83041ce94babae25618d60460"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useSaveOrSaveAsWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060useBuildWorkflowFast\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useSaveOrSaveAsWorkflow.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"1684b4cd33623f2fd785a3806114614b85853e33460f05bf613d757a18bea7e2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useValidateAndLoadWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060WorkflowV3\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"630e19d29f58dfe6a75c9d68454e77b8d42d9171f538606527ed8be8a13ac911"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useValidateAndLoadWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060$templates\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"e63c5df997b557700b530372f6c2a0cb6b3264c9efc782f156a8e12b43a87daf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useValidateAndLoadWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060validateWorkflow\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe07b47746c1cff7710b3b19da2a2f5075986830fd870339f083be70c7e8ed28"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useValidateAndLoadWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060$nodeExecutionStates\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d4959509e33466686f5b93dd79d7f7edc0be61eeb53e2facc9b1216c76e7f67"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useValidateAndLoadWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060workflowLoaded\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"a795df12fcc79126320b1ff79e1207a5738fbceadb761210ac65f874b2bee21c"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useValidateAndLoadWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060getIsFormEmpty\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"93e5e58554e86bd20f2539a8b9ec5bc71d7fa28a36032ededeba4480b571f209"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useValidateAndLoadWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060workflowModeChanged\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"f726f1a6f26fccb9228afbef936c13abd5eb5eb3d291b5e436b51b1e604dfc27"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 ui: \u0060useValidateAndLoadWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060navigationApi\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fb774c13c5cdaf296a852f69315afb1b036d874b69ec24d3e20aa455a89ecf8"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 ui: \u0060useValidateAndLoadWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060WORKSPACE_PANEL_ID\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"f606420ba491b15a44e316d01d92eef01577e952b8203ad16eb57c90cacae0bd"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 ui: \u0060useValidateAndLoadWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060VIEWER_PANEL_ID\u0060 from slice \u0027ui\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"efee2e69478931d8ce6817d8794baa997c15f772cc8d82da40007c3824a6ab0e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 toast: \u0060useValidateAndLoadWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060toast\u0060 from slice \u0027toast\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"d69530a362cff34a418905acd1778f70a77b1f8a7fded53da1f7d3069b3744ce"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useValidateAndLoadWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060$needsFit\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"33d230d4bd93f3cc1d1404828a2668c5d1bd0a6001343141e6d7fb8709a7c2ae"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useValidateAndLoadWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060WorkflowVersionError\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"56785d5f483ad1e9c57c58bd7a804c8c28115bb8ac189c277e8b6a5afab81671"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060useValidateAndLoadWorkflow\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060WorkflowMigrationError\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"38a434c493dcac446d27cc447db470a091f519d22ff0d5ee1c44f15abd7c2b36"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: workflowLibrary \u2192 nodes: \u0060newWorkflowSaved\u0060 (slice \u0027workflowLibrary\u0027) depends on \u0060WorkflowCategory\u0060 from slice \u0027nodes\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/store/actions.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"8310249bd104e4d45a6ba7602ce8191786b7a9c18e5f3b4c2d321bafe4b68b0d"}},{"ruleId":"C4","level":"note","message":{"text":"Partial data-retention evidence: A retention mechanism is present, but the data-lifecycle is not yet complete \u2014 missing: an expiry limit \u2014 a declared maximum age / TTL after which the data is no longer kept, a scheduled purge / cleanup job (a Celery beat task, APScheduler job or management command that deletes rows past their retention \u2014 Session.objects.filter(created__lt=cutoff).delete(), purge_expired\u2026 / delete_old\u2026)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e6c843eccaff7ffcfe5241125b74768c2364055ab6678b12b10d47f44086afa4"}},{"ruleId":"IC1","level":"warning","message":{"text":"Both branches are identical \u2014 the condition decides nothing: Both arms of this conditional expression are the same, so no input can make the condition matter. Implement the distinction that was intended, or drop the condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts"},"region":{"startLine":839}}}],"partialFingerprints":{"codehealthFindingId/v1":"934de91db8ce6abea65b8e85941dc91691bc72acf134bfa632f7070eedc5a1d6"}},{"ruleId":"IC1","level":"warning","message":{"text":"Both branches are identical \u2014 the condition decides nothing: Both arms of this conditional expression are the same, so no input can make the condition matter. Implement the distinction that was intended, or drop the condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts"},"region":{"startLine":840}}}],"partialFingerprints":{"codehealthFindingId/v1":"47cc7a4747adf6925565e6651568361bb52d4cc7372f9f4bd7e34db26051c0ad"}},{"ruleId":"IC1","level":"warning","message":{"text":"Both branches are identical \u2014 the condition decides nothing: The \u0060if\u0060 and its \u0060else\u0060 contain the same statements, so no input can make the condition matter. Implement the distinction that was intended, or drop the branch and keep the body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9b27927a3f6681c3a2f4954126ae5b7f870c3c44b3bdb8ecb27bcbcdafc65d6"}},{"ruleId":"IC1","level":"note","message":{"text":"Empty method body: \u0060focusAdjacentRegion\u0060 has an empty body \u2014 confirm it\u0027s an intentional no-op and not an unfinished method."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/focusRegions.tsx"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"63238a667d3d2b89a29f89e68ed30a833edfccff48928080c99454b3d8c50e65"}},{"ruleId":"IC1","level":"note","message":{"text":"Empty method body: \u0060focusFloating\u0060 has an empty body \u2014 confirm it\u0027s an intentional no-op and not an unfinished method."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/focusRegions.tsx"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"526516f8724ee02d9e8562196bad5b20943043fdd8fe79284954d073981679dd"}},{"ruleId":"IC1","level":"note","message":{"text":"Empty method body: \u0060focusRegion\u0060 has an empty body \u2014 confirm it\u0027s an intentional no-op and not an unfinished method."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/focusRegions.tsx"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebf4b29beda2620725ec598bf90ee5d48bd22d5b0cf8cd625d158900428df740"}},{"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":"M3","level":"note","message":{"text":"No src/ separation: Production code isn\u0027t grouped under a src/ folder \u2014 it\u0027s spread across several top-level directories, so there\u0027s no one place that says \u0027this is the product\u0027."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"fdf7f5b24e313364d10170a5c2542959902fe0d26ed70edef3eaa10ec5bcdb1d"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: invokeai/backend/ip_adapter/README.md names \u0060image_encoder.txt\u0060, but no file or folder \u0060image_encoder.txt\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/ip_adapter/README.md"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"afb1131837b71ac9709d7bd4f2717bfe05167383e2368c5d58410517f6fc7ba3"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/index.mdx links to \u0060/start-here/installation/\u0060, but \u0060start-here/installation\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/index.mdx"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"247c6f3d95d6c432ea6309067f41face4bfa581e477d0321461ff5c198af948e"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/index.mdx links to \u0060/configuration/docker/\u0060, but \u0060configuration/docker\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/index.mdx"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5e0ff6acc26d27f45e38c929f36688668d250f1a8c785b2292dd123c0347119"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/index.mdx links to \u0060/start-here/manual/\u0060, but \u0060start-here/manual\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/index.mdx"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"703761ababd898c41f6966f096af4cb2d411c75bda166df822021a43090432d1"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/index.mdx links to \u0060/troubleshooting/faq/\u0060, but \u0060troubleshooting/faq\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/index.mdx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"77633a22973f8306b0b40097b1bedecfc37cce427f398bb2b2b334c5fae51b0c"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/index.mdx links to \u0060/contributing/contributors/\u0060, but \u0060contributing/contributors\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/index.mdx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1c2c5719fd5f95f34034b0dfc8750db04a8e5f5ca75e4b07f645030c5e563de"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/index.mdx links to \u0060/contributing/\u0060, but \u0060contributing\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/index.mdx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f1e098fcf612d3a522bd52848653f8f949cb91f9033c1518b11eaecf641daf0"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/01.invokeai-yaml.mdx links to \u0060/users-guide/gallery/image-storage-maintenance/\u0060, but \u0060users-guide/gallery/image-storage-maintenance\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/01.invokeai-yaml.mdx"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"14e8ea9b8f5564a7e99b3ae60df501607a55be50aad297c288e1c58298a70447"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/01.invokeai-yaml.mdx links to \u0060/configuration/external-database/\u0060, but \u0060configuration/external-database\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/01.invokeai-yaml.mdx"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"9913bcaddfcceb8307335d4f3368611e8280587737244a79b93dd9bec91f65d8"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/01.invokeai-yaml.mdx links to \u0060/configuration/optimization/low-vram-mode/\u0060, but \u0060configuration/optimization/low-vram-mode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/01.invokeai-yaml.mdx"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"743424beed8f3b35226ff4079b891bef559dc37423ae2601752ee865f5003ee0"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/02.docker.mdx links to \u0060/configuration/invokeai-yaml/\u0060, but \u0060configuration/invokeai-yaml\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/02.docker.mdx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"b97a957a809da9dd86d831780bce4c01fd929605b214a1002869ba524fd443a0"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/02.docker.mdx names \u0060build.sh\u0060, but no file or folder \u0060build.sh\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/02.docker.mdx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6ae624f583de16f54569a5284fea20d8419883d4440b9ab3bc45ee1d1230196"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/external-providers.md names \u0060invokeai/backend/model_manager/starter_models.py\u0060, but no file or folder \u0060invokeai/backend/model_manager/starter_models.py\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/external-providers.md"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"81ca6c692c629d0348b564fcad1c4a180ae73f509b9731f013c47e69818b0e6a"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/index.md links to \u0060/development/\u0060, but \u0060development\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/index.md"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"f39b2b715e20f2fc17b22995c9b9b531be0e07e92436119c3e879f0f472057b7"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/index.md links to \u0060/contributing/new-contributor-guide/\u0060, but \u0060contributing/new-contributor-guide\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/index.md"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad87775b43b32bc59d039b20219d7f81d498db044b02827a082e8c3f6dd5c79c"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/index.md links to \u0060/development/guides/creating-nodes/\u0060, but \u0060development/guides/creating-nodes\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/index.md"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"d555ba57e780c8424aba5703e43e64459c0c37c20a0cb58cc0719d5d5f6e066b"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/index.md links to \u0060/contributing/\u0060, but \u0060contributing\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/index.md"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"327f0766cac23632893dc94540b7a9dc6a2c3875fdb7fb17a6545785abbd1a40"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/index.md links to \u0060/contributing/translations/\u0060, but \u0060contributing/translations\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/index.md"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd54991b10cb3f8b344a10c8fd2ea04ef25432beaf69cf760383d99cb770746d"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/index.md links to \u0060/contributing/contributors/\u0060, but \u0060contributing/contributors\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/index.md"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed861590583bbb01c2d7ae352d8c1d579ce7c7f00540662c38c3f35b60501e17"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/index.md links to \u0060/contributing/code-of-conduct/\u0060, but \u0060contributing/code-of-conduct\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/index.md"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a3a353ab2cdab9c9c5975034a7ad5bb526a21584c83eaa610572c6473340e43"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/new-contributor-guide.mdx links to \u0060/development/\u0060, but \u0060development\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/new-contributor-guide.mdx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"5621c2c1b0c8602a5d1d2461a2d6a63086bc3aee82722cd7d900406c54eac125"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/new-contributor-guide.mdx links to \u0060/development/setup/dev-environment/\u0060, but \u0060development/setup/dev-environment\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/new-contributor-guide.mdx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ff69ae8c4b91038a0cd8300e75bc00c60f0db3ccb4524fd89a8a55ee129cda1"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/new-model-integration.mdx names \u0060architectures/defs/new_model.py\u0060, but no file or folder \u0060architectures/defs/new_model.py\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/new-model-integration.mdx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"c08b240555a3616cf00976b8ef3a3cf3e0ccb302bc7900f2297eb44e6502e66b"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/new-model-integration.mdx names \u0060app/invocations/new_model/__init__.py\u0060, but no file or folder \u0060app/invocations/new_model/__init__.py\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/new-model-integration.mdx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"067752558779b1aa7b6b52877ae1698f67a654c08fd19e9696d10f110571beea"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/new-model-integration.mdx names \u0060starter_models/new_model.py\u0060, but no file or folder \u0060starter_models/new_model.py\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/new-model-integration.mdx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"acc3d545f01c79348456780727a280e66de82164a0850cfe875b8712d9151cfb"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/new-model-integration.mdx names \u0060tests/backend/model_manager/load/test_diffusers_0XX_compatibility.py\u0060, but no file or folder \u0060tests/backend/model_manager/load/test_diffusers_0XX_compatibility.py\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/new-model-integration.mdx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfa13e29254b6b38f01887d3bb8d23b14773a258cc08f72d984bf7ef173c1687"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/new-model-integration.mdx names \u0060invokeai/backend/architectures/defs/new_model.py\u0060, but no file or folder \u0060invokeai/backend/architectures/defs/new_model.py\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/new-model-integration.mdx"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7ec911ff2b3af1389f35337602ddf2e4f9db42d8563dce492966a255c28566c"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/new-model-integration.mdx links to \u0060/users-guide/models/model-format-support/\u0060, but \u0060users-guide/models/model-format-support\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/new-model-integration.mdx"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7ca84ae2e1822302eeac42505f31c3d3ae4f4d22787d1551b5a674af2185049"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/new-model-integration.mdx names \u0060invokeai/app/invocations/new_model/\u0060, but no file or folder \u0060invokeai/app/invocations/new_model\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/new-model-integration.mdx"},"region":{"startLine":491}}}],"partialFingerprints":{"codehealthFindingId/v1":"69a6ec33417bc9e24bbee2ee1553daaa9b564724328425f99cd9a884773453f0"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/new-model-integration.mdx names \u0060new_model_denoise.py\u0060, but no file or folder \u0060new_model_denoise.py\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/new-model-integration.mdx"},"region":{"startLine":499}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9d85d6d54d9438324af7484ea0775af24c5a3b161a5d4d0e84f81481ccab7c7"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/new-model-integration.mdx names \u0060text_encoder/new_model_text_encoder.py\u0060, but no file or folder \u0060text_encoder/new_model_text_encoder.py\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/new-model-integration.mdx"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bef070208e87f3b98edc667697100589584cfd1fd8e4f5737c02a6c4c33d9de"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/new-model-integration.mdx names \u0060vae/new_model_image_to_latents.py\u0060, but no file or folder \u0060vae/new_model_image_to_latents.py\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/new-model-integration.mdx"},"region":{"startLine":606}}}],"partialFingerprints":{"codehealthFindingId/v1":"54cf83471ea9c9721418c456921a505a259e2b6eaa2b6d6fb6da0062828758a1"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/new-model-integration.mdx names \u0060vae/new_model_latents_to_image.py\u0060, but no file or folder \u0060vae/new_model_latents_to_image.py\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/new-model-integration.mdx"},"region":{"startLine":606}}}],"partialFingerprints":{"codehealthFindingId/v1":"86e080f607f8be0320e639cb4088f09e710724f100420d5b334d84d0e3f8457d"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/new-model-integration.mdx links to \u0060/development/architecture/model-manager/\u0060, but \u0060development/architecture/model-manager\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/new-model-integration.mdx"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"902e2c8806ba2ce8a9bcf68230cd1cb02379f6a13f59f3fb19fd0b7fe8391792"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/new-model-integration.mdx names \u0060invocations/new_model/\u0060, but no file or folder \u0060invocations/new_model\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/new-model-integration.mdx"},"region":{"startLine":616}}}],"partialFingerprints":{"codehealthFindingId/v1":"76638d2e630a0908964e697bf0506d96c93d45a9177fffa3a594e646e9b47068"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/contributing/new-model-integration.mdx names \u0060invokeai/backend/new_model/\u0060, but no file or folder \u0060invokeai/backend/new_model\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/contributing/new-model-integration.mdx"},"region":{"startLine":627}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6b44b77fb9a364238c8cd40988c1cfad421ec9f57fd2bb71d24feddf400ace7"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/start-here/system-requirements.mdx links to \u0060../manual\u0060, but \u0060docs/src/content/docs/manual\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/start-here/system-requirements.mdx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a86e4055b01fcf33bf8d59fcee3f3a7e847f75ccf757564069a02d8bf95fed3"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/start-here/system-requirements.mdx links to \u0060/users-guide/models/local-models/ideogram4/\u0060, but \u0060users-guide/models/local-models/ideogram4\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/start-here/system-requirements.mdx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"328aff911ddc061dbdb1b6ba2ac717cead3f5d097bc5a14cee9856c9149d2666"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/start-here/system-requirements.mdx links to \u0060/users-guide/models/local-models/qwen-image-2-1/\u0060, but \u0060users-guide/models/local-models/qwen-image-2-1\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/start-here/system-requirements.mdx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"3676092e71c7b58e6a0ff3ca5285344245daba4451b898472b06dd6c06188dfc"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/start-here/system-requirements.mdx links to \u0060../installation\u0060, but \u0060docs/src/content/docs/installation\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/start-here/system-requirements.mdx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"48e4751f2b4eb3fa62d45a84d14b50edde67e2c9e3b79fcf2b3f22aed61a05ac"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/start-here/system-requirements.mdx links to \u0060../../configuration/low-vram-mode\u0060, but \u0060docs/src/content/configuration/low-vram-mode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/start-here/system-requirements.mdx"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"874ba686ba4b3b49bb978b2777d0eea01ce732b1877488292cc310b6c7a3c3ef"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/troubleshooting/faq.mdx links to \u0060/configuration/optimization/sage-attention/\u0060, but \u0060configuration/optimization/sage-attention\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/troubleshooting/faq.mdx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"16c9e4798650f006c096e6481bfee2ffbaccb1def1360f83cd364cd08c34c241"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/troubleshooting/faq.mdx links to \u0060../../start-here/manual\u0060, but \u0060docs/src/content/start-here/manual\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/troubleshooting/faq.mdx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1f89e83ce359d34e110f5d18f217fa9447f938e170dffd4d25651d8da98c07c"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/troubleshooting/faq.mdx links to \u0060../../concepts/models\u0060, but \u0060docs/src/content/concepts/models\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/troubleshooting/faq.mdx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b1c58f530f497994e80d64eecf4502aaf7ba94e9422c18d8a867b5f0704a886"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/troubleshooting/faq.mdx links to \u0060../../start-here/system-requirements\u0060, but \u0060docs/src/content/start-here/system-requirements\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/troubleshooting/faq.mdx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a0f9827980d069acfdd5e91df611fdc9fe4f87b2bdea4cfb921f25a7d60f628"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/troubleshooting/faq.mdx links to \u0060../../configuration/low-vram-mode\u0060, but \u0060docs/src/content/configuration/low-vram-mode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/troubleshooting/faq.mdx"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"259fc258c5a4dd9c190656e651e921d11ad6ed09c076b15ea012cbba29e652a4"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/troubleshooting/faq.mdx links to \u0060../../configuration/invokeai-yaml\u0060, but \u0060docs/src/content/configuration/invokeai-yaml\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/troubleshooting/faq.mdx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"feecdc26e5c993a3812fd502f8643eeb1425d87480401862f4246cfef1ccf244"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/troubleshooting/known-bugs.mdx links to \u0060/users-guide/projects/introduction/#saving-and-syncing\u0060, but \u0060users-guide/projects/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/troubleshooting/known-bugs.mdx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee5a0888c14a622e60f483e0df2719325c856af22a657e2840f65bcf7b050612"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/01.Workbench/01.introduction.mdx links to \u0060/users-guide/projects/introduction/\u0060, but \u0060users-guide/projects/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/01.Workbench/01.introduction.mdx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"a51a7b9c8cb6aec95cf63d93bffa84de33820feea28535227b138b1ca0f8cc8d"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/01.Workbench/01.introduction.mdx links to \u0060/users-guide/workbench/hotkeys/\u0060, but \u0060users-guide/workbench/hotkeys\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/01.Workbench/01.introduction.mdx"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6f046f59543970d48bc05031e7965c48f87af8cd0a5805712b0441eee345a5e"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/01.Workbench/01.introduction.mdx links to \u0060/configuration/multi-user-mode/user-guide/\u0060, but \u0060configuration/multi-user-mode/user-guide\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/01.Workbench/01.introduction.mdx"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"8deee9d7c94d8b54ad2cd3342a0520affa31b7ced9ed9d580d5d4fa7e1547a0c"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/02.Projects/introduction.mdx links to \u0060/users-guide/workbench/introduction/\u0060, but \u0060users-guide/workbench/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/02.Projects/introduction.mdx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"9538e8ce398f46991f56ef477bcd0b7fe1a832fa79f71e3d033f9bdc869213cb"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/02.Projects/introduction.mdx links to \u0060/users-guide/gallery/introduction/\u0060, but \u0060users-guide/gallery/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/02.Projects/introduction.mdx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d3e27167ae5fb6b9816dce32677565fa7ee6a89be5c3dbc0af07cd48324bc25"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/02.Projects/introduction.mdx links to \u0060/users-guide/image-generation/intermediates/\u0060, but \u0060users-guide/image-generation/intermediates\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/02.Projects/introduction.mdx"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"4373b9de4685f018994d36f5164ded87d0a71960dcb7e53271fcc3126d2aa45d"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/01.introduction.mdx links to \u0060/users-guide/models/model-families/#model-families\u0060, but \u0060users-guide/models/model-families\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/01.introduction.mdx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"2af51606dc57feb7996c7591160d32cf9938a93da81e91d2de0445444f84d7b1"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/users-guide/models/model-format-support/\u0060, but \u0060users-guide/models/model-format-support\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fe753f7a3afb616b230b12ddd4a7a0b6ac565149c7a29bfc32fc70109d6a388"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/configuration/optimization/sdnq-quantization/\u0060, but \u0060configuration/optimization/sdnq-quantization\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"56682c0e69340a87dd02e68b834f7c0d5c62aa2b26e066ed04e1181ee7e17a28"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/configuration/optimization/fp8-storage/\u0060, but \u0060configuration/optimization/fp8-storage\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d4b7048e612dee3eede89c0c0de0c8a923bc21208e9ede8dab5a91dfcdc7d3c"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/users-guide/models/local-models/stable-diffusion-1-2/\u0060, but \u0060users-guide/models/local-models/stable-diffusion-1-2\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c8e338d2ddd151042e7ab8962e6676952aee01064a6f66e966e243c51644ab9"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/users-guide/models/local-models/sdxl/\u0060, but \u0060users-guide/models/local-models/sdxl\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad4fcf57027694bf74e386a27f9522afac4e230d195c6bfa117f4297c77337f2"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/users-guide/models/local-models/sd-3/\u0060, but \u0060users-guide/models/local-models/sd-3\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"9398d7284af9be83a5f787129f8aff204c2d62f29524223ebf8091e07c810ef6"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/users-guide/models/local-models/flux-1/\u0060, but \u0060users-guide/models/local-models/flux-1\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6348f01dbd7fd984ab66d25b7c7d2e68391f8fbac038c56db3f9903eb3bafb7"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/users-guide/models/local-models/flux-2/\u0060, but \u0060users-guide/models/local-models/flux-2\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f4c386f33f73d1d44c65956aa885e840ecf90c211d567481dc59cf8ab79bc0e"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/users-guide/models/local-models/z-image/\u0060, but \u0060users-guide/models/local-models/z-image\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c4f93913f1a2de1650f928022b4ad23818ae55fef9714ff8c19bd2730fbd58a"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/users-guide/models/local-models/ernie-image/\u0060, but \u0060users-guide/models/local-models/ernie-image\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b8c9b6b4e1b876a59d7afa79ed0aa64e5bb8a7763bc9376b07bfd630ac5c8d5"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/users-guide/models/local-models/qwen-image/\u0060, but \u0060users-guide/models/local-models/qwen-image\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"590970d3e04958f4703f953e697f3f2b1b5e0e33e3a2c6d638c8b6a83a113603"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/users-guide/models/local-models/qwen-image-2-1/\u0060, but \u0060users-guide/models/local-models/qwen-image-2-1\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"3298b5ee9079f56b3f963a8946c85faf4390317c22f39e64aa5c98fd10fe654b"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/users-guide/models/local-models/krea-2/\u0060, but \u0060users-guide/models/local-models/krea-2\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"93104824eba6a3fcd0d2686d6544e2efdd4b0adfdd56f2bcfd523db435762141"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/users-guide/models/local-models/ideogram4/\u0060, but \u0060users-guide/models/local-models/ideogram4\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"6afc134455bb31266f5d59116d0841ecfaa9a7a74aaf8b568613326a81bd6021"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/users-guide/models/local-models/anima/\u0060, but \u0060users-guide/models/local-models/anima\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c5317b139111e117c79711a9404de6bb193b2424428ac7c8266b2b271923972"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/users-guide/video-generation/wan-22/\u0060, but \u0060users-guide/video-generation/wan-22\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4e88bc89bf6f82cef84fda09522f21cc8a3657d8ee550590165f2ea46e4253a"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/users-guide/video-generation/ltx-2/\u0060, but \u0060users-guide/video-generation/ltx-2\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd06eedc7973402c6e4ab7419dbadf348ca04a518307c5d9f1d5c0b1a1d4ca3f"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/users-guide/video-generation/minimax-h3/\u0060, but \u0060users-guide/video-generation/minimax-h3\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fc94af14e9a3eb74d05e7f93c8a94a2c93d10070a90001cf36d544c20133488"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx links to \u0060/users-guide/video-generation/introduction/\u0060, but \u0060users-guide/video-generation/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"538d7f6be9ec2f58a10f6d67e0c4f58d52640bf73595cc39d9b73db1bb3a2e0e"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx links to \u0060/users-guide/models/model-families/#quantized-formats\u0060, but \u0060users-guide/models/model-families\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"26b63cd57e7f7ae76047f1ed92fff9621c5617122460b89a3aa2c153b43754ef"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx links to \u0060/users-guide/models/local-models/stable-diffusion-1-2/\u0060, but \u0060users-guide/models/local-models/stable-diffusion-1-2\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"928d1476e97aaa63251600f4cb6883e7f84d171dbc638bffd7bb4adc7f7436f3"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx links to \u0060/users-guide/models/local-models/sdxl/\u0060, but \u0060users-guide/models/local-models/sdxl\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"60295cf672f2d9cc99a492801334df58a859fa59b6541aa331d91d0d0193aa94"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx links to \u0060/users-guide/models/local-models/sd-3/\u0060, but \u0060users-guide/models/local-models/sd-3\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1bdf37f8c2f02eeb7747df41ef9b982c06a4fbf2fc3c7f7f5ae58a3980b327c"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx links to \u0060/users-guide/models/local-models/flux-1/\u0060, but \u0060users-guide/models/local-models/flux-1\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"dff32a0835a509967b44bccae4d0a2720936d0167311f6b989acbf5ff2b62d4c"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx links to \u0060/users-guide/models/local-models/flux-2/\u0060, but \u0060users-guide/models/local-models/flux-2\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"71e23a699583a8ace5df9eb6b6d5fbd0fb65d78bada71899aa50f5572fad6d0d"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx links to \u0060/users-guide/models/local-models/cogview4/\u0060, but \u0060users-guide/models/local-models/cogview4\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbea0bc052f8b780164b8d201153b7471201be220281b4b2db4eabfb7b98b6e3"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx links to \u0060/users-guide/models/local-models/z-image/\u0060, but \u0060users-guide/models/local-models/z-image\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8a2c08a3beeac730c0f8ebe5ee0a3c43a927a42d2db4bf3c5d3a2cf2000bb92"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx links to \u0060/users-guide/models/local-models/qwen-image/\u0060, but \u0060users-guide/models/local-models/qwen-image\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"81f172e51652005b1e8b68069aa8a6f112916c14f23ab8355a202a3b54fcb1a7"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx links to \u0060/users-guide/models/local-models/qwen-image-2-1/\u0060, but \u0060users-guide/models/local-models/qwen-image-2-1\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"4879cd05913788d3f8adf61f4161af7606326b97696363e9f4f408de29266463"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx links to \u0060/users-guide/models/local-models/anima/\u0060, but \u0060users-guide/models/local-models/anima\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"d14922adcd8143fb71e459891c699e4173f1d950f21dc9b5541b636f33a98fbc"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx links to \u0060/users-guide/models/local-models/krea-2/\u0060, but \u0060users-guide/models/local-models/krea-2\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"9df35c0316b9f5ea65f4a5424bd48ea70930b18208e3824a694a7d7049557641"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx links to \u0060/users-guide/models/local-models/ideogram4/\u0060, but \u0060users-guide/models/local-models/ideogram4\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed8342c80960d8d9bca5e9b1074d84ca57f5b7427dacb1a265b024df439371c5"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx links to \u0060/users-guide/models/local-models/ernie-image/\u0060, but \u0060users-guide/models/local-models/ernie-image\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbe24ff4475d99e8cfcb1209b5bd37c7680bfa156c1ad844b4dd8c5326cfb124"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx links to \u0060/users-guide/video-generation/wan-22/\u0060, but \u0060users-guide/video-generation/wan-22\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"571f3163e38655bbcc149f8dfae14dcaa96b3e92e06ab45559c8c6faa85df57f"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx links to \u0060/users-guide/video-generation/ltx-2/\u0060, but \u0060users-guide/video-generation/ltx-2\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cf6a533f4357dd015ae8a5659f1325bf7d84ac26dc7c8d562dca754e3d28c62"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx links to \u0060/users-guide/video-generation/minimax-h3/\u0060, but \u0060users-guide/video-generation/minimax-h3\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"b86ff0514c4373411b09fbb19c691c4699f83969c7faf143884e8f6ff432aa5e"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx links to \u0060/users-guide/image-generation/advanced-topics/pid-decode/\u0060, but \u0060users-guide/image-generation/advanced-topics/pid-decode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"e179869a5a550dc03159fd09073b0c4a45d4b8e29c161803f81d3dbfebfa76d5"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/01.introduction.mdx links to \u0060/users-guide/image-generation/generate-panel/\u0060, but \u0060users-guide/image-generation/generate-panel\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/01.introduction.mdx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"03f0d2ffc4fc80e6ebb24263437c3384f8a041efe4d8da17cd70c90b2fd63b2a"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/01.introduction.mdx links to \u0060/users-guide/workbench/introduction/\u0060, but \u0060users-guide/workbench/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/01.introduction.mdx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b24dfbf94d6370f11e4dde020bda008f9d256539212bd3ae802b9ef97995897"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/01.introduction.mdx links to \u0060/users-guide/models/introduction/\u0060, but \u0060users-guide/models/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/01.introduction.mdx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"07c2849b5a6e2631ab618eb4930b42aec37db8bb5ebd00d56e0d5138dd3c21b7"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/01.introduction.mdx links to \u0060/users-guide/projects/introduction/#what-a-project-keeps\u0060, but \u0060users-guide/projects/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/01.introduction.mdx"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"47f2902e28238c0cd282caef660e20cb25eaf3d57e446030c60f5a127023a0e9"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/01.introduction.mdx links to \u0060/users-guide/image-generation/prompting-guide/\u0060, but \u0060users-guide/image-generation/prompting-guide\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/01.introduction.mdx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"54bc147a668d8dd952aa13b264410499efdacabc1e34ed437be05f6a18bed9f2"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/advanced-prompt-syntax.mdx links to \u0060/users-guide/image-generation/prompting-guide/#prompt-templates\u0060, but \u0060users-guide/image-generation/prompting-guide\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/advanced-prompt-syntax.mdx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e7b56cc00a999fc3060d3cca92dbbadd427a7edbcfde4d155293a0f7d711fbd"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/generate-panel.mdx links to \u0060/users-guide/image-generation/introduction/\u0060, but \u0060users-guide/image-generation/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/generate-panel.mdx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f821c306fb7c5b2a5fdd0f1840094a2f207f774035aa631268b09f2c8caaf51"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/generate-panel.mdx links to \u0060/users-guide/models/local-models/krea-2/\u0060, but \u0060users-guide/models/local-models/krea-2\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/generate-panel.mdx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"55ee6d033d6c1ab623de08fba559bfcb2522595ecaf934509f384bef149be160"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/generate-panel.mdx links to \u0060/users-guide/models/local-models/sdxl/#sdxl-refiner\u0060, but \u0060users-guide/models/local-models/sdxl\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/generate-panel.mdx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"cefffb5c43d3a127949ab4c1d0106fe83ccbb2cdc070b9228e8961fb080396cd"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/generate-panel.mdx links to \u0060/users-guide/image-generation/advanced-topics/hidiffusion/\u0060, but \u0060users-guide/image-generation/advanced-topics/hidiffusion\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/generate-panel.mdx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"8474c3255198388f289e2e0c9f5f919b3a7e30d1bc203b7bd0751d0ddee7d2e5"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/generate-panel.mdx links to \u0060/users-guide/image-generation/advanced-topics/pid-decode/\u0060, but \u0060users-guide/image-generation/advanced-topics/pid-decode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/generate-panel.mdx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"59dd1d21a0fb619c3ce90d1144b42562d913940d4bff61be2222a17b55f77c80"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/generate-panel.mdx links to \u0060/users-guide/image-generation/prompt-tools/#prompt-triggers\u0060, but \u0060users-guide/image-generation/prompt-tools\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/generate-panel.mdx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"620d28457127651f35f3eab461d3af86462d0b3bcddfcbf2a01003e281e508f8"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/generate-panel.mdx links to \u0060/users-guide/image-generation/prompting-guide/\u0060, but \u0060users-guide/image-generation/prompting-guide\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/generate-panel.mdx"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"46900437e233b6ae5019387822d81c10cde31785eeb6a96ebeace02ee6824fa6"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/image-generation.mdx links to \u0060/users-guide/image-generation/introduction/\u0060, but \u0060users-guide/image-generation/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/image-generation.mdx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"58079aa9d9c4cacaa0c0d18e174d73a9a0076aa068d2b97974bd9e09f9a4d12b"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/image-generation.mdx links to \u0060/users-guide/image-generation/advanced-topics/diffusion/\u0060, but \u0060users-guide/image-generation/advanced-topics/diffusion\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/image-generation.mdx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"fff8b9bd161a580b300b6dc5ea39f3ec0f57a48d58a9faa3b74dcf4f25efa2ee"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/image-generation.mdx links to \u0060/users-guide/canvas/introduction/\u0060, but \u0060users-guide/canvas/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/image-generation.mdx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f66996524e34f7bc5613f9e84c8a9f0335f17503b69307132e2db999a643770"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/image-generation.mdx links to \u0060/users-guide/image-generation/generate-panel/#adding-concepts\u0060, but \u0060users-guide/image-generation/generate-panel\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/image-generation.mdx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"0178a80c4793d52b15c2c2b3232c9da62cff1ecbbf11248e3de6c1c78f802852"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/image-generation.mdx links to \u0060/users-guide/image-generation/prompt-tools/#prompt-triggers\u0060, but \u0060users-guide/image-generation/prompt-tools\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/image-generation.mdx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"64b1dc3f2dcef4e937cebc36449ae83fd30919eb40272ef52b90b3a640735be7"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/image-generation.mdx links to \u0060/users-guide/workflows/introduction/\u0060, but \u0060users-guide/workflows/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/image-generation.mdx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"6452cfcf075644d4f37d9cc4e48c5c09077f94c227c4a9fe6fed4d3ad3d73e46"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/image-generation.mdx links to \u0060/users-guide/image-generation/prompting-guide/\u0060, but \u0060users-guide/image-generation/prompting-guide\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/image-generation.mdx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bbc1ce7c9092e9581429e3861ac0bde268885efbbdb78ed5511f323d868ae9b"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/image-generation.mdx links to \u0060/users-guide/image-generation/parameters/\u0060, but \u0060users-guide/image-generation/parameters\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/image-generation.mdx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"c78fc245a83b4794dcf3e9de45999593e4bf74ffd226d8dff4ab6b5e4b04142d"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/intermediates.mdx links to \u0060/users-guide/gallery/image-storage-maintenance/\u0060, but \u0060users-guide/gallery/image-storage-maintenance\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/intermediates.mdx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"9171850217a94509ad8f3b17c45944da3bce5048c422e6e05ff8adf41732a198"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/parameters.mdx links to \u0060/users-guide/image-generation/generate-panel/#render-settings\u0060, but \u0060users-guide/image-generation/generate-panel\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/parameters.mdx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb95c20baf6e6762574acdf1b90ee7a413854c85b62c33ede69579793d78edb0"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/parameters.mdx links to \u0060/users-guide/models/model-families/#model-families\u0060, but \u0060users-guide/models/model-families\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/parameters.mdx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"09f6a076badddae22aaaaf6e9105c105a33a3ea80048d974b75e74f6f5f053f8"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/prompt-tools.md links to \u0060/users-guide/image-generation/prompting-guide/#wildcards\u0060, but \u0060users-guide/image-generation/prompting-guide\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/prompt-tools.md"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"daaa4331c9127e63013a1030443469d6781228b20edd4a5cb567d9c52bb0261a"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/prompt-tools.md links to \u0060/users-guide/models/introduction/#exporting-and-importing-model-settings\u0060, but \u0060users-guide/models/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/prompt-tools.md"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e1711aef83beec7759a5342c994d68a41560656979ea353c2e0f62c93ddeb98"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/prompting-guide.mdx links to \u0060/users-guide/image-generation/advanced-prompt-syntax/\u0060, but \u0060users-guide/image-generation/advanced-prompt-syntax\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/prompting-guide.mdx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"047975c178fc147b8506a84e8c7bd23969488d75492270d4519412f3fa280698"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/prompting-guide.mdx links to \u0060/users-guide/image-generation/prompt-tools/\u0060, but \u0060users-guide/image-generation/prompt-tools\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/prompting-guide.mdx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad82c2e100dd274dbfbf1c44dc5bd41b4c38bf8ecaf700e24c4c7d9cb3fa70ac"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/prompting-guide.mdx links to \u0060/users-guide/image-generation/generate-panel/#negative-prompt\u0060, but \u0060users-guide/image-generation/generate-panel\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/prompting-guide.mdx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c59294a34d46a082dfbd5864b02ff5e8108a3ef015a37682cfa767516ce3b1b"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/04.Image Generation/upscale.mdx links to \u0060/configuration/optimization/low-vram-mode/\u0060, but \u0060configuration/optimization/low-vram-mode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/04.Image Generation/upscale.mdx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"78dc4f3412b22c2f8797472ab02453248d11a734c76d178a619c52285b60a80c"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/05.Video Generation/introduction.mdx links to \u0060../wan-22\u0060, but \u0060docs/src/content/docs/Users Guide/wan-22\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/05.Video Generation/introduction.mdx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"7399e3a3cccebc2e70fad7098406c382f9ac977f271be3f9bdc8f61c6574683e"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/05.Video Generation/introduction.mdx links to \u0060../minimax-h3\u0060, but \u0060docs/src/content/docs/Users Guide/minimax-h3\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/05.Video Generation/introduction.mdx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"a95c8b84733cb679af98591c2e2ea825166ce7638dd56c7be10d2d19d1cfa126"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/05.Video Generation/introduction.mdx links to \u0060/users-guide/video-generation/minimax-h3/#the-hybrid-fl2va-quality-with-ref2va-conditioning\u0060, but \u0060users-guide/video-generation/minimax-h3\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/05.Video Generation/introduction.mdx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"e315c8cec3b3a341204788c2d60102d793a1815263756749bc21c6dd97a9d520"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/05.Video Generation/introduction.mdx links to \u0060../ltx-2\u0060, but \u0060docs/src/content/docs/Users Guide/ltx-2\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/05.Video Generation/introduction.mdx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb6b9b907f21b319ab9455db4f9701a6dcc215b846b49a330f8ff62f4f6f2afd"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/05.Video Generation/introduction.mdx links to \u0060/users-guide/video-generation/video-workflows/\u0060, but \u0060users-guide/video-generation/video-workflows\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/05.Video Generation/introduction.mdx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"1270534f910212efb6ea14e060cb75cb1b6acfe3973ee95edab85f86afd25557"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/05.Video Generation/introduction.mdx links to \u0060/users-guide/image-generation/prompt-tools/#prompt-enhancement-for-ltx-25\u0060, but \u0060users-guide/image-generation/prompt-tools\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/05.Video Generation/introduction.mdx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cc77ace28b17f39650a99ca4d2579fbc47e8a6fb6210e60cdb499acc09fb024"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/05.Video Generation/introduction.mdx links to \u0060/users-guide/video-generation/ltx-2/#the-distilled-lora-fast-path-on-dev\u0060, but \u0060users-guide/video-generation/ltx-2\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/05.Video Generation/introduction.mdx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fbe84e0fca888b6fe3f181e8451ab6627b7a2378d4e35f6843bc68ad78178de"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/05.Video Generation/introduction.mdx links to \u0060/development/architecture/media-metadata/\u0060, but \u0060development/architecture/media-metadata\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/05.Video Generation/introduction.mdx"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"a79099d2e92e25faf1ae0f07d0dcb4fb15844fefc9429842bbfdff77d8a578c3"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/05.Video Generation/video-workflows.mdx links to \u0060/users-guide/video-generation/introduction/\u0060, but \u0060users-guide/video-generation/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/05.Video Generation/video-workflows.mdx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"01921e175df8a2ba804560a0dc823e941feb82bc3c03bb36884e7a007ef6ad51"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/05.Video Generation/video-workflows.mdx links to \u0060/users-guide/video-generation/minimax-h3/#installing-minimax-h3\u0060, but \u0060users-guide/video-generation/minimax-h3\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/05.Video Generation/video-workflows.mdx"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed20227818228093a36d95601f10a482c6efff690b350833f86e2dee5a48b0f5"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/05.Video Generation/wan-2.2.mdx links to \u0060../introduction#conditioning-clip-ltx-2-only\u0060, but \u0060docs/src/content/docs/Users Guide/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/05.Video Generation/wan-2.2.mdx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"7506a9e81fae9716684d4940c56f91f844e4eb6878089822a545070fe71a9825"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/06.Gallery/gallery-reference.mdx links to \u0060/users-guide/gallery/introduction/\u0060, but \u0060users-guide/gallery/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/06.Gallery/gallery-reference.mdx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"727ed3af148f5a0cf29faa7cf31c189b4dbe3f8ad33a1aac696c9d5fe2b644aa"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/06.Gallery/gallery-reference.mdx links to \u0060/configuration/multi-user-mode/user-guide/#image-boards\u0060, but \u0060configuration/multi-user-mode/user-guide\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/06.Gallery/gallery-reference.mdx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb39ffd392847789664f6a51d71621a0fe44b3d866b3db2aff54032a229effb0"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/06.Gallery/gallery-reference.mdx links to \u0060/users-guide/workbench/hotkeys/\u0060, but \u0060users-guide/workbench/hotkeys\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/06.Gallery/gallery-reference.mdx"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbc2e72507886edd00543a2ed86ea8437169ffc6e08115798a6b5935d5a72ae0"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/06.Gallery/image-storage-maintenance.mdx links to \u0060/configuration/invokeai-yaml/#image-subfolder-strategy\u0060, but \u0060configuration/invokeai-yaml\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/06.Gallery/image-storage-maintenance.mdx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"70f5f825ecda375f16ab7807bcd473df13d132c32a3f98fe56c77dd2775eb45e"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/06.Gallery/introduction.mdx links to \u0060/users-guide/gallery/gallery-reference/#gallery-settings\u0060, but \u0060users-guide/gallery/gallery-reference\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/06.Gallery/introduction.mdx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"c82d3746309b88dc4a0c9574d2eb16b2b3184ecd40c96105c6ddefa7b41090d8"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/06.Gallery/introduction.mdx links to \u0060/users-guide/image-map/introduction/\u0060, but \u0060users-guide/image-map/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/06.Gallery/introduction.mdx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b15770eaa3387e94df4585bad370fee998d4e537d7a72bed2f827eba7c30c58"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/06.Gallery/introduction.mdx links to \u0060/users-guide/gallery/image-storage-maintenance/\u0060, but \u0060users-guide/gallery/image-storage-maintenance\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/06.Gallery/introduction.mdx"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcbef0adaa450908a3f84a18cc5e7cf272b4fb31c843c38f5dd9fbad0a661646"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/06.Gallery/introduction.mdx links to \u0060/users-guide/image-generation/intermediates/\u0060, but \u0060users-guide/image-generation/intermediates\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/06.Gallery/introduction.mdx"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"3272384522b26f5a78a50a57317719ebeb82a495817f52c790d5d92d7915c1ec"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/07.Canvas/01.introduction.mdx links to \u0060/users-guide/canvas/canvas-guide/\u0060, but \u0060users-guide/canvas/canvas-guide\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/07.Canvas/01.introduction.mdx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"50f38089e3b60edd004dea23885ef7969896d080ebd823d7be054ed8d02cd658"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/07.Canvas/01.introduction.mdx links to \u0060/users-guide/canvas/layers-panel/\u0060, but \u0060users-guide/canvas/layers-panel\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/07.Canvas/01.introduction.mdx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"fed5ad1b39726cc9e67f889cd963b8aee043ae71bf23db05c8a4c443a7ab2e75"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/07.Canvas/01.introduction.mdx links to \u0060/users-guide/image-generation/introduction/#routing-images-to-the-gallery-or-the-canvas\u0060, but \u0060users-guide/image-generation/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/07.Canvas/01.introduction.mdx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cf45c57f4cd6bebc71ba10b41e7fe07a05e67c6824499a392e83c4dfa66f815"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/07.Canvas/02.canvas-guide.mdx links to \u0060/users-guide/canvas/introduction/\u0060, but \u0060users-guide/canvas/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/07.Canvas/02.canvas-guide.mdx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa83997dd31394623ffff76ca8531ffc8e14030f95f442350806bfef49eb7ff2"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/07.Canvas/02.canvas-guide.mdx links to \u0060/users-guide/canvas/layers-panel/\u0060, but \u0060users-guide/canvas/layers-panel\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/07.Canvas/02.canvas-guide.mdx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"efaec3e57df8a38c19add87cdd5626ea93e05b7f66bf85dd6cf14940b9788e8f"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/07.Canvas/02.canvas-guide.mdx links to \u0060/users-guide/projects/introduction/#exporting-and-importing\u0060, but \u0060users-guide/projects/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/07.Canvas/02.canvas-guide.mdx"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"6481fe7a2ccda6f04ed238210ddf7118dd0119307f960c7f8548c8417d1a8c8d"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/07.Canvas/03.layers-panel.mdx links to \u0060/users-guide/canvas/introduction/#canvas-concepts\u0060, but \u0060users-guide/canvas/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/07.Canvas/03.layers-panel.mdx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5a41ca5789e9bb4300917bb7eab3086ea5c05a146248c9bb9450e318c2423fa"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/07.Canvas/03.layers-panel.mdx links to \u0060/users-guide/canvas/canvas-guide/#tools\u0060, but \u0060users-guide/canvas/canvas-guide\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/07.Canvas/03.layers-panel.mdx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"a65c50a1c15db12a31016e163306970432fdd2a3b9b7d58cdd410f95f0343206"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/08.Workflows/01.introduction.mdx links to \u0060/users-guide/image-generation/advanced-topics/diffusion/\u0060, but \u0060users-guide/image-generation/advanced-topics/diffusion\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/08.Workflows/01.introduction.mdx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"87cdfaff0c790f8b7b72fe0453cfd700159143fb634c6fb1ab9cff46690ef756"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/08.Workflows/01.introduction.mdx links to \u0060/users-guide/workflows/editor-reference/\u0060, but \u0060users-guide/workflows/editor-reference\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/08.Workflows/01.introduction.mdx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b90dd0ac6cf21555915158af1782343f432d8a58532ecea7b9d6b7ec46d6b29"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/08.Workflows/01.introduction.mdx links to \u0060/users-guide/workflows/loop-nodes/\u0060, but \u0060users-guide/workflows/loop-nodes\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/08.Workflows/01.introduction.mdx"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"f73c3d814f26b58fe139aea635d5b57204ffe65862e5a16258ed4ff21b7856fe"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/08.Workflows/01.introduction.mdx links to \u0060/users-guide/workflows/face-tools/\u0060, but \u0060users-guide/workflows/face-tools\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/08.Workflows/01.introduction.mdx"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"167c98f24ea87e8011516fcb28481620393c8da165011bc068dea7c2a5db938f"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/08.Workflows/01.introduction.mdx links to \u0060/users-guide/workflows/community-nodes/\u0060, but \u0060users-guide/workflows/community-nodes\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/08.Workflows/01.introduction.mdx"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"eba363b68779557c7ccd0fa77231f778dbd340cba55402e0d7807113bfb7643e"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/08.Workflows/01.introduction.mdx links to \u0060/users-guide/workflows/custom-node-manager/\u0060, but \u0060users-guide/workflows/custom-node-manager\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/08.Workflows/01.introduction.mdx"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e41f4efafe7e2705e37ef64c75df2120c86072e91c395ad648cd85377ec0f09"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/08.Workflows/01.introduction.mdx links to \u0060/users-guide/workflows/comfyui-migration/\u0060, but \u0060users-guide/workflows/comfyui-migration\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/08.Workflows/01.introduction.mdx"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ed0a60ce6568c69a1a1312bce1509d808c6cb105b5f4f07186f839f7e9f2980"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/08.Workflows/comfyui-migration.mdx links to \u0060../community-nodes\u0060, but \u0060docs/src/content/docs/Users Guide/community-nodes\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/08.Workflows/comfyui-migration.mdx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"681ee465657a49a99b2fa24970685553f5c42a4e9f9b3dd45c2866601dbbabbf"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/08.Workflows/community-nodes.mdx links to \u0060/users-guide/workflows/introduction/\u0060, but \u0060users-guide/workflows/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/08.Workflows/community-nodes.mdx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb7f8998831074c783bb838b164244f8d6eee29defd22b13d3a62ba7c214f52f"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/08.Workflows/community-nodes.mdx links to \u0060/development/guides/creating-nodes/\u0060, but \u0060development/guides/creating-nodes\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/08.Workflows/community-nodes.mdx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc83b7ab08357f85ed23df4d8605e8a933506029b666f4c548de913d9b59a647"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/08.Workflows/custom-node-manager.mdx links to \u0060/development/guides/creating-nodes/\u0060, but \u0060development/guides/creating-nodes\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/08.Workflows/custom-node-manager.mdx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"77904d92d3ccf54873d8165ff879b62ffcffcf96622b250ef09830b0633bfedd"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/08.Workflows/editor-reference.mdx links to \u0060/users-guide/workflows/introduction/\u0060, but \u0060users-guide/workflows/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/08.Workflows/editor-reference.mdx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec2769054683ed6e769d4e3304d3bdf8a369677f35e8a828280a58090a49e4ae"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/08.Workflows/loop-nodes.mdx links to \u0060/contributing/loop-nodes/\u0060, but \u0060contributing/loop-nodes\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/08.Workflows/loop-nodes.mdx"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7b6a15bb5d648272a96583890205cef54a3869838cf33da53bf16a0ae88fead"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/09.Image Map/01.introduction.mdx links to \u0060/users-guide/gallery/introduction/#searching-by-content\u0060, but \u0060users-guide/gallery/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/09.Image Map/01.introduction.mdx"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"53ea25a1886054393b72b041f8da278ed011332dcaf8b321fdffa32380ca0f13"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Multi-User Mode/admin-guide.mdx links to \u0060/configuration/multi-user-mode/user-guide/#adding-and-modifying-users\u0060, but \u0060configuration/multi-user-mode/user-guide\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Multi-User Mode/admin-guide.mdx"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a08adc28e8a98839176120b0bf9173d3e304099e136fc43b6eb71a9e1bc325c"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Multi-User Mode/admin-guide.mdx links to \u0060/users-guide/models/introduction/\u0060, but \u0060users-guide/models/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Multi-User Mode/admin-guide.mdx"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"75000fb9e713032bcc1be603c4b01ede7012609c3714ab38a77e53aa9e7fa31c"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Multi-User Mode/admin-guide.mdx documents the environment variable \u0060CURL_CA_BUNDLE\u0060, but no code, script or configuration file names it. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Multi-User Mode/admin-guide.mdx"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"850596633b8fb510129b770893c772ab8a70a41198744051e313da87f65f1b50"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Multi-User Mode/admin-guide.mdx links to \u0060/configuration/external-database/\u0060, but \u0060configuration/external-database\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Multi-User Mode/admin-guide.mdx"},"region":{"startLine":407}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a96b02af6f2e0cfd0f1b5de0c4709f00a6f5e9630fc5a30018a15de70761d8e"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Multi-User Mode/admin-guide.mdx links to \u0060/configuration/multi-user-mode/api-guide/\u0060, but \u0060configuration/multi-user-mode/api-guide\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Multi-User Mode/admin-guide.mdx"},"region":{"startLine":774}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbf3f00ace622e304c1f5e74aa41b0dd216484c827ca18f3d65904ffda6aac24"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Multi-User Mode/api-guide.mdx links to \u0060/development/front-end/project-files/\u0060, but \u0060development/front-end/project-files\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Multi-User Mode/api-guide.mdx"},"region":{"startLine":927}}}],"partialFingerprints":{"codehealthFindingId/v1":"10399df8a14818e30df8498122b95b2cd35f535c1ad51ae7e3de1b43ee749863"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Multi-User Mode/api-guide.mdx links to \u0060/development/guides/workflow-api/\u0060, but \u0060development/guides/workflow-api\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Multi-User Mode/api-guide.mdx"},"region":{"startLine":1142}}}],"partialFingerprints":{"codehealthFindingId/v1":"a27b6e0c7b8f8c6a1d523524b18ae2b622c566bf48a12db06cdc6ab168b2c263"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Multi-User Mode/api-guide.mdx links to \u0060/configuration/multi-user-mode/user-guide/\u0060, but \u0060configuration/multi-user-mode/user-guide\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Multi-User Mode/api-guide.mdx"},"region":{"startLine":1272}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b1f1fce276c8d8617f0b89a9ef52ba66a6fffdd70ad281e78864bb169eb79f7"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Multi-User Mode/api-guide.mdx links to \u0060/configuration/multi-user-mode/admin-guide/\u0060, but \u0060configuration/multi-user-mode/admin-guide\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Multi-User Mode/api-guide.mdx"},"region":{"startLine":1273}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f77ed3454e7dec75f29f4b7d4d022424ecb524e4bdd65dd5b43e273cd7d71b0"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Multi-User Mode/api-guide.mdx links to \u0060/troubleshooting/faq/\u0060, but \u0060troubleshooting/faq\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Multi-User Mode/api-guide.mdx"},"region":{"startLine":1278}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab03787f94404ddb76e8da4bedc395b1e37306610f728ede3e43102d62ec4a69"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Multi-User Mode/user-guide.mdx links to \u0060/configuration/multi-user-mode/api-guide/\u0060, but \u0060configuration/multi-user-mode/api-guide\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Multi-User Mode/user-guide.mdx"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"2261a0cad578ab9dbc5aadbf59e15a9d2b801b3a8578b92762dbd6cf392c0b4b"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Multi-User Mode/user-guide.mdx links to \u0060/troubleshooting/faq/\u0060, but \u0060troubleshooting/faq\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Multi-User Mode/user-guide.mdx"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"325711cbcbcd76731ce93cf29cb1132d48440bfd5536c91ed0f8fe48192eb9b3"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Multi-User Mode/user-guide.mdx links to \u0060/configuration/multi-user-mode/admin-guide/\u0060, but \u0060configuration/multi-user-mode/admin-guide\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Multi-User Mode/user-guide.mdx"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"649ddac67a1bfe74e6035c1d68fc8dafe467b7ecc34bb9fdccb088c0671773b4"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Optimization/fp8-storage.mdx links to \u0060/configuration/optimization/low-vram-mode/\u0060, but \u0060configuration/optimization/low-vram-mode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Optimization/fp8-storage.mdx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2ebf1ac6690f4773b795b89f0eba9c3b93a56d68cf78620cbb885934d2120bb"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Optimization/low-vram-mode.mdx links to \u0060/users-guide/image-generation/upscale/\u0060, but \u0060users-guide/image-generation/upscale\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Optimization/low-vram-mode.mdx"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"d601861b62084021ee17709a8101a9240f6a65280d835787ebba08d9f82e1695"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Optimization/low-vram-mode.mdx links to \u0060/users-guide/image-generation/advanced-topics/pid-decode/\u0060, but \u0060users-guide/image-generation/advanced-topics/pid-decode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Optimization/low-vram-mode.mdx"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"605469e839929ee82b91585f9369f8b06d4d0a1a86b97fe7a436d803de999eff"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Optimization/sage-attention.mdx links to \u0060/configuration/invokeai-yaml/\u0060, but \u0060configuration/invokeai-yaml\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Optimization/sage-attention.mdx"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"92ba7d879d2bdfd26ff1375bdc1e821ce2c1e07a6fb7e20a063129a66bb2b005"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Optimization/sdnq-quantization.mdx links to \u0060/configuration/optimization/low-vram-mode/\u0060, but \u0060configuration/optimization/low-vram-mode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Optimization/sdnq-quantization.mdx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd293fff49fc27b2909832df6cafe3882ad21d73175bcf7810593683763cfa65"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/configuration/Optimization/sdnq-quantization.mdx links to \u0060/configuration/optimization/fp8-storage/#where-the-toggle-is-shown\u0060, but \u0060configuration/optimization/fp8-storage\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/configuration/Optimization/sdnq-quantization.mdx"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"d47a6befc4cea23ff2e9847dff2f1b754c5827da966151e7a73c85db5d007343"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Architecture/invocations.mdx links to \u0060/users-guide/workflows/community-nodes/\u0060, but \u0060users-guide/workflows/community-nodes\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Architecture/invocations.mdx"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"97aa53ecf3223ff4183c2695a56e69c9fbaab4a51bf9c454564f78c657a622e1"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Architecture/invocations.mdx links to \u0060/development/guides/creating-nodes/\u0060, but \u0060development/guides/creating-nodes\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Architecture/invocations.mdx"},"region":{"startLine":320}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d8c5ca78567611d198c15a2e1b5fefcbc60227d7fccd8d6d10b333dc0438d81"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Architecture/media-metadata.mdx links to \u0060/development/guides/video-recall-api/\u0060, but \u0060development/guides/video-recall-api\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Architecture/media-metadata.mdx"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fe7dac071e4430983a59f460f96df3e7a9788b027cb8c13a50796f79ece7a56"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Architecture/model-manager.mdx names \u0060invokeai.backend.model_manager.config\u0060, but no file or folder \u0060invokeai.backend.model_manager.config\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Architecture/model-manager.mdx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"166d881f0c70799673c583e59413171760b3a8601f2d29ab6bf4f60c5c3532cb"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Architecture/model-manager.mdx links to \u0060/development/guides/database-layer/\u0060, but \u0060development/guides/database-layer\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Architecture/model-manager.mdx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d4a559863ab858ca68576cc6721fa0b35a294bb414146b16d39ffe8d14e18e4"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Architecture/overview.mdx links to \u0060/development/architecture/invocations/\u0060, but \u0060development/architecture/invocations\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Architecture/overview.mdx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ac5152aa4373e4c41072c02645890e9ad716bf6b05a066363738a7b0d4abc2a"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Documentation/index.mdx names \u00602.0-migration.mdx\u0060, but no file or folder \u00602.0-migration.mdx\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Documentation/index.mdx"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"b609bb78a4e919e152c9aa96ed2c2dddf16879d996037ef3a2e2f740d3bbbbe9"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Documentation/index.mdx links to \u0060/configuration/invokeai-yaml\u0060, but \u0060configuration/invokeai-yaml\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Documentation/index.mdx"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"8667fd0614368df5d5965d567207fcd8c12c0e4a50931636359c01999cc01557"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Documentation/index.mdx links to \u0060/development/guides/api-development\u0060, but \u0060development/guides/api-development\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Documentation/index.mdx"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ab9f6b6ca13fa8b66c7c5c10ac57aa459d941b6ea3b67cc24d9e64c4cb97394"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Front End/canvas-projects.mdx links to \u0060/development/front-end/project-files/\u0060, but \u0060development/front-end/project-files\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Front End/canvas-projects.mdx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0b5556f35c72be9a8817d1af458fad9c9e34eb06005821027d50e2de5fe742f"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Front End/canvas-projects.mdx names \u0060canvas_state.json\u0060, but no file or folder \u0060canvas_state.json\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Front End/canvas-projects.mdx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ad5b1e6b589ebb87a065c8b27a5bd56ca793ee36b26118377b3a694f81650f0"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Front End/canvas-projects.mdx names \u0060ref_images.json\u0060, but no file or folder \u0060ref_images.json\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Front End/canvas-projects.mdx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1841326c65842a99533c75e9c70a1151cd47f74ae7563a4795e1bac8140d05e"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Front End/index.md links to \u0060/development/setup/dev-environment/\u0060, but \u0060development/setup/dev-environment\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Front End/index.md"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"135fc9de35e6d291e9b9fcca2bce6037f0f1bbba05a1cd162ece5a83a12071f4"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Front End/index.md links to \u0060./workflows/\u0060, but \u0060docs/src/content/docs/development/Front End/workflows\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Front End/index.md"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"faac61850b8d3ad52907d9778f6e90956a5bb7296492bc99fb32bce95562622d"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Front End/index.md links to \u0060./state-management/\u0060, but \u0060docs/src/content/docs/development/Front End/state-management\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Front End/index.md"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bd76f828a41e94260fd0378a0b7534e8588787de58e72f603905ed58094dd2f"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Guides/creating-node-pack.mdx links to \u0060invocation-api.md\u0060, but \u0060docs/src/content/docs/development/Guides/invocation-api.md\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Guides/creating-node-pack.mdx"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d7b95e5f65555a6a53a57723d2a2ceb5577f36c6bb0b436f3c9c03caa2d6065"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Guides/creating-nodes.mdx links to \u0060/users-guide/workflows/community-nodes/\u0060, but \u0060users-guide/workflows/community-nodes\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Guides/creating-nodes.mdx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0dca7fb42032026b9227f60348ce302bedadf9281ff5d9d24d583905be1e6a9"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Guides/recall-api.mdx links to \u0060/development/guides/video-recall-api/\u0060, but \u0060development/guides/video-recall-api\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Guides/recall-api.mdx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"87b42e24ee39f3e75cb7648e01b0b49f4501de00c80cdee64786bd4ca487082f"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Guides/sqlite-migrations.mdx links to \u0060/development/guides/database-layer/\u0060, but \u0060development/guides/database-layer\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Guides/sqlite-migrations.mdx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"6812eabb19f9d40c6d56c40ac743371a121d0d885c6162e9af3e4709acc2e682"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Guides/sqlite-migrations.mdx documents the environment variable \u0060YYYY_MM_DD\u0060, but no code, script or configuration file names it. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Guides/sqlite-migrations.mdx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"f027b7f6d0cb14035d8b01e4de0bf6e37085f39f5e718f33b8f63ba41f9376b0"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Guides/video-recall-api.mdx links to \u0060/development/guides/recall-api/\u0060, but \u0060development/guides/recall-api\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Guides/video-recall-api.mdx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c81c7d57ee2ce8f43be22f3aea92388d0e4749e83e85ddc6226c67d4070c1d1"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Guides/video-recall-api.mdx links to \u0060/development/architecture/media-metadata/\u0060, but \u0060development/architecture/media-metadata\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Guides/video-recall-api.mdx"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"82e9edcf8de9e6f3e2842e1303566d3126025883acc9b78bf72508dea6d40f3d"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Process/release-process.mdx links to \u0060/start-here/manual/\u0060, but \u0060start-here/manual\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Process/release-process.mdx"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4ce1e980bcc6303cf4e4601211d1cc8cea14d8bfb4476ecfd7a8d4f15c29d39"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Setup/dev-environment.mdx links to \u0060/start-here/manual/\u0060, but \u0060start-here/manual\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Setup/dev-environment.mdx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdd4b2a5057c2d16fb62abcbfb4e486985bf62895f07eeddedc500f933a3882d"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/development/Setup/dev-environment.mdx links to \u0060/development/guides/tests/\u0060, but \u0060development/guides/tests\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/development/Setup/dev-environment.mdx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"a782e295b85d97230e281484ef7b1993d411d271dd56164799ba99c89130a735"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/External Models/01.introduction.mdx links to \u0060/users-guide/models/external-models/gemini/\u0060, but \u0060users-guide/models/external-models/gemini\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/External Models/01.introduction.mdx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e8c186a0730d604cd502fd78d0af15f4f8134e8de9395ee836bd279a45fff68"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/External Models/01.introduction.mdx links to \u0060/users-guide/models/external-models/openai/\u0060, but \u0060users-guide/models/external-models/openai\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/External Models/01.introduction.mdx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"0848c6cc5e44cde86bd9d5ace650a0b92a3593cbf27a52708749f4dda8532a42"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/External Models/01.introduction.mdx links to \u0060/users-guide/models/external-models/seedream/\u0060, but \u0060users-guide/models/external-models/seedream\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/External Models/01.introduction.mdx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"baa0da549d27f130756578be459899969b0d9098869ca67b84b4ba7a46d1050b"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/External Models/01.introduction.mdx links to \u0060/users-guide/models/external-models/alibabacloud/\u0060, but \u0060users-guide/models/external-models/alibabacloud\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/External Models/01.introduction.mdx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"6467c97b6b666955bcac72e96c2d26e8aa789e3f3b84279b607cbd6f86f2dae8"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/External Models/01.introduction.mdx names \u0060api_keys.yaml\u0060, but no file or folder \u0060api_keys.yaml\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/External Models/01.introduction.mdx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e208af97f8cdb7be502a0a75684a1f7f5197477e545cb47567497902fdbb34f"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/anima.mdx links to \u0060/configuration/optimization/low-vram-mode/\u0060, but \u0060configuration/optimization/low-vram-mode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/anima.mdx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"9914d84c66e4f86969cabbdc66e56f43b7b20254c6af0fb88fc8bcbe2f20b071"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/anima.mdx links to \u0060/configuration/optimization/fp8-storage/\u0060, but \u0060configuration/optimization/fp8-storage\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/anima.mdx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"027b3280cba968ee21f036085f90902574f344ad987276c4aa802e12495312f7"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/cogview4.mdx links to \u0060/start-here/system-requirements/\u0060, but \u0060start-here/system-requirements\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/cogview4.mdx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"8622521e621eed8bbe5b810b1f42b34553af4695017b9b39352d8776a0dc55d2"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/cogview4.mdx links to \u0060/configuration/optimization/low-vram-mode/\u0060, but \u0060configuration/optimization/low-vram-mode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/cogview4.mdx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"2226d656f4d30807db823a62bf258912aa5f9fe7d10056727c55509831b5d442"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/cogview4.mdx links to \u0060/users-guide/image-generation/advanced-prompt-syntax/#attention-weighting\u0060, but \u0060users-guide/image-generation/advanced-prompt-syntax\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/cogview4.mdx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae425e8bfba8d5976e192372a8ad7d349da6484976d946735556f93ca89d1503"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/ernie-image.mdx links to \u0060/start-here/system-requirements/\u0060, but \u0060start-here/system-requirements\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/ernie-image.mdx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"e90924fc8194c6ed11b81bece3e0b11d8a336f20314dd0da0a32abc5a71d30b2"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/ernie-image.mdx links to \u0060/configuration/optimization/low-vram-mode/\u0060, but \u0060configuration/optimization/low-vram-mode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/ernie-image.mdx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"75dd03dee0bc515141bf2bb8078223fc12b1f4dbf8fb30b862baf24c1aed7757"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/flux-1.mdx links to \u0060/start-here/system-requirements/\u0060, but \u0060start-here/system-requirements\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/flux-1.mdx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"32d9b54997cb3c469492f6337d625ed6cdd48d4c987a307c18f2851bc4706d21"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/flux-1.mdx links to \u0060/configuration/optimization/fp8-storage/\u0060, but \u0060configuration/optimization/fp8-storage\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/flux-1.mdx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a33096565f0f425c7e68461085f4343bf483c0388dcc9f0206e1db15830da04"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/flux-1.mdx links to \u0060/configuration/optimization/low-vram-mode/\u0060, but \u0060configuration/optimization/low-vram-mode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/flux-1.mdx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"843f9d55af092ed2f4c53d856dc8bdbc4426151297fb197e75bf1b394d6da148"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/flux-1.mdx links to \u0060/configuration/optimization/sdnq-quantization/\u0060, but \u0060configuration/optimization/sdnq-quantization\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/flux-1.mdx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"32ddab2d5a4aa6465474d8e8b8231dfda426639fb68f0b49070fca9bdd90ca95"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/flux-1.mdx links to \u0060/users-guide/image-generation/advanced-topics/pid-decode/\u0060, but \u0060users-guide/image-generation/advanced-topics/pid-decode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/flux-1.mdx"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"5547c55e67a00a8f9a19577ac387b5d8e9c961f1ba8cace5660a51adb54cf843"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/flux-2.mdx links to \u0060/start-here/system-requirements/\u0060, but \u0060start-here/system-requirements\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/flux-2.mdx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b5db8eca6075fac5127b9672923d131cf7725f1d934f779e6fb91816678b27d"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/flux-2.mdx links to \u0060/configuration/optimization/fp8-storage/\u0060, but \u0060configuration/optimization/fp8-storage\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/flux-2.mdx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"9105a6a83842c115d5e8d2c0e1564145ac843bc463aee39656a20c142169a751"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/flux-2.mdx links to \u0060/configuration/optimization/sdnq-quantization/\u0060, but \u0060configuration/optimization/sdnq-quantization\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/flux-2.mdx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"003dde907901c7fd1c0344e61e20a682a052f6a265c379996592c3042548b63f"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/flux-2.mdx links to \u0060/users-guide/image-generation/advanced-topics/pid-decode/\u0060, but \u0060users-guide/image-generation/advanced-topics/pid-decode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/flux-2.mdx"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a7de0bda287d4fd53081b6bda2595b827604f8a1aa1ccdb45f470ff3545c72b"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/flux-2.mdx links to \u0060/configuration/optimization/low-vram-mode/#tiled-vae-decode-and-encode\u0060, but \u0060configuration/optimization/low-vram-mode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/flux-2.mdx"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cb3057fc0ac93bf8030a042417cd05a089ce6cf62ee7b511f0bbdca6219ee48"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/ideogram4.mdx links to \u0060/configuration/invokeai-yaml/\u0060, but \u0060configuration/invokeai-yaml\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/ideogram4.mdx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"e085d6c0a27dc1a5942cd670bf3bc205f3091a496fe7cad72b9aa78d55477a9c"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/ideogram4.mdx links to \u0060/users-guide/models/local-models/krea-2/#qwen3-vl-gguf-encoders\u0060, but \u0060users-guide/models/local-models/krea-2\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/ideogram4.mdx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"478ed7fcba2fd1b17a64ed16f9d045fd7122a861897ebc3289feb6d9b2f4ae56"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/ideogram4.mdx names \u0060vae/flux2-vae.safetensors\u0060, but no file or folder \u0060vae/flux2-vae.safetensors\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/ideogram4.mdx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"aefe10f9533ae9f4f2d0d1ce36ae6594802470395e21d985561da12af457704f"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/krea-2.mdx links to \u0060/start-here/system-requirements/\u0060, but \u0060start-here/system-requirements\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/krea-2.mdx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"7079c79f98c9a1bbeee7f56a6e1175ec56836a76c6e824a91bd5d6620503bb1f"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image-2-1.mdx links to \u0060/users-guide/models/local-models/qwen-image/\u0060, but \u0060users-guide/models/local-models/qwen-image\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image-2-1.mdx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"5730bb746e2f840485f665cb86acec1b0dae169b20d6d1e7b1060b7014e19145"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image-2-1.mdx links to \u0060/users-guide/models/local-models/ideogram4/\u0060, but \u0060users-guide/models/local-models/ideogram4\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image-2-1.mdx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8f9f7d95aac3fc9f4be5ca21f63d34b9d6dabd81e130ae8d0afdc0340dc6414"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image-2-1.mdx links to \u0060/configuration/optimization/low-vram-mode/\u0060, but \u0060configuration/optimization/low-vram-mode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image-2-1.mdx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ada1515bbc0092b37529c553190ce79d49e912b5c08d1d42af88e18b31e8b3a"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image.mdx links to \u0060/configuration/optimization/low-vram-mode/\u0060, but \u0060configuration/optimization/low-vram-mode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image.mdx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"04296a8403214c6d775052aab7b58650183a137d331349ae6d53497efad5f510"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image.mdx links to \u0060/configuration/optimization/fp8-storage/\u0060, but \u0060configuration/optimization/fp8-storage\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image.mdx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2e27c4da13308ff18b5c285cf8c6194901756e1378f9c14332233dd9bb204c0"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image.mdx links to \u0060/users-guide/image-generation/advanced-topics/pid-decode/\u0060, but \u0060users-guide/image-generation/advanced-topics/pid-decode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image.mdx"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d04fc8ff68ec35693dfaa5bc94546b5c0c909d0826d5cddb3572ae010e69f02"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/sd-3.mdx links to \u0060/start-here/system-requirements/\u0060, but \u0060start-here/system-requirements\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/sd-3.mdx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"37d71bd68876259a8e566a90e10e6c23d63dbbb1a846f1b71e2e76481b38ae94"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/sd-3.mdx links to \u0060/configuration/optimization/low-vram-mode/\u0060, but \u0060configuration/optimization/low-vram-mode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/sd-3.mdx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"1431fc0459cfa67421826ddf59b535b4ba0a136faaa8ace488db395d7d28b921"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/sd-3.mdx links to \u0060/users-guide/models/introduction/#external-models\u0060, but \u0060users-guide/models/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/sd-3.mdx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"1094fba099aaa6401e58a29f101a97dd53c285a4aa4e430addaf98c5c20d5d7e"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/sd-3.mdx links to \u0060/users-guide/image-generation/advanced-topics/pid-decode/\u0060, but \u0060users-guide/image-generation/advanced-topics/pid-decode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/sd-3.mdx"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"d71b95d41e02615c71a9a25c44a7b3110b3df40d769995a502dba3dc51db7188"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/sdxl.mdx links to \u0060/start-here/system-requirements/\u0060, but \u0060start-here/system-requirements\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/sdxl.mdx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f003321bb4614cbcf7df891e177a6beb3f71cc2d9d9877c789bb18e05555020"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/sdxl.mdx links to \u0060/configuration/optimization/low-vram-mode/\u0060, but \u0060configuration/optimization/low-vram-mode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/sdxl.mdx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9c5b5bdd204998a5277b1ccad228c12adc09cf9db9b864238f2c156bcab86c0"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/sdxl.mdx links to \u0060/configuration/optimization/fp8-storage/\u0060, but \u0060configuration/optimization/fp8-storage\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/sdxl.mdx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ae57f50c99f7b98fd8e47d8136e99e33d8bd0f186d4f6aa24ff0bea9bb34916"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/sdxl.mdx links to \u0060/users-guide/image-generation/advanced-prompt-syntax/#attention-weighting\u0060, but \u0060users-guide/image-generation/advanced-prompt-syntax\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/sdxl.mdx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef31d69982e10ce6af8be53ca5c22b81f30e63d3e4055a2f4e8ba3e922acaa00"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/sdxl.mdx links to \u0060/users-guide/image-generation/advanced-topics/hidiffusion/\u0060, but \u0060users-guide/image-generation/advanced-topics/hidiffusion\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/sdxl.mdx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"071198d205778885af3aebff50ac05567cc9caccda9a0dd39b55b4a572cc2c5e"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/sdxl.mdx links to \u0060/users-guide/canvas/introduction/#adding-a-gallery-image-to-a-layer\u0060, but \u0060users-guide/canvas/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/sdxl.mdx"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae868077796d11a5257f3e940ebb4f9f3e44f626c5da8ff9503a86b272447856"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/sdxl.mdx links to \u0060/users-guide/image-generation/advanced-topics/pid-decode/\u0060, but \u0060users-guide/image-generation/advanced-topics/pid-decode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/sdxl.mdx"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"d32c8af67e4381ae3b428b4172b4dbccc9bbe8c3a0a88a88a43321a8245193ce"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/stable-diffusion-1-2.mdx links to \u0060/start-here/system-requirements/\u0060, but \u0060start-here/system-requirements\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/stable-diffusion-1-2.mdx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"915318245bd9ec814930db8e081bac609aa9eca36bed3bf26da1071876af1683"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/stable-diffusion-1-2.mdx links to \u0060/configuration/optimization/low-vram-mode/\u0060, but \u0060configuration/optimization/low-vram-mode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/stable-diffusion-1-2.mdx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd60755a11406a500fd824327363c7156181d6292ef31ccc9b9a1908468d2483"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/stable-diffusion-1-2.mdx links to \u0060/users-guide/image-generation/advanced-topics/hidiffusion/\u0060, but \u0060users-guide/image-generation/advanced-topics/hidiffusion\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/stable-diffusion-1-2.mdx"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf6339802c2ff9ea70b5249c71082d984796d9ab6de403dd8cb78bd796375d01"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/stable-diffusion-1-2.mdx links to \u0060/users-guide/image-generation/advanced-prompt-syntax/#attention-weighting\u0060, but \u0060users-guide/image-generation/advanced-prompt-syntax\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/stable-diffusion-1-2.mdx"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dc43d15556c03c75cddaae7d078a11427edef961c3e037f96adc7d57feffd6a"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/stable-diffusion-1-2.mdx links to \u0060/users-guide/canvas/introduction/#adding-a-gallery-image-to-a-layer\u0060, but \u0060users-guide/canvas/introduction\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/stable-diffusion-1-2.mdx"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d44c1b547dde8333e795dbf4379fbee6681172247365f09b5d574429e429e13"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/z-image.mdx links to \u0060/start-here/system-requirements/\u0060, but \u0060start-here/system-requirements\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/z-image.mdx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dfe0be89b5d9da0febd260a75b00e1d4bdd04ef530a62898afdef289f81024d"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/z-image.mdx links to \u0060/configuration/optimization/fp8-storage/\u0060, but \u0060configuration/optimization/fp8-storage\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/z-image.mdx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7210cb32af73a0a081c1c2d935bc7c283118bd64c3a0b1d37478b9819a7caef"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/z-image.mdx links to \u0060/configuration/optimization/sdnq-quantization/\u0060, but \u0060configuration/optimization/sdnq-quantization\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/z-image.mdx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"53e12828f986b8eac81c5bb18d47d266b6f8dd96624d061627625213cbcc8717"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/z-image.mdx links to \u0060/configuration/optimization/low-vram-mode/\u0060, but \u0060configuration/optimization/low-vram-mode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/z-image.mdx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bb20cd525e7053fc48cc66f3bf15b947cd24cc75bf6869452cbb13744ffa605"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/z-image.mdx links to \u0060/users-guide/image-generation/upscale/\u0060, but \u0060users-guide/image-generation/upscale\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/z-image.mdx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a94295e12d86a838629b7931d4cae3bd42ba8b6ea8f877e7c25bf77b6379143"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/content/docs/Users Guide/03.Models/Local Models/z-image.mdx links to \u0060/users-guide/image-generation/advanced-topics/pid-decode/\u0060, but \u0060users-guide/image-generation/advanced-topics/pid-decode\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/content/docs/Users Guide/03.Models/Local Models/z-image.mdx"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"a75ebfdcdf7b85bee93bd33116269f790a1e644f6da6ff6a9f947e209a581e03"}},{"ruleId":"P12","level":"warning","message":{"text":"Runner config excludes tests no gate runs: \u0060src/**/*.browser.test.{ts,tsx}\u0060 removes 2801 test(s) in 353 file(s) (e.g. \u0060invokeai/frontend/webv2/src/workbench/widgetImplementationResource.browser.test.tsx\u0060, \u0060invokeai/frontend/webv2/src/workbench/widgetDnd.browser.test.ts\u0060) from what vitest collects, and no other runner or CI command runs them \u2014 they are dead tests. Run them (another runner, project or job), or delete them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/vitest.config.mts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"539bc4534796a9717d7774dda529cf29fce7197fed8bf6fb706a0df6b4b6a751"}},{"ruleId":"P2","level":"note","message":{"text":"Console output used as the logging channel: \u0060invokeai/frontend/webv1/src/app/store/middleware/debugLoggerMiddleware.ts\u0060 reports through \u0060console.*\u0060 at line 19 although other files in its module log through a logger. Console lines carry no level, fields or correlation and never reach the log pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/debugLoggerMiddleware.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe1c56387c8431a21a23fb215e8371514386f26681600373182b65f96d2fde7b"}},{"ruleId":"P2","level":"note","message":{"text":"Console output used as the logging channel: \u0060invokeai/frontend/webv1/src/app/store/middleware/debugLoggerMiddleware.ts\u0060 reports through \u0060console.*\u0060 at line 23 although other files in its module log through a logger. Console lines carry no level, fields or correlation and never reach the log pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/debugLoggerMiddleware.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4cd66197d70864af33cee882a49293efe523d23fd9f2e73f5ff0f322bab6be4"}},{"ruleId":"P2","level":"note","message":{"text":"Console output used as the logging channel: \u0060invokeai/frontend/webv1/src/app/store/middleware/debugLoggerMiddleware.ts\u0060 reports through \u0060console.*\u0060 at line 26 although other files in its module log through a logger. Console lines carry no level, fields or correlation and never reach the log pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/debugLoggerMiddleware.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"f670647c69dfbcf2614d4db846af9bd0b3c4fc0d010975b99786b814ea94b9bc"}},{"ruleId":"P2","level":"note","message":{"text":"Console output used as the logging channel: \u0060invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasManager.ts\u0060 reports through \u0060console.*\u0060 at line 328 although other files in its module log through a logger. Console lines carry no level, fields or correlation and never reach the log pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasManager.ts"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"c97c90f806a0415f25acd9eb86dc6705d1e1fc6a5356a0bdbad56a33e4c71f2c"}},{"ruleId":"P2","level":"note","message":{"text":"Console output used as the logging channel: \u0060invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts\u0060 reports through \u0060console.*\u0060 at line 311 although other files in its module log through a logger. Console lines carry no level, fields or correlation and never reach the log pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e392c8dc3e713ea80d602cb095430f708896804e2e55eb0cbed905c3a4cb7a4"}},{"ruleId":"P2","level":"note","message":{"text":"Console output used as the logging channel: \u0060invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts\u0060 reports through \u0060console.*\u0060 at line 313 although other files in its module log through a logger. Console lines carry no level, fields or correlation and never reach the log pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"681e10f4a8fc0fd4f44a45efa7ed2475f2fcdd72b509466fd56b71a8e5698f0a"}},{"ruleId":"P2","level":"note","message":{"text":"Console output used as the logging channel: \u0060invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts\u0060 reports through \u0060console.*\u0060 at line 397 although other files in its module log through a logger. Console lines carry no level, fields or correlation and never reach the log pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"a230f5a442188dc06b0a135e24448aa95a359767f9180c2e23014c86528d6e61"}},{"ruleId":"P2","level":"note","message":{"text":"Console output used as the logging channel: \u0060invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts\u0060 reports through \u0060console.*\u0060 at line 399 although other files in its module log through a logger. Console lines carry no level, fields or correlation and never reach the log pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":399}}}],"partialFingerprints":{"codehealthFindingId/v1":"689c29d332d04324ba89cca9699cc3ed41595c2971279bf8f8b4e8370353403c"}},{"ruleId":"P2","level":"note","message":{"text":"Console output used as the logging channel: \u0060invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts\u0060 reports through \u0060console.*\u0060 at line 444 although other files in its module log through a logger. Console lines carry no level, fields or correlation and never reach the log pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9a14639f17fa7d6059f3a18d0943b151f177ec4573e4e62315bb49b82f5c0a3"}},{"ruleId":"P2","level":"note","message":{"text":"Console output used as the logging channel: \u0060invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts\u0060 reports through \u0060console.*\u0060 at line 446 although other files in its module log through a logger. Console lines carry no level, fields or correlation and never reach the log pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":446}}}],"partialFingerprints":{"codehealthFindingId/v1":"43f9135d815fb8bb2e77a34389597cae333464c8a0e62bb141e9b28e34ec9d04"}},{"ruleId":"P2","level":"note","message":{"text":"Console output used as the logging channel: \u0060invokeai/frontend/webv1/src/services/events/useSocketIO.ts\u0060 reports through \u0060console.*\u0060 at line 154 although other files in its module log through a logger. Console lines carry no level, fields or correlation and never reach the log pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/useSocketIO.ts"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"2614dd25a5847088c26a3d2c68bbce12d3eafc17de6994dd9c8eb57ff1059137"}},{"ruleId":"P2","level":"note","message":{"text":"Console output used as the logging channel: \u0060invokeai/frontend/webv1/src/services/events/useSocketIO.ts\u0060 reports through \u0060console.*\u0060 at line 169 although other files in its module log through a logger. Console lines carry no level, fields or correlation and never reach the log pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/useSocketIO.ts"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac61152229d2bc4ef3b939442320891f78180a696960a8140b37978967a99263"}},{"ruleId":"P2","level":"note","message":{"text":"Console output used as the logging channel: \u0060invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts\u0060 reports through \u0060console.*\u0060 at line 2504 although other files in its module log through a logger. Console lines carry no level, fields or correlation and never reach the log pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts"},"region":{"startLine":2504}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc5b06a80fbaccd04e775b2670361b06b5b5154ee1a97ddf3bfe2211614fa2a7"}},{"ruleId":"P3","level":"note","message":{"text":"No SAST: No static application security testing detected. For this repository\u0027s stack, add bandit, \u0060semgrep --config=p/python\u0060, or CodeQL\u0027s python pack as a CI step. What was searched, so you can tell an absence from a miss: the 73791 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 rollback/health safety: Deployment is orchestrated by compose, and the service already exposes health probe endpoints (healthz/livez/readyz or a container healthcheck), but no compose service declares a \u0060healthcheck:\u0060 that uses them and nothing pins a previous image to fall back to \u2014 so a release that starts but does not serve looks healthy, and reversing it is a manual step."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"db6bab8a28a2145f47e5a4e6683cda39d2ba0296c723238e8057da979ae1c706"}},{"ruleId":"P6","level":"note","message":{"text":"No changelog: No CHANGELOG/HISTORY/RELEASES file \u2014 what shipped when isn\u0027t easy to reconstruct for support or audit. (Versioning/tagging makes releases traceable, but a changelog records the what.)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"dda5aa5aed8cbb292c3ef2b733bc138f614293ae6426c85e98bf31ef330d9415"}},{"ruleId":"P7","level":"warning","message":{"text":"Outbound HTTP without resilience: \u0060urllib.request.urlopen(\u0060 makes an outbound HTTP call, and nothing bounds it: no timeout, deadline, retry or circuit breaker is set for it here, and the client has no process-wide default. A slow or failing dependency will hold this service\u0027s request, thread or connection until the call gives up on its own \u2014 or never, for a client with no default timeout."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/check_classifiers.py"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ab723db93921aead9ad38960d47fcfcae6efd4ca40ff163f3f5dbc3c58414c3"}},{"ruleId":"P7","level":"warning","message":{"text":"Outbound HTTP without resilience: \u0060requests.get(\u0060 makes an outbound HTTP call, and nothing bounds it: no timeout, deadline, retry or circuit breaker is set for it here, and the client has no process-wide default. A slow or failing dependency will hold this service\u0027s request, thread or connection until the call gives up on its own \u2014 or never, for a client with no default timeout."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/get_external_contributions.py"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"0aec907789ecd770009fbcd497680df232d9ab512c974d455dd452be107fe1f1"}},{"ruleId":"P7","level":"warning","message":{"text":"Outbound HTTP without resilience: \u0060requests.get(\u0060 makes an outbound HTTP call, and nothing bounds it: no timeout, deadline, retry or circuit breaker is set for it here, and the client has no process-wide default. A slow or failing dependency will hold this service\u0027s request, thread or connection until the call gives up on its own \u2014 or never, for a client with no default timeout."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/get_external_contributions.py"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"489c9158554f038bdebfe1bee2d1fac16fedf8d08bcdf556cf808cedcfbdf6ad"}},{"ruleId":"P8","level":"warning","message":{"text":"Schema created by SQLAlchemy create_all() (no migration path): SQLAlchemy create_all() builds the schema from the model at startup and keeps no migration history, so there is no reviewed, repeatable upgrade path for an existing production database \u2014 a renamed column is dropped and re-added rather than migrated. Adopt Alembic (\u0060alembic revision --autogenerate\u0060 \u002B \u0060alembic upgrade head\u0060), so every schema change is a versioned file applied the same way in every environment."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/copy.py"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7c929cd60e8792dd630a1d7035c28e3ebc697ebf81a95cdca0e25e88473d42d"}},{"ruleId":"P8","level":"warning","message":{"text":"Schema created by SQLAlchemy create_all() (no migration path): SQLAlchemy create_all() builds the schema from the model at startup and keeps no migration history, so there is no reviewed, repeatable upgrade path for an existing production database \u2014 a renamed column is dropped and re-added rather than migrated. Adopt Alembic (\u0060alembic revision --autogenerate\u0060 \u002B \u0060alembic upgrade head\u0060), so every schema change is a versioned file applied the same way in every environment."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_impl.py"},"region":{"startLine":526}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f10fc41b67bdaebcdd7a0b712aef51731d87f66e16f7315ca9adf2b6cd05127"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060unzipSync\u0060 in \u0060readArchiveEntries\u0060 blocks the event loop until it finishes \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":"invokeai/frontend/webv2/scripts/run-project-file-journey.mjs"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"90084dc32d6724fceea0913ba8b93c299473009ada7fb8ed33c8bc7c0851bbbf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 24 sibling directories (222 clone groups): 222 duplicated blocks under invokeai/frontend/webv1/src/features/ have copies in at least two of the sibling directories auth, changeBoardModal, controlLayers, cropper, customNodes, deleteImageModal (\u002B18 more sibling(s) not listed) \u2014 107 of them are reported below, and 115 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 222 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 222 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 222 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":"invokeai/frontend/webv1/src/features/dnd/DndListDropIndicator.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"901bb2e6d31c6679c0e58f5a2b3261ec6d223b6c9c70796c3431f646ce03817f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 4 sibling directories (160 clone groups): 160 duplicated blocks under invokeai/frontend/webv2/src/ have copies in at least two of the sibling directories app, features, platform, workbench \u2014 56 of them are reported below, and 104 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 160 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 160 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 160 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryProgressSection.tsx"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6519a2ef5a3a5868d7a5a164341e0ff63d654afd8819cfa13af889a0292ceaa"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 11 sibling directories (89 clone groups): 89 duplicated blocks under invokeai/frontend/webv2/src/features/ have copies in at least two of the sibling directories fonts, gallery, generation, identity, intermediates, models (\u002B5 more sibling(s) not listed) \u2014 44 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 89 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 89 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 89 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":"invokeai/frontend/webv2/src/features/models/data/modelsStore.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"256f1e4a18dcd95eb7b632ae1577e09c4060f9ccc78ca28eeba1b501759e3b76"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 13 sibling directories (64 clone groups): 64 duplicated blocks under invokeai/frontend/webv2/src/workbench/ have copies in at least two of the sibling directories canvas-engine, canvas-operations, diagnostics, hotkeys, image-actions, launchpad (\u002B7 more sibling(s) not listed) \u2014 29 of them are reported below, and 35 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":"invokeai/frontend/webv2/src/workbench/launchpad/HelpMenu.tsx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e3b1bd0c85dbcf1ae0970b7a47b3f8e5662dbe9b61e4e3de1f567308d38e62c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 14 sibling directories (59 clone groups): 59 duplicated blocks under invokeai/frontend/webv1/src/features/controlLayers/components/ have copies in at least two of the sibling directories CanvasContextMenu, CanvasEntityList, ControlLayer, Filters, InpaintMask, RasterLayer (\u002B8 more sibling(s) not listed) \u2014 40 of them are reported below, and 19 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 59 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 59 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 59 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/useCanvasEntityListDnd.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc67b1dcae3f39845b94c1f5c928de8dd588cfd2d1428bbfdadc0f11442f2127"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 2 sibling directories (52 clone groups): 52 duplicated blocks under invokeai/frontend/ have copies in at least two of the sibling directories webv1, webv2 \u2014 26 of them are reported below, and 26 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 52 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 52 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 52 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":"invokeai/frontend/webv1/src/features/nodes/util/workflowImageExport.ts"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"27978393dfd8341391c7e11278560093026bce4541da40dfafba6ad058f16ae4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 13 sibling directories (22 clone groups): 22 duplicated blocks under invokeai/frontend/webv1/src/features/parameters/components/ have copies in at least two of the sibling directories Advanced, Bbox, Canvas, Core, Dimensions, Krea2Enhancers (\u002B7 more sibling(s) not listed) \u2014 18 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 22 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 22 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 22 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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxPreview.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cb16f346ee23217faa8b05f084d1126c521dc45cf2eec0e60d0460143c472d9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 12 sibling directories (16 clone groups): 16 duplicated blocks under invokeai/frontend/webv2/src/workbench/widgets/ have copies in at least two of the sibling directories autosave-status, canvas, gallery, generate, image-map, layers (\u002B6 more sibling(s) not listed) \u2014 5 of them are reported below, and 11 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 16 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 16 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 16 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/geometryForm.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"451397ed5fb7c28e9ea10e10dee80659dd5c093abb3b091b46ac2c9e10ea2386"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 4 sibling directories (14 clone groups): 14 duplicated blocks under invokeai/frontend/webv1/src/ have copies in at least two of the sibling directories app, common, features, services \u2014 9 of them are reported below, and 5 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 14 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 14 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 14 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":"invokeai/frontend/webv1/src/common/hooks/useCopyImageToClipboard.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"befe7721a81b1881f6334dfff48b52aa186e06f1177cf5e1c9aae5e4623fcdb2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 3 sibling directories (11 clone groups): 11 duplicated blocks under invokeai/frontend/webv1/src/features/controlLayers/konva/ have copies in at least two of the sibling directories CanvasEntity, CanvasObject, CanvasTool \u2014 6 of them are reported below, and 5 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 11 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 11 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 11 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":1186}}}],"partialFingerprints":{"codehealthFindingId/v1":"913ad7424747f188bec396fb25ae0d85b872b05f74010f4a695aa42a0aa99d58"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 6 sibling directories (10 clone groups): 10 duplicated blocks under invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ have copies in at least two of the sibling directories ControlAdapterModelDefaultSettings, CpuOnlyModelSettings, EncoderModelSettings, LoRAModelDefaultSettings, MainModelDefaultSettings, VAEModelSettings \u2014 8 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 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/ControlAdapterModelDefaultSettings.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"37ca27d24badf78a5258dc1cee9b50706ed84e2fe3f5370f94bbf8a5177356a3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 7 sibling directories (8 clone groups): 8 duplicated blocks under invokeai/frontend/webv2/src/features/models/ui/ have copies in at least two of the sibling directories add-models, credentials, detail, install-queue, library, manager (\u002B1 more sibling(s) not listed) \u2014 4 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 8 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 8 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 8 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":"invokeai/frontend/webv2/src/features/models/ui/detail/UpdatePathDialog.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6fff13345e4d9d33acc6cb190da83c90f9b9a30fff2ea4b7e0edce93edab7c9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 8 sibling directories (8 clone groups): 8 duplicated blocks under invokeai/frontend/webv2/src/workbench/canvas-engine/ have copies in at least two of the sibling directories controllers, document, document-model, editing, math, render (\u002B2 more sibling(s) not listed) \u2014 6 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 8 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 8 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 8 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerDisplayEffect.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdecaced0ffef7548a622a9dd638697024791074ad97bec97290bb0cd10b7c7a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 2 sibling directories (7 clone groups): 7 duplicated blocks under invokeai/frontend/webv1/src/features/nodes/components/ have copies in at least two of the sibling directories flow, sidePanel \u2014 3 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 7 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 7 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 7 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringFieldCollectionInputComponent.tsx"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"c892e4577d045f3a4bf925605d68755a5dcf776eccc8820386a1dbf624002a59"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 4 sibling directories (6 clone groups): 6 duplicated blocks under invokeai/frontend/webv1/src/features/nodes/ have copies in at least two of the sibling directories components, hooks, store, util \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":"invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts"},"region":{"startLine":667}}}],"partialFingerprints":{"codehealthFindingId/v1":"b97d0bfe8e129fd5f08cab54d602960242f2d9b393f9e72b15e98ca5d96f13b8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 5 sibling directories (5 clone groups): 5 duplicated blocks under invokeai/frontend/webv1/src/features/gallery/components/ have copies in at least two of the sibling directories Boards, ContextMenu, GallerySettingsPopover, ImageGrid, ImageViewer \u2014 4 of them are reported below, and 1 is 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 5 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 5 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 5 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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsSettingsPopover.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"651954b40995d1844920429ca6815fe1a77663432948c460e75c0e375e0edcf3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 2 sibling directories (5 clone groups): 5 of the duplicated blocks reported below have copies in at least two of the sibling directories FloatField, IntegerField under invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/. That concentration is one structural fact, not 5 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 5 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/useFloatField.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcea6fa7545ce67e0354eed041ee1f20f906c4983a3dda288cea1beb906e3b6a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 2 sibling directories (5 clone groups): 5 duplicated blocks under invokeai/frontend/webv2/ have copies in at least two of the sibling directories scripts, src \u2014 4 of them are reported below, and 1 is 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 5 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 5 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 5 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":"invokeai/frontend/webv2/scripts/write-workbench-ownership-inventory.mjs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"4519978542b5be0aa06d1142e3552a49759f8e9b7216146a1b87e0c25eaea35b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 3 sibling directories (5 clone groups): 5 duplicated blocks under invokeai/frontend/webv2/src/features/workflow/ have copies in at least two of the sibling directories core, data, ui \u2014 3 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 5 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 5 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 5 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":"invokeai/frontend/webv2/src/features/workflow/core/buildGraph.ts"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"f84c858cbea58822b74ca86147d87028294e4cfc232fe6dd1659f3b573b3f0a6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (221 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/workflowImageExport.ts:170 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/editor/workflowImageExport.ts:174 \u2014 the two spans are one implementation copied and then locally edited \u2014 1760 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":"invokeai/frontend/webv1/src/features/nodes/util/workflowImageExport.ts"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed878720c3627d14d21cf1edacff1b116ab4919d2b92203c187ca576a0a6db6e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (198 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts:22 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts:24 \u2014 the two spans are one implementation copied and then locally edited \u2014 1330 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"32ffc74f68215d3b866cc837709dffbff31df19f5a15090047dfc1b7e8d6e4d4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (174 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts:117 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts:128 \u2014 the two spans are one implementation copied and then locally edited \u2014 1036 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"c879a3d5a3dd0101d069b2d659a38dd8ebd73388ef353b4805fbf5daec8b2b94"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (172 identical lines \u00D7 2 files): invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx:1 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx:1 \u2014 these 2 files are line-for-line copies of one another \u2014 172 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":"invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"908cfeb74e6ca7973a452fbcb7b1d0f4a05e916b65acb9394f3c2f6b01522c35"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (169 identical lines \u00D7 2 files): invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx:1 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx:1 \u2014 these 2 files are line-for-line copies of one another \u2014 169 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":"invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"efdd5aa5bea7ba3052cbdc393b1be87adb0896b5981c269a8609a19064f3b588"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (168 identical lines \u00D7 2 files): invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx:1 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx:1 \u2014 these 2 files are line-for-line copies of one another \u2014 168 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":"invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3a082136c317013dc4069a85bd28eb76f4a310170ef44c8e214639c85062466"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (168 identical lines \u00D7 2 files): invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx:1 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx:1 \u2014 these 2 files are line-for-line copies of one another \u2014 168 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":"invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd2c64d83c3aaad110944c337f85268f1f900a3325aa060bff826ed0541073d8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (166 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/library/ProjectWorkflowsView.tsx:256 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.tsx:329 \u2014 the two spans are one implementation copied and then locally edited \u2014 834 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":"invokeai/frontend/webv2/src/features/workflow/ui/library/ProjectWorkflowsView.tsx"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffe1be1673cb32625347c06d61fe2fc94aa2890a6396cdfa8c6e3946f7438cca"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (144 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts:250 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts:251 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"86da1d6606cf28fb2f2856ef74f87e903334cebb948bacd1571f8cc1de6b9fa0"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (143 identical lines \u00D7 2 files): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatFieldCollectionInputComponent.tsx:1 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerFieldCollectionInputComponent.tsx:1 \u2014 these 2 files are line-for-line copies of one another \u2014 143 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatFieldCollectionInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5efb3cc379a6338feba364d6c6d6361ebc88a684df6a14459de904d9b475b5a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (143 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/filterResultController.ts:52 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/generatedResultController.ts:41 \u2014 the two spans are one implementation copied and then locally edited \u2014 1011 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/filterResultController.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"afbc4fe123cc21140411a1c78af75625b19da013cfc2859db459cb30e7e1138c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (132 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/auth/components/UserManagement.tsx:112 \u00B7 invokeai/frontend/webv1/src/features/auth/components/UserProfile.tsx:93 \u2014 the two spans are one implementation copied and then locally edited \u2014 739 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":"invokeai/frontend/webv1/src/features/auth/components/UserManagement.tsx"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"710f193542422a56e28f80700e0cf9d52be4b844c413f7c617499801824873e9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (112 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/LayerChildRow.tsx:134 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRow.tsx:136 \u2014 the two spans are one implementation copied and then locally edited \u2014 626 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerChildRow.tsx"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1269982aae774d65d872bdcb3c1e5b1c0976d9e4e5710eafb4c330c4917c88b"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (108 identical lines \u00D7 2 files): invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:1 \u00B7 invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:1 \u2014 these 2 files are line-for-line copies of one another \u2014 108 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":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b78eb8c940a315a5c36115cbde83f07394143051af3e222ca6e247a33b1a3ac"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (103 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx:26 \u00B7 invokeai/frontend/webv1/src/features/auth/components/LoginPage.tsx:25 \u2014 the two spans are one implementation copied and then locally edited \u2014 689 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":"invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5345798b814f4d0a9e2554f69d75ad15052911bf4d8dc29e54a5842dd99c6ea"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (103 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts:339 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts:640 \u2014 the two spans are one implementation copied and then locally edited \u2014 669 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4c08e9d41a75969d31de4f15e0fa620b02008eb073acfb6078407a6be0099ed"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (100 identical lines \u00D7 2 files): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldHandle.tsx:1 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/OutputFieldHandle.tsx:1 \u2014 these 2 files are line-for-line copies of one another \u2014 100 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldHandle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"933372be157adf9fc798b86e86bca4e189200217ddd6f209e6990ee37bbd8f5c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (100 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/identity/ui/ProfileDialog.tsx:78 \u00B7 invokeai/frontend/webv2/src/features/identity/ui/UserFormDialog.tsx:112 \u2014 the two spans are one implementation copied and then locally edited \u2014 628 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":"invokeai/frontend/webv2/src/features/identity/ui/ProfileDialog.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f97f621637c5af70e603ddffbd8fa5e3bc3078b046953e9427c9469c1202ef7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (88 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/store/readiness.ts:515 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1293 \u2014 the two spans are one implementation copied and then locally edited \u2014 689 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":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e6f3b8525433fc97c42f139e9f66e49161e063b9f38762846d41f2c5e7f230e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (82 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx:126 \u00B7 invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx:96 \u2014 the two spans are one implementation copied and then locally edited \u2014 429 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":"invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfe1a15084adc37c667ba4013495c6dbf27819c83844c9cdfa5c96ce3439cc94"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (78 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/components/ColorPicker/RgbColorPicker.tsx:10 \u00B7 invokeai/frontend/webv1/src/common/components/ColorPicker/RgbaColorPicker.tsx:10 \u2014 the two spans are one implementation copied and then locally edited \u2014 536 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":"invokeai/frontend/webv1/src/common/components/ColorPicker/RgbColorPicker.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"b69b499cf5cc0871c2038357f5be4f3babeffac1b4e8d0036bf97c6ae9d0475e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (76 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/ui/InvocationCacheFooter.tsx:13 \u00B7 invokeai/frontend/webv2/src/features/queue/ui/ModelCacheFooter.tsx:19 \u2014 the two spans are one implementation copied and then locally edited \u2014 495 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":"invokeai/frontend/webv2/src/features/queue/ui/InvocationCacheFooter.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8322144736cc30abb820817c332563c0c9631a8303a7e82d3411990af0cfeae"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (75 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorFieldComponent.tsx:54 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorFieldComponent.tsx:56 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorFieldComponent.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a9f0535cc5e690f7b82bf11a3fd0617b7f4303631358f93398c4dd9bd516390"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (75 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:2227 \u00B7 invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:3014 \u2014 the two spans are one implementation copied and then locally edited \u2014 434 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":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":2227}}}],"partialFingerprints":{"codehealthFindingId/v1":"649d5c7674f1c44310c5202c876e573202bb2b490705e3ee5bbd7d80226536a1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (71 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementFloatSettings.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementIntegerSettings.tsx:15 \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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementFloatSettings.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"a06e01791b5c2b6994ea4f54e5ad0843d93fde6d2c043130545b2553cd8a483f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (69 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:451 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:679 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":451}}}],"partialFingerprints":{"codehealthFindingId/v1":"6757457a59809e88b27008398b74f835f3e4ebdf6ebfe6be769c350f332aa930"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (69 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts:51 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts:26 \u2014 the two spans are one implementation copied and then locally edited \u2014 486 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"acd7f76156dac321fb15a677522f9b026b5cf48b8ef7aa06662d8f7ec0f8f59d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (67 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx:302 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx:480 \u2014 the two spans are one implementation copied and then locally edited \u2014 346 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d25b2274a262d5c18c7746a1e19416cad15efc6bae3d317d168209c17a6aa6a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (66 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/InpaintMaskSettings.tsx:71 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/RegionalGuidanceSettings.tsx:164 \u2014 the two spans are one implementation copied and then locally edited \u2014 451 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/InpaintMaskSettings.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6060d6a978d82e39755a6e663db91f4da854be3d5ef2a07e437f173eec82397"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (65 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/modelSettingsIO.ts:13 \u00B7 invokeai/frontend/webv2/src/features/models/core/modelSettingsIO.ts:9 \u2014 the two spans are one implementation copied and then locally edited \u2014 500 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/modelSettingsIO.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb5079b92a01ea4073b6b9e066a2a648a4f2f246cdba2b7764dfddcff7159770"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (65 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts:60 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts:93 \u2014 the two spans are one implementation copied and then locally edited \u2014 445 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ed0b1c662e92162ec2bea3e6b56131e5d1cbd22a4a3df22594ef845ff3bf1cb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (64 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/useCanvasEntityListDnd.ts:11 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/useRefImageDnd.ts:10 \u2014 the two spans are one implementation copied and then locally edited \u2014 339 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/useCanvasEntityListDnd.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dacb005ca4cc9f3f85b08645709ce3432af0896d736702276385a6c93b573d6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (64 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/editor/useEraser.tsx:110 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/editor/useLasso.tsx:45 \u2014 the two spans are one implementation copied and then locally edited \u2014 355 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/useEraser.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ab132ebfbf53100fac5c2aa6783e262945c5043d93605e22c07240ae00fe50c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (64 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts:247 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts:404 \u2014 the two spans are one implementation copied and then locally edited \u2014 462 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed996afeb8862db4c79b1bd433d7b002939c8c351a34350b40607be79fac0195"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (63 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/ui/GalleryProgressSection.tsx:202 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFilmstrip.tsx:147 \u2014 the two spans are one implementation copied and then locally edited \u2014 278 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryProgressSection.tsx"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"4194b74b11f893f8b7e5f59ed558173a7074e380fb1182584e23cb5dc266101c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (63 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/ui/GalleryStackedLayout.tsx:26 \u00B7 invokeai/frontend/webv2/src/features/gallery/ui/GalleryWideLayout.tsx:22 \u2014 the two spans are one implementation copied and then locally edited \u2014 313 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryStackedLayout.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"230a411041884ffbb20ed859d75f3d66799e70974a9667b68136aeb6f4508c20"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (63 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:352 \u00B7 invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:635 \u2014 the two spans are one implementation copied and then locally edited \u2014 549 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":"invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3f091d89f2061d156428e0ab6bf3e9a94607486fec5da73b616b89d43214464"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (62 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/ControlAdapterModelDefaultSettings.tsx:31 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/LoRAModelDefaultSettings.tsx:26 \u2014 the two spans are one implementation copied and then locally edited \u2014 379 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/ControlAdapterModelDefaultSettings.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cd9a60f24d412344fa3849a404cbb5065bc3eb22ab682e9abfaf8f0fa250945"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (62 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts:80 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts:118 \u2014 the two spans are one implementation copied and then locally edited \u2014 419 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"188f30ec5628497df089b641ca112ed40c9bf71df93d19458896a6442f4e02b6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (62 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx:35 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:156 \u2014 the two spans are one implementation copied and then locally edited \u2014 364 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":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"f069fca89a57700dbe56611a9a9d06ace907f80e49fa7446a989b84b6f923a3e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (62 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-operations/generationCompositePlan.ts:108 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/generationCompositePlan.ts:240 \u2014 the two spans are one implementation copied and then locally edited \u2014 516 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/generationCompositePlan.ts"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0e54a3f59766bcf3cd6499211ab59af32f69ad2852e3fcb19c37e552dada4f0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (61 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementIntegerSettings.tsx:92 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementIntegerSettings.tsx:155 \u2014 the two spans are one implementation copied and then locally edited \u2014 321 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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementIntegerSettings.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7df7fb47336f05733530ed66064067eab583f3c74f4de66d2c10c1f4575f82a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (61 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-operations/contracts.ts:81 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/contracts.ts:238 \u2014 all 2 copies are in the same file, and the CITED SPAN is inside a TYPE DECLARATION, not executable code. There is no function to extract and no call site to call one from, so do not read this as an extract-a-helper row: the collapse a type offers is a generic \u2014 name the shape once, parameterised over the part that varies, and have each copy instantiate it. First check what actually differs between the copies: where they are a MATRIX of cases (one entry per input, differing precisely in the case each one pins), the repetition IS the enumeration and collapsing it would delete cases rather than de-duplicate anything \u2014 leave those alone. Reported because the copies that are not a matrix drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/contracts.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e7124f266a8d3746fcc5efcc4f9105f411649d1b685cdde8ab694126adb6e77"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (60 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarOpacity.tsx:32 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarScale.tsx:26 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarOpacity.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c37fa670972805ea6d6d41636b66b0007470e1c0d5b75c42265f090cd54d70a"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (60 identical lines \u00D7 2 files): invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceNegativePrompt.tsx:1 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidancePositivePrompt.tsx:1 \u2014 these 2 files are line-for-line copies of one another \u2014 60 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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceNegativePrompt.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5285f67dd3b1827d54b173921ba734fb4e2d0bcb45f80543bca3b7d1744a21c3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (60 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx:87 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/VirtualBoardItem.tsx:44 \u2014 the two spans are one implementation copied and then locally edited \u2014 335 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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"b284139e15acc54eac691ec0bc877ad184202017c80ed8ea872ff28962d05129"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (60 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx:28 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/VideoFieldInputComponent.tsx:34 \u2014 the two spans are one implementation copied and then locally edited \u2014 292 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3626298ac9adece68ce48f9b9cd4b817d79f1361c1e647bfbd47cb1f329197e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (60 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorFieldComponent.tsx:20 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringGeneratorFieldComponent.tsx:24 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorFieldComponent.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"a93e0369add04aeb68b2349e9c7509c263bf31a01f9647d26dc7faedb18a568c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (60 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/executeImageRecall.ts:329 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/executeRecallParameters.ts:100 \u2014 the two spans are one implementation copied and then locally edited \u2014 283 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":"invokeai/frontend/webv2/src/workbench/image-actions/executeImageRecall.ts"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"444c9fe95f357ed9f7cf7f940036cb54b28e7ba0700158fe60c2be353609b22d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (59 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LoRAFieldCollectionInputComponent.tsx:110 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringFieldCollectionInputComponent.tsx:59 \u2014 the two spans are one implementation copied and then locally edited \u2014 294 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LoRAFieldCollectionInputComponent.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2aa6e0221100acd1a7f5b2cffc9fd250633378daaf9de73978426c8d2c065ad"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (58 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/hooks/useGroupedModelCombobox.ts:13 \u00B7 invokeai/frontend/webv1/src/common/hooks/useModelCombobox.ts:9 \u2014 the two spans are one implementation copied and then locally edited \u2014 417 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":"invokeai/frontend/webv1/src/common/hooks/useGroupedModelCombobox.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"bddfdac6552b8c10f104e06f684eb14bf2449591dac9857e230321767aaaeecd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (58 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/CallSavedWorkflowNode.tsx:99 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNode.tsx:40 \u2014 the two spans are one implementation copied and then locally edited \u2014 367 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/CallSavedWorkflowNode.tsx"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ac57f56c45d6a5bad36c27f9b16406ec3be5444de0a0e26757d70cd30948ee4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (57 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/dnd/DndListDropIndicator.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/DndListDropIndicator.tsx:12 \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":"invokeai/frontend/webv1/src/features/dnd/DndListDropIndicator.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea2d970e3b1741e1c7ec4f534fe1fcfa29fddf8f24cc1a7246cae55d2b0d45c6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (57 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/ImageContextMenu.tsx:111 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/VideoContextMenu.tsx:125 \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":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/ImageContextMenu.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"983a50743ca07170541968f835d5d8bb5cfe27c910517c10906652ff679f67ce"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (57 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgRescaleMultiplier.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgScale.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultGuidance.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultSteps.tsx:14 \u2014 the 4 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. There is one copy in each of 4 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgRescaleMultiplier.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"131ca563e164a91fcd8576db00e7d6f3a7cc096a3d676255af1e5575f29e40ec"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (57 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgScale.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultGuidance.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultSteps.tsx:14 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgScale.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"563d2836697ddade8aacad34f75ffc9f55a8047b6f5d31de3730d3b06d4251fe"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (57 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultHeight.tsx:19 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultWidth.tsx:19 \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultHeight.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"78eaa44357cfdc805c6dc3159e871c3c14f59962f2cd5c933c5f99530fcacbb3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (56 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/tools/bboxTool.ts:102 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/gradientTool.ts:70 \u2014 the two spans are one implementation copied and then locally edited \u2014 323 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/bboxTool.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ee3bc8671e86a285f8dd8ecc0488345e9a3c9a417743a3e7cf7292b5b97b96b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (56 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetManagerDialogBody.tsx:67 \u00B7 invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetStrip.tsx:194 \u2014 the two spans are one implementation copied and then locally edited \u2014 352 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":"invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetManagerDialogBody.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"07b5e905720c28139c96d2840ab6075a6386bd2db0ded07dd1a32eb78d64af34"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (55 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterControlLayer.ts:13 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRasterLayer.ts:34 \u2014 the two spans are one implementation copied and then locally edited \u2014 408 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterControlLayer.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b854f87378c6b9e90eb3dc6c77c1cc9954d6dad51224671e3941aa1f43f154d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (55 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts:244 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts:207 \u2014 the two spans are one implementation copied and then locally edited \u2014 344 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b6ca395b5173c9d79b752f102a28ed5d797f1fecc20b7d065e5ffb638e03758"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (55 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItems.tsx:18 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItemsVideos.tsx:22 \u2014 the two spans are one implementation copied and then locally edited \u2014 450 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":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItems.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"aec9591148c822feeeccf6b0ddff2f7a610bd452a73c9c6eecbc5a1c3f999e8b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (55 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts:39 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts:89 \u2014 the two spans are one implementation copied and then locally edited \u2014 359 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccc29a9c370ea62913b3ea2e5142ac230e71a70dea0cb4eb6a6c99e8d80168f5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (53 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx:127 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx:298 \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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"f52f527c6a613932e6a847682c89046e750a4b3498aee3b910d788f4c22c94cc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (53 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/hooks/useRangeBasedImageFetching.ts:25 \u00B7 invokeai/frontend/webv1/src/features/queue/hooks/useRangeBasedQueueItemFetching.ts:37 \u2014 the two spans are one implementation copied and then locally edited \u2014 386 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":"invokeai/frontend/webv1/src/features/gallery/hooks/useRangeBasedImageFetching.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d929b260c0c7ffc44069616be133b1d81a533bef5478975c0c6325a7c57865e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (53 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorArithmeticSequenceSettings.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorLinearDistributionSettings.tsx:11 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorArithmeticSequenceSettings.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"546c4fe5f8de7e5f158a0034263bc379c22517337ab4696a418b28144a0de88c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (53 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts:98 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts:58 \u2014 the two spans are one implementation copied and then locally edited \u2014 348 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"72bb58ceb813096d4d7108debc5da45036aaa2e5fd10798586520cfd73c52ab6"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (53 identical lines \u00D7 2 files): invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxPreview.tsx:1 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsPreview.tsx:1 \u2014 these 2 files are line-for-line copies of one another \u2014 53 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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxPreview.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"22ec97430c12106644dd0b7ac8323235239d0b600f7eb9d3366d42809c6f5ee2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (53 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx:250 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx:678 \u2014 the two spans are one implementation copied and then locally edited \u2014 248 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":"invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"1594cb737db9ee7647e24e39b90c895bd6224376f6972d468d3e20bcbf70a2f8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (53 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.ts:1321 \u00B7 invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:940 \u2014 the two spans are one implementation copied and then locally edited \u2014 329 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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":1321}}}],"partialFingerprints":{"codehealthFindingId/v1":"5903e15461a68331442f7891950e7b8bc191e10c685c4a3f73fc73550bf9722e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (52 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/store/util/testUtils.ts:24 \u00B7 invokeai/frontend/webv1/src/features/nodes/store/util/testUtils.ts:179 \u2014 all 2 copies are in the same file, and what repeats is a LIST OF ENTRIES rather than behaviour \u2014 the same entries written out more than once. Extract them into one shared, exported constant and spread that constant into each site, rather than into a function the sites call: a list like this often lives in declarative metadata (a decorator\u0027s options object, a static configuration table) that a build step must be able to read statically, where a function call is not allowed. Adding an entry to one copy and not the other is the failure this prevents."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/util/testUtils.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"161a8660bd6d0c9d320a59129b7c385b628558aecfb40c14b3754d80624734fd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (52 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/identity/ui/ProfileDialog.tsx:119 \u00B7 invokeai/frontend/webv2/src/features/identity/ui/SetupScreen.tsx:45 \u2014 the two spans are one implementation copied and then locally edited \u2014 363 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":"invokeai/frontend/webv2/src/features/identity/ui/ProfileDialog.tsx"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"edd1ae363e2619b5dac37cf741ecf9b5aa13e2b0523d60ea1397b51730fa5813"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (51 identical lines \u00D7 2 files): invokeai/frontend/webv1/src/features/parameters/components/Core/ParamQwenImageShift.tsx:1 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamZImageShift.tsx:1 \u2014 these 2 files are line-for-line copies of one another \u2014 51 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":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamQwenImageShift.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9836f131af31aeac89efd455ab3f52f37672b2af59346044d8b21b0ad18646c7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (50 lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/hooks/useBoolean.ts:6 \u00B7 invokeai/frontend/webv1/src/common/hooks/useBoolean.ts:74 \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":"invokeai/frontend/webv1/src/common/hooks/useBoolean.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"b59cf55689936f0dafd970f6f41fd5d37cfca8e9a134123f6219a0634a87614d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (50 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts:132 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts:354 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts:217 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts:221 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 5 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"a176b0951d2f0309de3e9a344f777d4e0199f062d30118802a659cee0b7ff86e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (49 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/useFloatField.ts:45 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/useIntegerField.ts:38 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/useFloatField.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"8681ee167e94ebfc20e1f3a01d6abce4130f34e454c99a55b00000d4d2e1e09d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (49 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/launchpad/home/ResumeCard.tsx:40 \u00B7 invokeai/frontend/webv2/src/workbench/launchpad/projects/ProjectCard.tsx:43 \u2014 the two spans are one implementation copied and then locally edited \u2014 296 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":"invokeai/frontend/webv2/src/workbench/launchpad/home/ResumeCard.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a6b4e2b8004027da480b48ef5d41ad92ae887b659891474dd1b0fa3bfcf12a2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (47 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:69 \u00B7 invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx:18 \u2014 the two spans are one implementation copied and then locally edited \u2014 300 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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"5362cba5e548c92f39f1a4dcebc526a2c1bb49924323b308714f3e498658d3c6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (47 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-operations/compositeForGeneration.ts:236 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/compositeForGeneration.ts:450 \u2014 the two spans are one implementation copied and then locally edited \u2014 289 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/compositeForGeneration.ts"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"67ec4f708267d51a67978781fc1ea2b4caf7ba5db2b990606d494323939e1af1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (46 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx:42 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx:44 \u2014 the two spans are one implementation copied and then locally edited \u2014 422 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":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"63517179719e72332373e6ca8a38172001e3665f9f0b9cb309d55cdd3efef00e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (46 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/FloatFieldInputAndSlider.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/IntegerFieldInputAndSlider.tsx:11 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/FloatFieldInputAndSlider.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"969338c2e801c17686f6b9873aeff8edfcf581d82be41558f7e8aec705d2e162"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (45 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/imageUploaded.ts:14 \u00B7 invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/videoUploaded.ts:14 \u2014 the two spans are one implementation copied and then locally edited \u2014 321 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":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/imageUploaded.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d8ebc6656ccbd122fe3270b8d4fc4d4386ea014d293657e9e6b44f56c428322"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (45 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityFilter.ts:10 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntitySegmentAnything.ts:10 \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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityFilter.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"62c5b925cb7f5d4570dd6bceb94134821e9f0146b09b108acb1a3cb84048fb2f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (45 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StylePresetFieldInputComponent.tsx:13 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SystemPromptFieldInputComponent.tsx:13 \u2014 the two spans are one implementation copied and then locally edited \u2014 286 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StylePresetFieldInputComponent.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"57c6acfb24731dc467b397b390f3387b102eccee7825353a58bb4803ef157a2a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (45 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFlux2DevLoRAs.ts:12 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFlux2KleinLoRAs.ts:8 \u2014 the two spans are one implementation copied and then locally edited \u2014 351 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFlux2DevLoRAs.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"49b7b05e1759396277e64ab90e67ccba0b1eb848039a89169e7a172bc3c6497d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (45 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useCreateNewWorkflow.ts:34 \u00B7 invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useSaveLibraryWorkflow.ts:23 \u2014 the two spans are one implementation copied and then locally edited \u2014 268 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":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useCreateNewWorkflow.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"57b0bd5ddb19dbe167ab910e57dfac9ce507d1c337c2d2535e276e4d379f64f4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (44 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceResults.tsx:25 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderResults.tsx:37 \u2014 the two spans are one implementation copied and then locally edited \u2014 321 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceResults.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cee87a1cf7af7033713a6db1c29ccd608c5836808593556b8d4a0e383804ba0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (44 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxHeight.tsx:20 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxWidth.tsx:20 \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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxHeight.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"499a19d5ab4a3d0f13d4ed05905237cf38d189904923290bce0a1dda5a5eeae2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (44 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsHeight.tsx:19 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsWidth.tsx:19 \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":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsHeight.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"a13ab65a578c24bb01b5e108082e95db5e3d6731ad42681889c0dbf4da5e45e1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (44 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/prompt/store/expandPromptSlice.ts:19 \u00B7 invokeai/frontend/webv1/src/features/stylePresets/store/stylePresetSlice.ts:25 \u2014 the two spans are one implementation copied and then locally edited \u2014 273 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":"invokeai/frontend/webv1/src/features/prompt/store/expandPromptSlice.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"8eb6def68b9bee8e84ccf300dbc09cd78910de9efe913d1bec88fcf918a026ea"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (44 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/data/modelsStore.ts:51 \u00B7 invokeai/frontend/webv2/src/features/nodes/data/nodesStore.ts:27 \u2014 the two spans are one implementation copied and then locally edited \u2014 283 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":"invokeai/frontend/webv2/src/features/models/data/modelsStore.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"756aa67cce7f02fc56e164e7ceac12103874a70e48e7c5fc7921c28166d0e887"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (44 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/preview/useCompareLoupe.ts:275 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewLoupe.ts:422 \u2014 the two spans are one implementation copied and then locally edited \u2014 358 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/useCompareLoupe.ts"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"315c1acb5e82a9b3592a8dcb6e17643bd0eb1334648fa5323736dcf75711d7de"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (43 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/ControlAdapterModelDefaultSettings.tsx:60 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/LoRAModelDefaultSettings.tsx:83 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx:103 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/ControlAdapterModelDefaultSettings.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee318491f10bb0e2a651cf3737d6cd227df99752ac095f6f6d46f8890e887bc5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (43 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addAnimaLoRAs.ts:14 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addKrea2LoRAs.ts:14 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addZImageLoRAs.ts:14 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addAnimaLoRAs.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"26b075811367ef20064d3e355c681760ae6e5ecbc37815b78a1a3544977b914b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (43 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/write-canvas-import-matrix.mjs:12 \u00B7 invokeai/frontend/webv2/scripts/write-workbench-ownership-inventory.mjs:13 \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":"invokeai/frontend/webv2/scripts/write-canvas-import-matrix.mjs"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"077059bbd0231ed17e2ce166bc5d899c92e610a87fed6c2e71418bfc67423c24"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (43 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/identity/ui/LoginScreen.tsx:24 \u00B7 invokeai/frontend/webv2/src/features/identity/ui/SetupScreen.tsx:26 \u2014 the two spans are one implementation copied and then locally edited \u2014 302 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":"invokeai/frontend/webv2/src/features/identity/ui/LoginScreen.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"46ee1ebfc464aad78e3111a67d5d1ead59924b63082c08b9656a62589415b386"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (43 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/FilterOptions.tsx:227 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/SamOptions.tsx:505 \u2014 the two spans are one implementation copied and then locally edited \u2014 289 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/FilterOptions.tsx"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"627ab17894824df66fc667454d5e1e508edd28673ce52b33b5d2a0f929a1f883"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (42 lines \u00D7 2 locations): invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/addAdHocPostProcessingRequestedListener.ts:15 \u00B7 invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/addPBRFilterListener.ts:15 \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":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/addAdHocPostProcessingRequestedListener.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fc4cef3f7d2c1c2d776c44cc9428388ab5540624bac140606cd32f04885e2d1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (42 lines \u00D7 2 locations): invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts:293 \u00B7 invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts:336 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f3dc5711c57f3c15ca44196aa1c18fe665c8e127d3f9c768ce836501f2ed571"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (42 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/ImageContextMenu.tsx:196 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/VideoContextMenu.tsx:195 \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":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/ImageContextMenu.tsx"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"7281b4b1b72160953e64d1362ec2fabd84ad8301fc40daaab2136591af4e130c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (42 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx:97 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx:151 \u2014 the two spans are one implementation copied and then locally edited \u2014 262 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"e62dc3c9551c8a6cee48c07e7e5ceb63ea5aa7968f04d68f4ee9ecea37ca7325"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (42 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/NodeWrapper.tsx:19 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/NonInvocationNodeWrapper.tsx:18 \u2014 the two spans are one implementation copied and then locally edited \u2014 228 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/NodeWrapper.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a4935a0ddddc18f0c30a9f530f48f570a2f356b6cfa551c3f229847a16abbfd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (42 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromImage.ts:17 \u00B7 invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromVideo.ts:17 \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":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromImage.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"097aab794a762273190bda84a70512cff1893e1302b8817ad6694c3c23922eb2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (42 matched lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/mock-backend.mjs:2232 \u00B7 invokeai/frontend/webv2/scripts/mock-backend.mjs:2434 \u2014 the two spans are one implementation copied and then locally edited \u2014 334 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":"invokeai/frontend/webv2/scripts/mock-backend.mjs"},"region":{"startLine":2232}}}],"partialFingerprints":{"codehealthFindingId/v1":"464b1e663f338656f3162dd4898ce27490ad5a70a111d7fc3aededef5dbad264"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (42 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/panes/LayerEditorPanes.tsx:198 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/panes/LayerEditorPanes.tsx:261 \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/LayerEditorPanes.tsx"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf5838a813211ba944f2d6d4002e176532d6519a44504b18cfcf39930b448fa3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (42 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewActionStrip.tsx:112 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewZoomMenu.tsx:21 \u2014 the two spans are one implementation copied and then locally edited \u2014 204 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewActionStrip.tsx"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"22261962707d416e4d37b65f71954d8e0b3933897c8af8509ba808d8d7146489"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (41 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts:353 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts:300 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"875f8ee5a82f200dd253c0a0269bf19273935db1c6a716daaa0bda059321906c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (41 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledHeight.tsx:23 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledWidth.tsx:23 \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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledHeight.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"42db6961bbadcc17e748603d36bbe0dfd904847d2ee764a2287070033514df82"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (41 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSetOptimalSizeButton.tsx:15 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSetOptimalSizeButton.tsx:15 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSetOptimalSizeButton.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"0af2ae5e867479340640ceb89658416cfe3a2ff868aa54da52b29ae38b13d2c5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (41 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/ui/add-models/ScanResults.tsx:56 \u00B7 invokeai/frontend/webv2/src/features/models/ui/add-models/StarterList.tsx:62 \u2014 the two spans are one implementation copied and then locally edited \u2014 230 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":"invokeai/frontend/webv2/src/features/models/ui/add-models/ScanResults.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"fee6a6e8769ce7d6fc5abb1c11326d006048ad9e5763a1ca86797cf571507e95"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (41 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-operations/FilterOperationCoordinator.ts:32 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/contracts.ts:141 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/FilterOperationCoordinator.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"35195d6c2d84f1188e61d97cda4ce0e2b970a89e5db93a7816392e8b4526a63d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (40 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterInpaintMask.ts:31 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRegionalGuidance.ts:31 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterInpaintMask.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f2497d6eef7fe7a916afc797b70960f71f868171d7495d379423ccd69e9abfa"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (40 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorUniformRandomDistributionSettings.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorUniformRandomDistributionSettings.tsx:7 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorUniformRandomDistributionSettings.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"be611703fb5acfc4364a39e9288444a129e45c3cc56d04e15ddb50ba1d6fd78e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (40 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/savedWorkflowFieldUtils.ts:45 \u00B7 invokeai/frontend/webv2/src/features/workflow/data/savedWorkflowFieldUtils.ts:46 \u2014 the two spans are one implementation copied and then locally edited \u2014 224 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/savedWorkflowFieldUtils.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"dacc42c5fcd8a647bb479d32d143d3554153b80ebc3d9584ac64f22717707795"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (39 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/hooks/copyHooks.ts:17 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/hooks/useSaveLayerToAssets.ts:17 \u2014 the two spans are one implementation copied and then locally edited \u2014 140 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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/copyHooks.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"657e60e3ebf5f74a6a693d4b7bb4e195371a72211a8e39205658dd5fabd72602"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (39 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowThumbnail/WorkflowThumbnailField.tsx:83 \u00B7 invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetForm/StylePresetImageField.tsx:44 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowThumbnail/WorkflowThumbnailField.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"acfebc08544ebc0e850cce66e7a9155cedc6f9be8c5af4f0d9b17c77e70288a0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (39 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/store/util/testUtils.ts:804 \u00B7 invokeai/frontend/webv1/src/features/nodes/store/util/testUtils.ts:1488 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/util/testUtils.ts"},"region":{"startLine":804}}}],"partialFingerprints":{"codehealthFindingId/v1":"152d957374edd9c93c94b5b03668b91d5eedabeb7f05765c6f6d77ba5775bcbf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (39 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/workflowImageExport.ts:81 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/editor/workflowImageExport.ts:127 \u2014 the 2 copies are spread across 2 files, and what repeats is a LIST OF ENTRIES rather than behaviour \u2014 the same entries written out more than once. Extract them into one shared, exported constant and spread that constant into each site, rather than into a function the sites call: a list like this often lives in declarative metadata (a decorator\u0027s options object, a static configuration table) that a build step must be able to read statically, where a function call is not allowed. Adding an entry to one copy and not the other is the failure this prevents."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/workflowImageExport.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"850d1ca5d62df446f827aacfc54f5bdaa10a407dd16c722818ba8d1a858cb8b5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (39 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/MaskAdjustment/ParamMaskBlur.tsx:18 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillTilesize.tsx:17 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/MaskAdjustment/ParamMaskBlur.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"4902e4a20a0f9c7a53b59522477c01ff6a1931f388f6996ca6473315dce56d90"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (39 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts:501 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts:563 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"4505dd7b3964191e5c25d109719bbd50a015f13b457fbb3e1800697ef91671ca"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (38 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/schema/parseSchema.ts:123 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/schema/parseSchema.ts:202 \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":"invokeai/frontend/webv1/src/features/nodes/util/schema/parseSchema.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a30064a05d6391e27128a72eb379c8ce1067d879844d80178c967bc4b34d239"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (38 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Mu.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Steps.tsx:14 \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":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Mu.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f186da38642e24f2b092cd20f3cab8ed7026d59bfbc1384ba51bf9aca81df8e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (38 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamCreativity.tsx:17 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamStructure.tsx:17 \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":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamCreativity.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbb72f6ec9d7ccc307d9fa3c0ad9bc114fd38c6dbcf3cce528912bd1b23ae0e6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (38 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/identity/ui/AccountMenu.tsx:15 \u00B7 invokeai/frontend/webv2/src/features/identity/ui/AccountMenuSection.tsx:12 \u2014 the two spans are one implementation copied and then locally edited \u2014 273 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":"invokeai/frontend/webv2/src/features/identity/ui/AccountMenu.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"cde19ea9dd3e10d96c6059cd2cddbe7fdeb8790551539ba43a11585d5c5a66bb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (37 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonHover.tsx:47 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSlider.tsx:102 \u2014 the two spans are one implementation copied and then locally edited \u2014 159 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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonHover.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"643e8c4d0dc69e90248c3ce58e31329d5a1a76f8f6238f7e13154c79fbae6272"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (37 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/FloatFieldSlider.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/IntegerFieldSlider.tsx:11 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/FloatFieldSlider.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"535734b9b20e8131d13a74587bffcd09fbf534ffe484c30cf366d794086fe473"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (37 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/field.ts:936 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:1083 \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":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":936}}}],"partialFingerprints":{"codehealthFindingId/v1":"daa649b3f999f6e28e94efa1035573e371ae78be2f287d73a5572fc985504139"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (37 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx:121 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx:161 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcf0040ce8214e7f39e0d97a968f5e971ce8570639668b6bd934d29f00dc6037"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (37 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4GuidanceScale.tsx:17 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Mu.tsx:23 \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":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4GuidanceScale.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"7678506042a3ebb871eae23bd1e9813a67349f231dc42cdfb46e0ec443eaa57c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (36 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObject.tsx:22 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Transform/Transform.tsx:13 \u2014 the two spans are one implementation copied and then locally edited \u2014 224 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":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObject.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a487879033b6ac102d3a5b0f20d293db0de041321542966d3585defa1f91c1b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (36 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsSettingsPopover.tsx:23 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/GallerySettingsPopover.tsx:23 \u2014 the two spans are one implementation copied and then locally edited \u2014 162 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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsSettingsPopover.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb82291b23b7bcd3ac9c22bc6b135a4fb0500a6c6508f1428b508b3e58d3fe8a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (36 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/useScrollableGallery.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/queue/components/QueueList/useScrollableQueueList.ts:8 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/useScrollableGallery.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f1f70c0645a1e3cb307935fa0001a660a2d6cf49309434c892686a8b3bc712f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (36 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/field.ts:983 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:1131 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":983}}}],"partialFingerprints":{"codehealthFindingId/v1":"27802bd010044f1402100747344128e6dad4434a7150660727710879febf4d9d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (36 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaleMethod.tsx:15 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMode.tsx:10 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaleMethod.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a6983a8eb579f32eab2f44f6a408adf41b31823fa78ab99357b88644af1f32f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (36 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileOverlap.tsx:16 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileSize.tsx:16 \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":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileOverlap.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"3945636a70e2296d60c024bfc0b9aad9f48e2660940abbca64ade903fd0128b1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (36 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/ui/uiStore.ts:77 \u00B7 invokeai/frontend/webv2/src/features/nodes/ui/nodesUiStore.ts:36 \u2014 the two spans are one implementation copied and then locally edited \u2014 282 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":"invokeai/frontend/webv2/src/features/models/ui/uiStore.ts"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"89ae77c80082b188b12cf32c116078c7f0656e80e09dd9c32578346ea158a105"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (36 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/video/ui/VideoConditioningClipField.tsx:45 \u00B7 invokeai/frontend/webv2/src/features/video/ui/VideoSourceClipField.tsx:43 \u2014 the two spans are one implementation copied and then locally edited \u2014 209 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":"invokeai/frontend/webv2/src/features/video/ui/VideoConditioningClipField.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"38089e03174a65aa278a54c4fe7ab994efd0b6add2f4e58b9e95b0f944e6ec09"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (35 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultScheduler.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVaePrecision.tsx:16 \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultScheduler.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d494fd6a59906be776b8e3e1483bbc5aa0dac8a973bdab13b84734e76e50a75"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (35 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Core/ParamSteps.tsx:23 \u00B7 invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerSteps.tsx:23 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamSteps.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f0b738116714e6125afbc15fe613be2625ebf2b67c7c6cd1d28c779fd2cfa5c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (35 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/External/GeminiProviderOptions.tsx:22 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/External/OpenAIProviderOptions.tsx:29 \u2014 the two spans are one implementation copied and then locally edited \u2014 231 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":"invokeai/frontend/webv1/src/features/parameters/components/External/GeminiProviderOptions.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"46827d1acbdfc3a074beca47e8ea8c302cbd85b53891a5dd78520c57c67b2a7f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (34 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts:98 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts:83 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c272e699ab4483cc063830009d3ade82a3ca78c195bf71aceb123dc7d05c558"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (34 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:84 \u00B7 invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts:78 \u2014 the two spans are one implementation copied and then locally edited \u2014 292 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":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d0369258707925a458d0b04c22786f4547b05496994658b147dbf660833fd91"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (34 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetSearch.tsx:9 \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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6077417e94ffe174c4505d946f81c1093f39f04f5406802159900f7503f38fe"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (34 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/hooks/useRecallAllImageMetadata.ts:16 \u00B7 invokeai/frontend/webv1/src/features/gallery/hooks/useRecallRemix.ts:17 \u2014 the two spans are one implementation copied and then locally edited \u2014 158 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":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallAllImageMetadata.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e7d58cc7cc63cd5365e405a806e0b1e300711a2b1e74ed3a6e2218a8f142712"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (34 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/DefaultWeightMax.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/DefaultWeightMin.tsx:11 \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/DefaultWeightMax.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"634ab5c3c9e195c5d52441d5efe390caad7e8561d99ec22caa2ff2728228c13e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (34 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/queue/hooks/useCancelQueueItem.ts:8 \u00B7 invokeai/frontend/webv1/src/features/queue/hooks/useCancelQueueItemsByDestination.ts:8 \u00B7 invokeai/frontend/webv1/src/features/queue/hooks/useDeleteQueueItem.ts:8 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useCancelQueueItem.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f0aaf91ea1373b1ad83abc129a5a068d3d00dc6344f37ab6c2775ac20c11a01"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (34 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx:18 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadUseALayoutImageButton.tsx:19 \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":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ca5755424ea51c590fe45d1d6872ec7caa7c48e0cf310a56778b0ab17f37cae"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (34 lines \u00D7 3 locations): invokeai/frontend/webv2/src/platform/ui/theme/recipes.ts:445 \u00B7 invokeai/frontend/webv2/src/platform/ui/theme/recipes.ts:539 \u00B7 invokeai/frontend/webv2/src/platform/ui/theme/recipes.ts:590 \u2014 all 3 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/theme/recipes.ts"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"38e9f1a36932a41adafb50d55ce4145e744f8af9e3210ac84e37a096b51bd067"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (34 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/workbenchState.ts:5581 \u00B7 invokeai/frontend/webv2/src/workbench/workbenchState.ts:5624 \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":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":5581}}}],"partialFingerprints":{"codehealthFindingId/v1":"33da5afde21efb73bc7c85ec8c153c73245c48039d413f14563279b7a5be033a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (33 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts:180 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts:152 \u2014 the two spans are one implementation copied and then locally edited \u2014 250 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d70af6580c09e4110cfae1cd3f0fbfb444318f3ee55c236274f62ded6fae3f7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (33 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/deleteImageModal/components/DeleteImageModal.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/deleteVideoModal/components/DeleteVideoModal.tsx:15 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/components/DeleteImageModal.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ad8b8c95771a181b5d31f47c74e384f2926acea8760112ebbae1e006ede5216"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (33 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx:167 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx:226 \u2014 the two spans are one implementation copied and then locally edited \u2014 234 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":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"d307d4ed336bd2253305f2df17dd6280078078490422b5b335e5e49b03d77f8e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (33 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/FloatFieldInput.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/IntegerFieldInput.tsx:11 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/FloatFieldInput.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"8986302bad85561501bdef9f928a8413a503d8e0ef846026038bfeab4cd3a3a9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (33 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addMiniMaxH3LoRAs.ts:25 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addQwenImageLoRAs.ts:16 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addWanLoRAs.ts:92 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addMiniMaxH3LoRAs.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"4552cc00bb429c21497e86036cbd5c4d72cddd3264db4e709aa14d686059438f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (33 lines \u00D7 10 locations): invokeai/frontend/webv1/src/features/parameters/components/Core/ParamCFGScale.tsx:20 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeExponent.tsx:24 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeScale.tsx:22 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamGuidance.tsx:24 \u00B7 \u002B6 more site(s) not listed \u2014 the 10 copies are spread across 4 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 10 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamCFGScale.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"c09e14e6667d111fc35525a57d3781b88b7cce841ca5e1eadb28bcc64829cc6e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (33 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeScale.tsx:22 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceMultiplier.tsx:20 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceRandomizePercent.tsx:23 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceStrength.tsx:23 \u00B7 \u002B2 more site(s) not listed \u2014 the 6 copies are spread across 3 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 6 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeScale.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2e56a5eab7542e3c5eef193ca84848a591c6e4b4c091418a4426be4367e32ae"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (33 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceStrength.tsx:23 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceStrength.tsx:23 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceStrength.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"49a4e7000ef86874b64ef3bb7415c2bc2911d2bb20835518784c3af9f3f00898"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (33 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerNegativeAestheticScore.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerPositiveAestheticScore.tsx:11 \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":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerNegativeAestheticScore.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb60a7632411b568398fec10a6b42e1dca6655f3bff2238b4933a6005bbee7b5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/auth/components/UserProfile.tsx:192 \u00B7 invokeai/frontend/webv1/src/features/auth/components/UserProfile.tsx:237 \u00B7 invokeai/frontend/webv1/src/features/auth/components/UserProfile.tsx:300 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/UserProfile.tsx"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a03a961fad346f6d292d14f4004be9c3d52810a26b81e15f31194bf43f7a5d3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolWidthPicker.tsx:138 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarScale.tsx:145 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolWidthPicker.tsx"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"46b58e711181d459ab75cd609519e4cb094b9042d96313eb30492ba5302a5b86"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityFilter.ts:5 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntitySegmentAnything.ts:5 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityTransform.ts:5 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityFilter.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"91e760ca47f38250bd63994d0785dd697dcca6f6fe47f76972ff39055ed6e522"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx:240 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx:483 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"eca136af466a82dec1adb6499ab83db7c7a66f75446c36573c818d5a93d1a58f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorUniformRandomDistributionSettings.tsx:53 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorUniformRandomDistributionSettings.tsx:48 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorUniformRandomDistributionSettings.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"385b34f42312d1b10cb1890be961169f968c04a0c1701bcd0635383f0bf7a258"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibrarySideNav.tsx:62 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibrarySideNav.tsx:96 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibrarySideNav.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"2036b457d4777312d01436f7c0d18e8bb7928cff99299a5a92527fe1b9946194"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/queue/hooks/useCancelAllExceptCurrentQueueItem.ts:3 \u00B7 invokeai/frontend/webv1/src/features/queue/hooks/useClearQueue.ts:3 \u00B7 invokeai/frontend/webv1/src/features/queue/hooks/useDeleteAllExceptCurrentQueueItem.ts:3 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useCancelAllExceptCurrentQueueItem.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0cf59c5eaf8b2f22c19fb2ba9747b91789c6b48da48049327368fb9b0a6e2d6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/images.ts:1055 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/videos.ts:361 \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":"invokeai/frontend/webv1/src/services/api/endpoints/images.ts"},"region":{"startLine":1055}}}],"partialFingerprints":{"codehealthFindingId/v1":"896bdf1489bd6b4713fc11c476a8d96208f4a130801791974a9dbff18a4f2ca7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (32 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/app/UpscaleUiAdapter.tsx:11 \u00B7 invokeai/frontend/webv2/src/app/VideoUiAdapter.tsx:28 \u2014 the two spans are one implementation copied and then locally edited \u2014 193 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":"invokeai/frontend/webv2/src/app/UpscaleUiAdapter.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"c119dc5da97b840a5fb7364b436287f7f3c212c469443fb9e0fb94d59fffd6fd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx:577 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx:812 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx"},"region":{"startLine":577}}}],"partialFingerprints":{"codehealthFindingId/v1":"25571ebe1d875f3e4cf4f0cfd6ed19470f5c78bd93f55666e694f9526891ef9c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (32 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-map/imageLabelCache.ts:71 \u00B7 invokeai/frontend/webv2/src/workbench/image-map/thumbnailCache.ts:35 \u2014 the two spans are one implementation copied and then locally edited \u2014 203 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":"invokeai/frontend/webv2/src/workbench/image-map/imageLabelCache.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"6324cbece8617ebc963b6d0bd70a743630436b1519f2c568c039b7c2295dc96f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (31 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx:142 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx:70 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9dddc44144b8e992c68ef7e2431ef72c479d1f6eb4e9a0e997c5519d24461d9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (31 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarNextButton.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarPrevButton.tsx:11 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarNextButton.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ed28598264b3562c4f065668a377c59f45a11950c3a155002053a557431768a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (31 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx:208 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx:169 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx:167 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx:188 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b07136a73a1942c5a1bbc8ecc84cf68acb2eb8912f504888573d08f0c666830"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (31 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/mock-backend.mjs:2294 \u00B7 invokeai/frontend/webv2/scripts/mock-backend.mjs:2342 \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":"invokeai/frontend/webv2/scripts/mock-backend.mjs"},"region":{"startLine":2294}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cd78b7e4d46cbc3b2d0bc330f99c503858e068f2ecce8ffa2adbd0389b183fa"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (31 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/ui/galleryDensity.ts:23 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/preview/previewDensity.ts: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":"invokeai/frontend/webv2/src/features/gallery/ui/galleryDensity.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"f53e46b84238331f50b242f130b20b45127c48220dbd2265f7a01785fe8b9238"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (31 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx:582 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx:971 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx"},"region":{"startLine":582}}}],"partialFingerprints":{"codehealthFindingId/v1":"a494636c57cf0da932c7220d1dc3810a6bd6d42ee1f1f020f61823e28aca3963"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterBlur.tsx:20 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterNoise.tsx:35 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterBlur.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"c08d1a5018ba1458e4fbba8d0609cacfa268bd8d8781df7686ec24cea4a8209f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/customNodes/CustomNodesInstallLog.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueue.tsx:42 \u2014 the 2 copies are spread across 2 files, and what repeats is a LIST OF ENTRIES rather than behaviour \u2014 the same entries written out more than once. Extract them into one shared, exported constant and spread that constant into each site, rather than into a function the sites call: a list like this often lives in declarative metadata (a decorator\u0027s options object, a static configuration table) that a build step must be able to read statically, where a function call is not allowed. Adding an entry to one copy and not the other is the failure this prevents."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/customNodes/CustomNodesInstallLog.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"e00324a4f4a6d7414912d094a5f6dab53cd201fd9c180f2de469d6856160d7b7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (30 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterBundleButton.tsx:21 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelDeleteButton.tsx:23 \u2014 the two spans are one implementation copied and then locally edited \u2014 152 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterBundleButton.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"030a3cd3f4bdcdd679379461a690cde1753d6bded8ce285427f151d5772b21e3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElementContentEditable.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/TextElementContentEditable.tsx:10 \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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElementContentEditable.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"9819429fca8ed58647028d1c80c89227256d793b857d99dfb5c04eea15fe960b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/EditWorkflow.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/ViewWorkflow.tsx:10 \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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/EditWorkflow.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"324815a725d364f071ab1bb2229caf82678558c00ef97bb51263ec6618b2c18c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasViewer.tsx:13 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasWorkspace.tsx:15 \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":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasViewer.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"3776cc3c4c00e98bfb4d91184ad01cde4523a6614c553ff5dd79a22948fda526"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/promptFields/NegativePromptField.tsx:84 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptField.tsx:122 \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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/NegativePromptField.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"c08bce7ec00ba003e6ba5583e03c1958a4d2a02fbce91ad95b1024891b4f4bd8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (30 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-operations/SelectObjectCoordinator.ts:284 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/SelectObjectCoordinator.ts:335 \u2014 the two spans are one implementation copied and then locally edited \u2014 173 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/SelectObjectCoordinator.ts"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ff15a0a586899caa010ebcc8ca5e85dbec4cb8f3492b004096d367f67883ff2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-operations/contracts.ts:328 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/filterOperationSession.ts:33 \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":"invokeai/frontend/webv2/src/workbench/canvas-operations/contracts.ts"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"72e2be27b542044436f3b349d43b17aa8d18679717349b30d72f7a045503cf88"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskDenoiseLimitSlider.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskNoiseSlider.tsx:11 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskDenoiseLimitSlider.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fc229bf9acc225da05dc42da05871bd70ea349ad5b349f6cdf552bd574cef36"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (29 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageState.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageStateWithCanvasOptions.tsx:17 \u2014 the two spans are one implementation copied and then locally edited \u2014 206 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":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageState.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"16a45cd0dc6c419a22273918f107729e8a3ef641fd2310b291810ae146cecbb7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (29 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageStateWithCanvasOptions.tsx:31 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettingsEmptyState.tsx:44 \u2014 the two spans are one implementation copied and then locally edited \u2014 188 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":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageStateWithCanvasOptions.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"cac39dfbb4193aee7b8e80a2352521a45a11ba15d3768afe9b52f7f27d60d002"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectModel.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectPointType.tsx:9 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectModel.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"762504b1ed78fe2f232230872fb0efaef2d8eed19950cb7d4158306a262be28e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts:412 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:1305 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts"},"region":{"startLine":412}}}],"partialFingerprints":{"codehealthFindingId/v1":"a24a4142a89877278e066f0b6f198a8fb8f332b1d610af00976f3454928498d2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataGraphTabContent.tsx:15 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataWorkflowTabContent.tsx:15 \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":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataGraphTabContent.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"fafb47c4f506531c4f7931aa2ca2ad29cbe8ebdff9ef0cb9080d266dca6e402a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/DefaultFp8StorageControlAdapter.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultFp8Storage.tsx:13 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/DefaultFp8StorageControlAdapter.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"1da6257d66d682c72184fca17fc26784ea9d28561a8cbed94713986aa722c57b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts:627 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/v2/workflow.ts:7 \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":"invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts"},"region":{"startLine":627}}}],"partialFingerprints":{"codehealthFindingId/v1":"752a6ab711255b0bef70b1923a677ec0aaeae601e4aafeba1f21af5a5c4e66c0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts:200 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts:103 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts:193 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"655f7e2e2ee83b11a4fefd2618cac9a31e64fa88379f60a694b8942f2d165cdc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPGEmbedModelSelect.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPLEmbedModelSelect.tsx:12 \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":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPGEmbedModelSelect.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"d236a407ec99004b9c883bf55943ccc76454b283fff2c60605cfc8214b3c4f30"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImageScheduler.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxScheduler.tsx:11 \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":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImageScheduler.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"2222aa68430bf85fb9a33e1baa3c480d213b3deec7740170b3a0b54ecdeeda02"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/hooks/useCancelAllExceptCurrentQueueItem.ts:8 \u00B7 invokeai/frontend/webv1/src/features/queue/hooks/useDeleteAllExceptCurrentQueueItem.ts:8 \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":"invokeai/frontend/webv1/src/features/queue/hooks/useCancelAllExceptCurrentQueueItem.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"2243af75a808b2b7dd494aa51a592f5efcfb532cb41a6b63cbb1b166404e0b61"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx:245 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx:204 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx:225 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1284e1f3f91448d4dd0784d6830a0326d7d85325aaf442ebea9569c1bd5e259"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/videos.ts:197 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/videos.ts:235 \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":"invokeai/frontend/webv1/src/services/api/endpoints/videos.ts"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e246285980ec8ffa24ec2ac5ab52e09a6883502314c47a93bf80637e3a222a4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (29 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/ui/useGalleryActions.ts:100 \u00B7 invokeai/frontend/webv2/src/features/gallery/ui/useGalleryActions.ts:243 \u2014 the two spans are one implementation copied and then locally edited \u2014 154 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":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryActions.ts"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec5fa23ddfd980f769b8a96dfd369dc56c67a367e91115e97ca156b7d5fa8c0b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/upscale/core/graph.ts:779 \u00B7 invokeai/frontend/webv2/src/features/upscale/core/graph.ts:856 \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":"invokeai/frontend/webv2/src/features/upscale/core/graph.ts"},"region":{"startLine":779}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e6013b0467988c6adae5fcf3b3d5807814e6121af05ebcc15f3ba9b52cadd93"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (28 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts:426 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts:369 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts"},"region":{"startLine":426}}}],"partialFingerprints":{"codehealthFindingId/v1":"68f265b9cfe7206633e5ce9559ecab1b1bc50d380268dc3383383fd84f1de9b7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (28 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/hooks/useCreateStylePresetFromMetadata.ts:8 \u00B7 invokeai/frontend/webv1/src/features/gallery/hooks/useRecallPrompts.ts:13 \u2014 the two spans are one implementation copied and then locally edited \u2014 125 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":"invokeai/frontend/webv1/src/features/gallery/hooks/useCreateStylePresetFromMetadata.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0110312be23f7e7ddd9bd57d1fa89d9bfe4e65b0fb60bfd8fec5a418644d754"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (28 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx:29 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx:84 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx:24 \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":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"99e4d1ba9902ca598d0079451baf25c062f097d3f9429c9651e712cb8a065f5d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (28 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/parameters/components/Core/ParamAnimaScheduler.tsx:15 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImageScheduler.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypePreset.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxScheduler.tsx:12 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamAnimaScheduler.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9099c39e606420ff2149963c32b8c7255c020c86a90632c29d5c6d46a55f9f0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (28 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx:270 \u00B7 invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx:443 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0a355ca2c39794520e8505d68ed89382d0f128b5e3be1e2c299911c28e2739f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (28 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/InpaintMaskSettings.tsx:28 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRegionSettings.tsx:25 \u2014 the two spans are one implementation copied and then locally edited \u2014 192 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/InpaintMaskSettings.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b80988f915de19c7458740d465db1d88eed62d6324a799496e8c0f6a20152d6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsConvertToSubMenu.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceMenuItemsConvertToSubMenu.tsx:12 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsConvertToSubMenu.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"47c1fdb5da8d8248ea61e7e1f9622f664fcad42fbc7349e4dc01f56a91f09deb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsCopyToSubMenu.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceMenuItemsCopyToSubMenu.tsx:12 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsCopyToSubMenu.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"dee83b467a39a905c916c6c8489d74051e3fe088166db8c2d01a57c941dacee9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts:295 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts:593 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b9532430aae2d598aca850e4f0a32f17a68c07d234efc8c0d750f5e5c58d758"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (27 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/getItemsPerPage.ts:6 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/getItemsPerRow.ts:7 \u2014 the two spans are one implementation copied and then locally edited \u2014 180 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":"invokeai/frontend/webv1/src/features/gallery/components/getItemsPerPage.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f13733e29b522ba028023610f815e84ec91d5c60736309657cdb111f930fd83"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderResults.tsx:95 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterModelsResults.tsx:80 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderResults.tsx"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"df68eb8278ca9f173d61f3e8e2a763a6106b12784b018930260b19d79dbda391"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldEditModeNodes.tsx:34 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldHandle.tsx:75 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/OutputFieldHandle.tsx:75 \u2014 the 3 copies are spread across 3 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldEditModeNodes.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8af6cbffff16867afc232af4ea2b901cb6eeb6fb7963e504318aa2db6185d96"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorParseStringSettings.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorParseStringSettings.tsx:13 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringGeneratorParseStringSettings.tsx:13 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorParseStringSettings.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"a54d0c2adc3be27e5f007edfdef8839b2a7a37496522b887975373853a3047e2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (27 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringFieldCollectionInputComponent.tsx:117 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementStringDropdownSettings.tsx:154 \u2014 the two spans are one implementation copied and then locally edited \u2014 156 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringFieldCollectionInputComponent.tsx"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c6ae0faac6b0c6d589bfe7fe2a1de70a6a98cf57906643baa4e8aa262897d79"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts:667 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/workflow/validateWorkflow.ts:94 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts"},"region":{"startLine":667}}}],"partialFingerprints":{"codehealthFindingId/v1":"011a7dc2c98ddacbce8ecf5c51e880eec32cd714aa6f0ce408ff0d893cd3ed71"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts:5 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/v2/common.ts:19 \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":"invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"7060d1c3c5c1d0c9a6f5793f2422f350da9bb7808b7218dadd3bef3220c27e1b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (27 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx:27 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx:22 \u2014 the two spans are one implementation copied and then locally edited \u2014 184 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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc81c4d98a1fb5ee66120348ef8d834da69ec1feb45bec17178360600e7f6df8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (27 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/ui/manager/DetailPane.tsx:47 \u00B7 invokeai/frontend/webv2/src/features/nodes/ui/manager/DetailPane.tsx:40 \u2014 the two spans are one implementation copied and then locally edited \u2014 191 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":"invokeai/frontend/webv2/src/features/models/ui/manager/DetailPane.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd177754b6f42106d903e8404ef70909b36d4918cd7c8eadc58197974b8795db"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (27 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/geometryForm.tsx:71 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/panes/TransformPane.tsx:83 \u2014 the two spans are one implementation copied and then locally edited \u2014 263 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/geometryForm.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"ece91b9a32786f46603f5c9df581118335276be28a6a83dfb3acf10d8354e605"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFilterButton.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarSelectObjectButton.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarTransformButton.tsx:10 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFilterButton.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7abfc215f2f44fb0d80f5715ce1dc4c3b416d8e3e8f43b0011c6d4b902940f5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/Krea2StyleStrength.tsx:30 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/Weight.tsx:31 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/Krea2StyleStrength.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ad70fe3890d45da2d1ea57b807f2af89a5d512fe7811d499c1dff12dff345f0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectBrushLine.ts:18 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectEraserLineWithPressure.ts:15 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectBrushLine.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"89d74a3f1e3a6972a7afeae24cf03ac3261ad7ed54cc397495ac7527eba3a768"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts:266 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts:756 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"999d7fb59e8f306a81b6f7469d6d1c2d05002b333b16acf2b301639ee665bf11"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx:250 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListBulkActions.tsx:150 \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfb275047c7b7b70bac218bd4d4b31c5ef870abd023b3c3cd741f38117b477d9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/useFloatField.ts:11 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/useIntegerField.ts:11 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/useFloatField.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"596d9aef34989966f1d9a912c871ce423a0a70c9290cd6e5071c9e4f601a29a3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (26 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addLoRAs.ts:7 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSDXLLoRAs.ts:7 \u2014 the two spans are one implementation copied and then locally edited \u2014 176 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addLoRAs.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7d3d31f59a3737e0a244ff2a003e6be00349282eaa50369cc92d650990aef31"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/parameters/components/Core/ParamScheduler.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleScheduler.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerScheduler.tsx:11 \u2014 the 3 copies are spread across 3 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamScheduler.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"902e9a60f83dbf0a4a4dbaabd80cb5abdd204d72c8a505bd7a06ffb36647bc17"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/ParamPostProcessingModel.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamSpandrelModel.tsx:11 \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":"invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/ParamPostProcessingModel.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddf2f83fb28ad8cc350372c971b08f8e2245bd22c39cfc29c404ca4ebbb3baf1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/hooks/usePauseProcessor.ts:16 \u00B7 invokeai/frontend/webv1/src/features/queue/hooks/useResumeProcessor.ts:16 \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":"invokeai/frontend/webv1/src/features/queue/hooks/usePauseProcessor.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"53949cc0618ca48c893c3bfe68ee05929f4737f89a266a8c0e9fe9c060cd11d2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1025 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1063 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1335 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1368 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":1025}}}],"partialFingerprints":{"codehealthFindingId/v1":"4110b0ca7cfaf653aad9e9c957bbb51b8b583c385e5ba35c456dbf25d2f3f926"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx:20 \u00B7 invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx:19 \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":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"f793a3056118d81f6668fe3170f37ba136be6ef25333ac4f5ccddb7fd0f4540d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/ui/layouts/CanvasLaunchpadPanel.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/GenerateLaunchpadPanel.tsx:11 \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":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasLaunchpadPanel.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"828ec229a84910fee29646d6a96d3eb964b83180b434a55b787a91c94f204c25"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx:154 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx:129 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx:127 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx:148 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"161d6312e8b0363cc723fdd1dcc79745cffda4cb13c15aa5e5e750a3d76f47f7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/images.ts:831 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/videos.ts:272 \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":"invokeai/frontend/webv1/src/services/api/endpoints/images.ts"},"region":{"startLine":831}}}],"partialFingerprints":{"codehealthFindingId/v1":"c00c0f09f387c71f26e43f57ebd93762389947132dafc6d7413bc91247cd15cf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/core/validation.ts:400 \u00B7 invokeai/frontend/webv2/src/features/workflow/core/validation.ts:479 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/validation.ts"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d373e1d574c7200c1c8602c01a65520bd561bbd25941174d3154c399aa11187"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (26 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-operations/contracts.ts:102 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/operationController.ts:19 \u2014 the two spans are one implementation copied and then locally edited \u2014 160 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/contracts.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b7e75e9ef30dbab2181ea6d078281b57324da7d233a9e50c9627e9af00aa452"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projectWorkflows.ts:597 \u00B7 invokeai/frontend/webv2/src/workbench/projectWorkflows.ts:634 \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":"invokeai/frontend/webv2/src/workbench/projectWorkflows.ts"},"region":{"startLine":597}}}],"partialFingerprints":{"codehealthFindingId/v1":"126bbe5aaa0d6a259949e3e566feb8539e903b3b73df6be4c1c60959c49d4683"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (25 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/animaComponentSync.ts:5 \u00B7 invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/krea2ComponentSync.ts:6 \u2014 the two spans are one implementation copied and then locally edited \u2014 209 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":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/animaComponentSync.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c45fd7500bc5f7f64517977333b1c68b25425bbb86f75b665183dab4c52e624"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsCopyToSubMenu.tsx:32 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsCopyToSubMenu.tsx:39 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsCopyToSubMenu.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"194ed85c5cb59b61d11c84224fe1db1a6b1825b4fbd512530d1b80a8ea87a41a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Tool/GradientIcons.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/GradientIcons.tsx:33 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/GradientIcons.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ac7335dbdc2c8b52efe0abca4a93177594c414eb44b0f814dc056fd25852979"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolBrushButton.tsx:8 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolEraserButton.tsx:8 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolMoveButton.tsx:8 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolViewButton.tsx:8 \u2014 the 4 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. There is one copy in each of 4 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolBrushButton.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"be708f5da379bea47e4a8aef0d847c9dfc7e451715833afc9eee32c5f649f255"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectBrushLine.ts:69 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectEraserLine.ts:63 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectBrushLine.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f7a9fc7588e8ea78ea101d79b3148acb9f1f4fa0e8ff801562e5e66babfa226"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectBrushLineWithPressure.ts:38 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectEraserLineWithPressure.ts:21 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectBrushLineWithPressure.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dfe8b0b82e7448560c5dd52891da69eb12bade6884e2600eb467b467033b505"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (25 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectOval.ts:23 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectRect.ts:24 \u2014 the two spans are one implementation copied and then locally edited \u2014 254 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectOval.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"d163b50a9c8a75a7c65b7df1ed693b94714e2b1121c1cff7e1efa850c997b10b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1126 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1189 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1126}}}],"partialFingerprints":{"codehealthFindingId/v1":"f312606d2f3def84f74f95c544a1de8c960e7ac1fff59e9c403b32ebb78db4be"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx:136 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx:135 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"c18660dd53fc0fe578f2f535771a0b54f9d88266382bd573925249f4db133c92"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/WorkflowNodeInspectorPanel.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowPanel.tsx:9 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/WorkflowNodeInspectorPanel.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce98c23b2e48f19b969f8e9f72bba61704427e8678f4e11ec6da0e55fd93fe3e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (25 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/store/util/validateConnectionTypes.ts:10 \u00B7 invokeai/frontend/webv2/src/features/workflow/core/validation.ts:40 \u2014 the two spans are one implementation copied and then locally edited \u2014 224 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":"invokeai/frontend/webv1/src/features/nodes/store/util/validateConnectionTypes.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9fdeb27179753d2d17c513a3613e183a8be2ac1d7bce0a3b3a09c83b3349b01"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXLoRAs.ts:36 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSDXLLoRAs.ts:38 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXLoRAs.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"70b05e8343d2d93d5cb3c90883a06ca32330eff4db1006909d3c4598b7a6043d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts:282 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:865 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"f964710fde88cd4ff5e8e3eb2ab0684b3b420911d30b029b43dd12a9585986e0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/nodes/util/schema/buildFieldInputTemplate.ts:68 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/schema/buildFieldInputTemplate.ts:110 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/schema/buildFieldInputTemplate.ts:144 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/schema/buildFieldInputTemplate.ts:186 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/schema/buildFieldInputTemplate.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ba8e1f3370a89d3c319057cbf7de8b0d4bf97b3cf71312f7d347ab38626674a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx:41 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx:72 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"e99f3e2c0d12cdf029a5a36b50eb5863900fb33a101e5eb4cfe00c9c0ac0ead4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/store/readiness.ts:431 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:926 \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":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fbfeac13192b9fbefd945e3e2a7faf2062dfea7f820fe4625f004c08a94eff5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (25 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts:565 \u00B7 invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts:631 \u2014 the two spans are one implementation copied and then locally edited \u2014 162 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":"invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts"},"region":{"startLine":565}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d750f621c688bdcf5bed5543082757ea3e95bdee418f4dffd2927e1007d4102"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/ui/ModelsUiContext.tsx:35 \u00B7 invokeai/frontend/webv2/src/features/models/ui/ModelsUiContext.tsx:62 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/ModelsUiContext.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"db43eb1757f63449e998c424a56bcd342f5467a79b4f2178161984a7e1a38312"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx:21 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayer.tsx:20 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"94427c9b09a19a81f98bfc86a7cc4e104a9815c4d359bae27c62f47986f0c8cb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsConvertToSubMenu.tsx:33 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsConvertToSubMenu.tsx:41 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsConvertToSubMenu.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fa7a13ad0746d5da6b5191ae5fa73701fb7542f3d7ae993c1042f5fd0a0e0da"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterCannyEdgeDetection.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterMLSDDetection.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterMediaPipeFaceDetection.tsx:12 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterCannyEdgeDetection.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5cdff632c55bdb7559ca91ed20672f3ce9a185d3747a4f7a474418246dba187"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 8 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:312 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:350 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:388 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:478 \u00B7 \u002B4 more site(s) not listed \u2014 all 8 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":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"647ea79604eb7f33c300561189c6ed45e4e82abce95e8c2d9a6f6af3f87b361b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/filters.ts:332 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/filters.ts:414 \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":"invokeai/frontend/webv1/src/features/controlLayers/store/filters.ts"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"53d5c873f625bd01095cb96cb2f37356d1160391b123833e48dfa6b733390202"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemStarIconButton.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemVideoStarIconButton.tsx:12 \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":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemStarIconButton.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f3537ce583f86a2750816d13474ff4086e71d2ccee7ad04278efe6a3b83c9e1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/DefaultPreprocessor.tsx:41 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultScheduler.tsx:26 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVaePrecision.tsx:30 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/DefaultPreprocessor.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0e593ef05f552482e21d9b33dd5169923c6c6148addcd126c8bbc75705b7f37"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/IntegerFieldInput.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/IntegerFieldInputAndSlider.tsx:11 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/IntegerFieldInput.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"a29b998c7ae9e846d4c8aac99428e9b11a6cd740a9d0c635efeb6c6015dddd1e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/parameters/components/Core/ParamMiniMaxH3Duration.tsx:42 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamQwenImageShift.tsx:50 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamWanGuidanceScaleLowNoise.tsx:73 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamZImageShift.tsx:50 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamMiniMaxH3Duration.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"52c1a1fa91b88c0872a86d2fad2606be592701a833819af4e3109bb89615ac27"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/queue/hooks/useClearInvocationCache.ts:10 \u00B7 invokeai/frontend/webv1/src/features/queue/hooks/useDisableInvocationCache.ts:10 \u00B7 invokeai/frontend/webv1/src/features/queue/hooks/useEnableInvocationCache.ts:10 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/queue/hooks/useClearInvocationCache.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe4f88bb225e57e80db344606b40bb3fb874aad92cd02a6acfd36e35171f300a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-operations/generationCompositePlan.ts:263 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/generationCompositePlan.ts:323 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/generationCompositePlan.ts"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d802c22d86599e994099090a15ded46f7073f5cbbabf10d0f66930517503e31"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (23 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Tool/PinnedFillColorPickerOverlay.tsx:18 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolFillColorPicker.tsx:33 \u2014 the two spans are one implementation copied and then locally edited \u2014 167 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/PinnedFillColorPickerOverlay.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dea4dfbe759aadf8dc8ccb5f9399594518d6aba5f8411ad7d2e8bc8aa49b4fa"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts:13 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts:62 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts:285 \u2014 all 3 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f807ab25f7e494d647e07e727e972544644af6cc849bfbea443dd67533ecc9e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPEmbedModelSelect.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamT5EncoderModelSelect.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamFLUXVAEModelSelect.tsx:10 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPEmbedModelSelect.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e07d2198f44a02f29f0a3bb86a3c08f7d97fe8af7459d0a5f1ba76dd30b0309"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamMiniMaxH3ModelSelects.tsx:30 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamMiniMaxH3ModelSelects.tsx:83 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx:40 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx:94 \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":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamMiniMaxH3ModelSelects.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"26a069f60a87a3af8e46279b0f0ea1fdcd9619e0eb7bef053c0ad421a22dd99a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx:20 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/InitialStateMainModelPicker.tsx:19 \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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"861c06b58d2dc4602f1e49fa7b54cf8007a6c4594d97db0ac1db3afb7c6bd50b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx:300 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx:259 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx:258 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx:278 \u2014 the 4 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. There is one copy in each of 4 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"094f44cf75edf1af5f041ff0c2fdfacc1b9dbeec77066cb21588784fbaacdf6b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/ui/layouts/customnodes-tab-auto-layout.tsx:26 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/models-tab-auto-layout.tsx:26 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/queue-tab-auto-layout.tsx:26 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/customnodes-tab-auto-layout.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb3fcf056cf5eb7268cdb7c1a70d97f6db433a208e3e7478ccdf6c2706c83683"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx:259 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx:258 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx:278 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ea8c23eff0b51853e4ff33fa43f90a08f819bbdfa2dda0c85020ff65721ba8a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/workflowLibrary/components/UploadWorkflowButton.tsx:8 \u00B7 invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/UploadWorkflowMenuItem.tsx:8 \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":"invokeai/frontend/webv1/src/features/workflowLibrary/components/UploadWorkflowButton.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb1db7aabd2c66cc6cb43b563208b4e55c492d03b7bab5592ab8af8f6d365f7e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/models.ts:139 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/models.ts:422 \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":"invokeai/frontend/webv1/src/services/api/endpoints/models.ts"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"25bbe5b22e2373896e824e3706dd8808386536da47899e095988520aea5e78bb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/fonts/runtime.ts:102 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/render/fontLoader.ts:89 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/fonts/runtime.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d073de1668327a399825ce52db4242eb1dbfa799d96831605a7b6391fd609b6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2 locations): invokeai/frontend/webv2/src/platform/ui/HsvBoxPicker.tsx:181 \u00B7 invokeai/frontend/webv2/src/platform/ui/HsvBoxPicker.tsx:212 \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":"invokeai/frontend/webv2/src/platform/ui/HsvBoxPicker.tsx"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"40e5033a9ecb902aeb63a0e3d22388e82fe92643179997b5eba590bd7eda295c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (23 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/launchpad/pages/HomePage.tsx:41 \u00B7 invokeai/frontend/webv2/src/workbench/launchpad/pages/ProjectsPage.tsx:33 \u2014 the two spans are one implementation copied and then locally edited \u2014 156 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":"invokeai/frontend/webv2/src/workbench/launchpad/pages/HomePage.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"14b20ca010ec7db349ce61c9116148e939b1309d9903fc3f449def0346c81b2f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx:403 \u00B7 invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx:434 \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":"invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fa268ff3726f7d1456793054616bf5528cce20b004aa11946a73f7a4eeec515"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/util/promptAST.ts:501 \u00B7 invokeai/frontend/webv1/src/common/util/promptAST.ts:623 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/util/promptAST.ts"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"8784c11cc7d86e0bfd2ce9d9e4d5de0c7c48b1aaecdfd94265b6bbe22210831c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts:354 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts:423 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"73b18b2d9ec45a2df759f78158a4841a1f2bb694018b200fa215fd1397b3987b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLocateInGalery.tsx:16 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx:37 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLocateInGalery.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"272124791c8397883cfde93637988caefcff9950e31bea5817d0813086d5dabc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1313 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1343 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1372 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1313}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dd416306eb8f58968864698d0b1f49fe8489ce50199f9efdb546fb37ea1a8f0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/InvocationNodeTitle.tsx:20 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorTabEditableNodeTitle.tsx:10 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/InvocationNodeTitle.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"43552e26a4694d43cea1e56be714616647e7e76bd172198853c19e9eb7bd4d54"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts:119 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts:177 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts:230 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts:326 \u00B7 \u002B2 more site(s) not listed \u2014 the 6 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"663ba65bf0837b03b10b88cfe6bc6a88420a49ae45bc33c369ac145bae81288a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addImageToImage.ts:48 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts:67 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts:59 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addImageToImage.ts"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5d08643a81438d2b0b45ea05b8797f2b4348fa428e3d1c4dafb257437f1de91"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:780 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts:244 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts:343 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":780}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2ec11bb2ac2c12369cc727592642a9e114c83caf9683bf8543c90c59b49d67e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPEmbedModelSelect.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamFLUXVAEModelSelect.tsx:12 \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":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPEmbedModelSelect.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"2393ecbc728cd9c85110d538219682bb59d78f5084aee7aab968829984ebef28"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxLockAspectRatioButton.tsx:13 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsLockAspectRatioButton.tsx:12 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxLockAspectRatioButton.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"57f16980944521a9bc15a0c5df8580162f48a282022524ca1b3a9a00c90f2e8b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (22 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.tsx:534 \u00B7 invokeai/frontend/webv2/src/features/nodes/ui/manager/DetailPane.tsx:38 \u2014 the two spans are one implementation copied and then locally edited \u2014 202 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":"invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.tsx"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bf35e61b44e2ac4ad43dd4b419adc0c10bef60f38cc1ed3f5a8bf544edde952"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/data/queryCache.ts:371 \u00B7 invokeai/frontend/webv2/src/features/gallery/data/queryCache.ts:401 \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":"invokeai/frontend/webv2/src/features/gallery/data/queryCache.ts"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"388da70b681c8e2e84ef502ed93a9812fb19b6ec252eb7b3891868552091e80a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/ui/ModelManagerView.tsx:19 \u00B7 invokeai/frontend/webv2/src/features/nodes/ui/NodeManagerView.tsx:19 \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":"invokeai/frontend/webv2/src/features/models/ui/ModelManagerView.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"01dfea86cc07d893abd1c4641331a486e08e823a191d4a7d6c6828a12a6538a2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (22 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/core/layerWorkflow.ts:114 \u00B7 invokeai/frontend/webv2/src/features/workflow/core/layerWorkflow.ts:154 \u2014 the two spans are one implementation copied and then locally edited \u2014 118 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":"invokeai/frontend/webv2/src/features/workflow/core/layerWorkflow.ts"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ba1cd3a5dc252806543abe435747963f833d4e0112c2eb78bc952b872e2ab24"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2 locations): invokeai/frontend/webv2/src/platform/ui/HsvBoxPicker.tsx:122 \u00B7 invokeai/frontend/webv2/src/platform/ui/HsvWheelPicker.tsx:165 \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":"invokeai/frontend/webv2/src/platform/ui/HsvBoxPicker.tsx"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"326456cd90a86cdadb646e8ee8b5541d8c9c63385b1b2e669d462a62acca7862"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/launchpad/HelpMenu.tsx:73 \u00B7 invokeai/frontend/webv2/src/workbench/shell/topbar/AppMenu.tsx:65 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/launchpad/HelpMenu.tsx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"a394a68f9de1e21f59609730f026d6c45848e9b799ab9dd3866d54c994868bc4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/launchpad/projects/ProjectCard.tsx:29 \u00B7 invokeai/frontend/webv2/src/workbench/launchpad/projects/ProjectRow.tsx:23 \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":"invokeai/frontend/webv2/src/workbench/launchpad/projects/ProjectCard.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"911e756dfa94204429786396f1b101e65b7cc06658a3ad63bf47976415e90f14"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/queue-integration/queueRecallCache.ts:299 \u00B7 invokeai/frontend/webv2/src/workbench/queue-integration/queueRunJournal.ts:531 \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":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRecallCache.ts"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e4319583da19392d4e779a6f4c3b51d9604ce2f80e0b83d36a2549e9a350fc9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 5 locations): invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:545 \u00B7 invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:569 \u00B7 invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:593 \u00B7 invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:616 \u00B7 \u002B1 more site(s) not listed \u2014 all 5 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":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0d821232a5cf2fd9fdd32ee5619b7330912d7ffb448146e33668557d970bb78"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/util/promptAST.ts:420 \u00B7 invokeai/frontend/webv1/src/common/util/promptAST.ts:541 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/util/promptAST.ts"},"region":{"startLine":420}}}],"partialFingerprints":{"codehealthFindingId/v1":"f77e2b960618c8aa421e5e75c7e7afc64f45049821bbaf2c0651439891aa5ef3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAddEntityButtons.tsx:29 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAddEntityButtons.tsx:68 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAddEntityButtons.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"02b1e2f8488dc2e735e8d502a0917a401564ab178bbdce3af1e452843f57fe0a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterColorMap.tsx:2 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterContentShuffle.tsx:3 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterMLSDDetection.tsx:3 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterMediaPipeFaceDetection.tsx:3 \u2014 the 4 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. There is one copy in each of 4 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterColorMap.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"100f3b83caf3f522ab774aa83801443fd7e9a179b4613d0cdceb14bf41e26b2f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskDenoiseLimitSlider.tsx:49 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskNoiseSlider.tsx:46 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskDenoiseLimitSlider.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"875caa7a808e7a62bf73bf4a66357642be27d0412d043649bbb25dc638d8763a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarRedoButton.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarUndoButton.tsx:10 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarRedoButton.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"e472ce35ca0551838931027f8b9d6edef11524547fa67ee465288917d4ed8ffc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts:466 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts:511 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2fb23573cb6b98d252bfc65052a504a73468788f61417685da4fa235d463214"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts:53 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts:42 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts:53 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"153a297030d68231761776da1bafe9c1d0707261175018afdc2571dc2e6e0495"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (21 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemDeleteIconButton.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemOpenInViewerIconButton.tsx:11 \u2014 the two spans are one implementation copied and then locally edited \u2014 109 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":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemDeleteIconButton.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4d5cbb835f3a129053ca68f336e4b74d1dc7d780ace2df2b39c21af3d215cb2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:995 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1123 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":995}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f43de22022cfdcc97deab44937f42df31db026e59da4440eb1e99e592f8d06c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceForm.tsx:42 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderForm.tsx:36 \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceForm.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"7afb5fa80386720ce3a8e831249be2d0b88b5dbdff8c78904fcdc64fff3b6234"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultHeight.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultWidth.tsx:12 \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultHeight.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"03cd0f81abf61644d287dd2c824343d0ac1a4b0ac9ae4ac4aab99c70f248ecdc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorFieldComponent.tsx:27 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorFieldComponent.tsx:20 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorFieldComponent.tsx:30 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringGeneratorFieldComponent.tsx:24 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorFieldComponent.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"61ff9668d296b5381764c0cd1352204b48d3718bf08d8a19590c28d18e9573fe"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElementViewMode.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/TextElementViewMode.tsx:8 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElementViewMode.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef5c340ff61a2f166850284f22d59137d161abae8fb36874465083371d03f29a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXRedux.ts:19 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addIPAdapters.ts:18 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXRedux.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"d32433bdc80164df55dd47ec78f97e93d873bc066162de10518be799ef76bc89"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts:28 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts:39 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4f9df9209656fc10ffcf3e5657af3ad8705d69a9a4684ae0e99d30f506d5236"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts:304 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts:325 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c1df51a8920737f2ef5bb3ef2ab51d8e905911d654bb3b0b4170cd92ad83029"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSettings.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Dimensions/Dimensions.tsx:13 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSettings.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"faf143938d085e3305c17c2d047eeb19bc68dda4f9808e1b90fe1b70819b95a3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 9 locations): invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMode.tsx:22 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamAnimaScheduler.tsx:23 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImageScheduler.tsx:19 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypePreset.tsx:22 \u00B7 \u002B5 more site(s) not listed \u2014 the 9 copies are spread across 9 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":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMode.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e191f2d26f23e2c0a79f7f6f0cc3a3b0428ad6cd381d994b903fca9e52a30ea"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:137 \u00B7 invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueUpscaling.ts:44 \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":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"91eae1a4a498f7b398daa1141169866f291d66a50805e3524d4155b2026318b5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/mock-backend-fixtures.mjs:282 \u00B7 invokeai/frontend/webv2/scripts/mock-backend.mjs:753 \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":"invokeai/frontend/webv2/scripts/mock-backend-fixtures.mjs"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"749edf14c01d1bbbdf6c1e347970466931a80727998f3296cb33eca2e7dd0b78"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:386 \u00B7 invokeai/frontend/webv2/src/features/upscale/core/graph.ts:304 \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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"afb6a7b12a8697fa532ba6fe4db4fa5483b743336df3e9389ebe36d189e7396e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/graphCoverage.testing.ts:123 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graphCoverage.testing.ts:183 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/graphCoverage.testing.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd5c7b4dd1195debac2ce4611ff0dbe2f73870062c8ebd83345abf6859148e76"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/data/externalProvidersStore.ts:21 \u00B7 invokeai/frontend/webv2/src/features/models/data/startersStore.ts:17 \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":"invokeai/frontend/webv2/src/features/models/data/externalProvidersStore.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"a45ee00bf297445c7fab714c1d541fc83a35d01779f2bd3133a51d182cfe5f17"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/render/raster.ts:62 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/render/raster.ts:104 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/raster.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"80b915a6646e7dd7b94236f47cb52394176a059c1cf90b8f8fb39a7536d13d41"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-operations/contracts.ts:293 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/selectObjectSession.ts:65 \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":"invokeai/frontend/webv2/src/workbench/canvas-operations/contracts.ts"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"91d25495af6fcb1565ab8ce5cc6d1604b659063aaa8f534ebbd7112844baa99e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/palette/CommandPaletteRows.tsx:104 \u00B7 invokeai/frontend/webv2/src/workbench/palette/CommandPaletteRows.tsx:134 \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":"invokeai/frontend/webv2/src/workbench/palette/CommandPaletteRows.tsx"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"df12ec0ed292df1e4e9938ba2548859d4b9d036801f56b357cf470c07e145f72"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasGlobalContextMenu.tsx:19 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/StagingItemContextMenu.tsx:61 \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasGlobalContextMenu.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a45aa644221188b5801db06fee668b532b7da283eb45cca4566c8e44734c013"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (21 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapWidgetView.tsx:220 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapWidgetView.tsx:266 \u2014 the two spans are one implementation copied and then locally edited \u2014 68 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":"invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapWidgetView.tsx"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9321251b2184e8e786aa12ac3f627e71f0d02219efa3ef71df2823170e9a1de"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx:1309 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx:1332 \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx"},"region":{"startLine":1309}}}],"partialFingerprints":{"codehealthFindingId/v1":"df5d4d3d659eccbdf043df07e7ccbbc9a49162607e094610470cac513bfcb27b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/hooks/useCopyImageToClipboard.ts:14 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx:279 \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":"invokeai/frontend/webv1/src/common/hooks/useCopyImageToClipboard.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1204e6a1d2d9fe5a9d2c0b165b238557df97444701a5679b72d2bfcdc0bdb06"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterAdjustImage.tsx:72 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterBlur.tsx:49 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterColorMap.tsx:23 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterNoise.tsx:64 \u00B7 \u002B1 more site(s) not listed \u2014 the 4 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterAdjustImage.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"39f7c97d7a1cdd1ec6eed90a7790554c243bf13b1b109f67dce9e37e3a4c0fe5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts:230 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts:254 \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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d52294d4d7e83e43f71b51012ef1d85cc3c6d0cac88d6d0b5b06420f27f1f9f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectGradient.ts:136 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectRect.ts:65 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectGradient.ts"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"7862961a3df94bd5418863ca4adacc1f6d4eb8cd4d70476bc763df15764e94e9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1267 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1287 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1267}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1ec2db41f8daa5d4fb8bb0b31fed6d858e030b0bbf00511b4c6ebbee705ae34"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts:62 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts:98 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"d680594ced05e1b97b835ebf891f2521dac7ef1e56b3dd969a69c769ffd3e9af"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/modelManagerV2/store/modelManagerV2Slice.ts:98 \u00B7 invokeai/frontend/webv1/src/features/nodes/store/workflowSettingsSlice.ts:111 \u00B7 invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts:93 \u00B7 invokeai/frontend/webv1/src/features/system/store/systemSlice.ts:96 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/modelManagerV2/store/modelManagerV2Slice.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"703683fa1d4fbe1718e206c63ac7accbc418d99246662b42fe586417ca7bec4f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/DefaultWeight.tsx:27 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultHeight.tsx: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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/DefaultWeight.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9f98d4543134ab7b4b151261c559da09fe7392c5c17431b912a9c09cbcd4e37"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/modelSettingsIO.ts:79 \u00B7 invokeai/frontend/webv2/src/features/models/ui/detail/ModelSettingsMenuItems.tsx:167 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/modelSettingsIO.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"375a00993b8c4fe1549e8c7dd7102c05169ba5977641ee88d09d96e0c2867696"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 8 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorArithmeticSequenceSettings.tsx:1 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorLinearDistributionSettings.tsx:1 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorUniformRandomDistributionSettings.tsx:2 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorArithmeticSequenceSettings.tsx:1 \u00B7 \u002B4 more site(s) not listed \u2014 the 8 copies are spread across 8 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorArithmeticSequenceSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dda423578a73de2e743ae337fa17bfb03a4390207284c11b6cbe2fb4fe5cc3af"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts:133 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts:244 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f84485c664505b4729f608e2614f10d201e12da36e12f73e97308e511d53e14"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts:57 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts:143 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"da7d3e3aca9cf4a9c3b00d89c131b13918893602329d61789696f4fb7dfe7dd2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts:204 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts:170 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts:319 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"6717afe0341ecfb22dffb841c0ea1d8949937da41c59688d6a780b42de7cc0cc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/workflowImageExport.ts:148 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/editor/workflowImageExport.ts:209 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/workflowImageExport.ts"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"430c6e9231e68f02bd779619b5517c9abf91f5833fa1d6f5c3801e51f6e0de70"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceEnabled.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceEnabled.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Seamless/ParamSeamlessXAxis.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Seamless/ParamSeamlessYAxis.tsx:9 \u00B7 \u002B2 more site(s) not listed \u2014 the 6 copies are spread across 4 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 6 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceEnabled.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee040264a9bfa9ad5e98536d56ba3c809d67c3db2c6908c7e6a4d3b8a095c7dd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/queue/components/CancelAllExceptCurrentQueueItemConfirmationAlertDialog.tsx:24 \u00B7 invokeai/frontend/webv1/src/features/queue/components/ClearQueueConfirmationAlertDialog.tsx:24 \u00B7 invokeai/frontend/webv1/src/features/queue/components/DeleteAllExceptCurrentQueueItemConfirmationAlertDialog.tsx:24 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/CancelAllExceptCurrentQueueItemConfirmationAlertDialog.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"011f3ee49d201af3f7021917b7d7526e19ecd9d624e7cb92c4d44774dfe442c9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/store/readiness.ts:155 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:178 \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":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"3650ded397ed7e848c5a113d9168042e9975bf29384d5850dba9560e670be20c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/queue/store/readiness.ts:871 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:959 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1138 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":871}}}],"partialFingerprints":{"codehealthFindingId/v1":"27037b05f0ff3bb80f11c62108c90f92d84be6104309ea8da146fd6ddc22bfe5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/upscale/core/graph.ts:664 \u00B7 invokeai/frontend/webv2/src/features/upscale/core/graph.ts:745 \u00B7 invokeai/frontend/webv2/src/features/upscale/core/graph.ts:825 \u2014 all 3 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":"invokeai/frontend/webv2/src/features/upscale/core/graph.ts"},"region":{"startLine":664}}}],"partialFingerprints":{"codehealthFindingId/v1":"9339f699d823663a4ce0cb623a718f38be1481741e60f491e40ffecfb38d2244"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx:905 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx:1068 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":905}}}],"partialFingerprints":{"codehealthFindingId/v1":"81192705e232d3ce98166d553afe60032c32031c4b75f227038da8a3aa7eee16"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/components/ProjectFileOptionsDialog.tsx:113 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/MissingFontsDialog.tsx:118 \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":"invokeai/frontend/webv2/src/workbench/projects/components/ProjectFileOptionsDialog.tsx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"df7bbc12e26990a9848eda3d116c562aa23e75c3f8e7d9f93a4d0712b99b9fa8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:403 \u00B7 invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:855 \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":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"8115c766806e312905798f1643679c8fb943ce372b9be226bb7756db0211e01e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerSettingsEmptyState.tsx:23 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageStateWithCanvasOptions.tsx:32 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerSettingsEmptyState.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf8fbffb8b894a4d7eb3194da2efd7b9b07e2d0aa5f3a1ffe5ee8eccb0eb66e0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx:91 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectActionButtons.tsx:29 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ba14e564f9618924be6bf88f7964a3bb48d33c26bdbdc3b150f2e7f03f436e4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterHEDEdgeDetection.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterLineartEdgeDetection.tsx:11 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterHEDEdgeDetection.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"77be7db8fb7f3c3b3d36ddef0e0851aff9055ae88ac9d75c4cb98ab7c6b0326e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts:385 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:1271 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts"},"region":{"startLine":385}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2aba42bf101f37dfeb062d305807db77ec81285c6e9b86ebf5d4a87d1d119e7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts:610 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts:643 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts"},"region":{"startLine":610}}}],"partialFingerprints":{"codehealthFindingId/v1":"84db9def851a34e2960c6fefe0b20bb8ae88ea088ea4c1749d3d58d85c6edd34"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 7 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectBrushLine.ts:76 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectBrushLineWithPressure.ts:269 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectEraserLine.ts:70 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectEraserLineWithPressure.ts:75 \u00B7 \u002B3 more site(s) not listed \u2014 the 7 copies are spread across 7 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectBrushLine.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"f98f577c5b0f260d9bce1ae0ca4c7d7a6c22685d408c7d180002f135bf364551"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AutoSwitchCheckbox.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowArchivedBoardsCheckbox.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/UsePagedGalleryViewCheckbox.tsx:9 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AutoSwitchCheckbox.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"64c7256f1319c13e054e7cdd8adf58cfc24f5589de70ce64cd71dedd079548a4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/imageActions/actions.ts:105 \u00B7 invokeai/frontend/webv1/src/features/imageActions/actions.ts:187 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"279da5076f7ffb9390d0fa8279d2be6997ef88b85c718ec7cf7312d87e8bee4d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/BulkDeleteModelsModal.tsx:44 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/BulkReidentifyModelsModal.tsx:50 \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/BulkDeleteModelsModal.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac145cd5dace50724a5e4c1f578e00c9e3d014292732f548f4529ed76659bad4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/BaseModelSelect.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelFormatSelect.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelTypeSelect.tsx:11 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/BaseModelSelect.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0d3b8d42efed9f8fa9a625a433a8547fc89b765811edae32e1c538538670eea"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/BooleanFieldInputComponent.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/EnumFieldInputComponent.tsx:12 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/BooleanFieldInputComponent.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad0532df7ce48814e62512e07ea472535b00a447ec02e9e66a143ddffb898474"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/AutoLayoutPopover.tsx:153 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/AutoLayoutPopover.tsx:172 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/AutoLayoutPopover.tsx"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c667d1df61f5815082e31e1aa7dbf762af6a9fe832f9c9e132777a2ed6bc562"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementFloatSettings.tsx:178 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementIntegerSettings.tsx:181 \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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementFloatSettings.tsx"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"794c1f3cdf03581f16ec648be765727ae2f8a7f3bf29dc19a83b56c856ccc069"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorDetailsTab.tsx:17 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorOutputsTab.tsx:17 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorTemplateTab.tsx:11 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorDetailsTab.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9f92ea0d1a4051a3b9b96d015e7c316da42b62757d00d1c20a23a06f7e6b356"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorOutputsTab.tsx:17 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorTemplateTab.tsx:11 \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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorOutputsTab.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"59b7da26592ce3d782933bc52f9d09e0395762bc3eb4a5463bda890f5adeeff0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts:160 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts:155 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e07c6203e54c50f9359cda14f0c59a141f22353cd2de3c2a2b7563a94a6d96c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts:97 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts:110 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e892e976e39e4f5cdc095601d4e8d1e09177ec874ef8ca5c1818499f079483b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts:209 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts:229 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4c886943314da2f1b1c899be6fd0d061c612a0fa642a3407db82db0e8f2ab34"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 16 locations): invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx:57 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx:101 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx:42 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx:83 \u00B7 \u002B12 more site(s) not listed \u2014 the 16 copies are spread across 6 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":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d57c2574f6b6ae649dfdba6b35b18dbba682e17fa839dcb4e1c16c0378a3731"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/ui/components/tabs/ResizeHandle.tsx:50 \u00B7 invokeai/frontend/webv1/src/features/ui/components/tabs/ResizeHandle.tsx:83 \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":"invokeai/frontend/webv1/src/features/ui/components/tabs/ResizeHandle.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"73b17d45541e19d8e61a5b59b95d792a3860f906cff7ea449d61319abb857b8d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (19 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/app/GenerationUiAdapter.tsx:159 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/useCanvasEngine.ts:49 \u2014 the two spans are one implementation copied and then locally edited \u2014 60 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":"invokeai/frontend/webv2/src/app/GenerationUiAdapter.tsx"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"f519cffc018388788b2c03355b7682318e523b6aa6cda15324452c1d932cd43c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/ui/detail/UpdatePathDialog.tsx:60 \u00B7 invokeai/frontend/webv2/src/features/models/ui/library/OrphanedModelsDialog.tsx:120 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/detail/UpdatePathDialog.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"504e996c1a85be476ff9152bfed1e62844947a10159dbdbd0802e17436192140"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/fields/RecordPickerInput.tsx:109 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/fields/RecordPickerInput.tsx:129 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/RecordPickerInput.tsx"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"2211bdb63c767ee94e97d63f749ba6304f0e2cc0d7e53da35175287897b8d944"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/library/relativeTime.ts:16 \u00B7 invokeai/frontend/webv2/src/workbench/launchpad/formatRelativeTime.ts:19 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/relativeTime.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6e6954fef358bcb6df2eff7de29107f03f0fc6545606e4a3ee7a82630ec13cb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (19 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/platform/ui/colorPickerStore.ts:35 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/filterPreferences.ts:6 \u2014 the two spans are one implementation copied and then locally edited \u2014 65 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":"invokeai/frontend/webv2/src/platform/ui/colorPickerStore.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"6184a36471cda30fe3bbe52540a6786c0061d74836f3489e6e878e6f71b75cb6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (18 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx:244 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelIdentifierFieldInputComponent.tsx:40 \u2014 the two spans are one implementation copied and then locally edited \u2014 101 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc0fe0543cd62a9b3f7838f1cfacecf9827bfa0e95f72d297208c43e0c4db80b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerEntityList.tsx:18 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskList.tsx:18 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerEntityList.tsx:17 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceEntityList.tsx:17 \u2014 the 4 copies are spread across 4 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 4 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerEntityList.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b08bb68fe46c0bbe25014f995518fc271bb44982b9426f6567ed872fc88c129"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettings.tsx:125 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettingsEmptyState.tsx:60 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettings.tsx"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"12afdb49c79ca95a85b08c7641a9f5942d609c9fe9243f7d943ae379311b334c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/state.ts:296 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/state.ts:316 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/state.ts"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"f32b72bfdc043218e9994c25fda38973769aaf71de301b0dd4b78966b5d309ce"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectEraserLine.ts:14 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectLasso.ts:14 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectOval.ts:15 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectEraserLine.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7870f34f9d2551edfb0f38ec03653b8ee93c7530b56d47d538e84b2efa30ad4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectGradient.ts:19 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectRect.ts:16 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectGradient.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a131329c747192e113768f13ef39b130b1b8b4d8b3df6f15a273a2b789f6719"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:427 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:770 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1079 \u2014 all 3 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":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"d004fda2b21c96600ad585dd20cb962e7e0dda8c04960c1431d30376d9dde32c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasWorkflowIntegrationSlice.ts:90 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/store/modelManagerV2Slice.ts:100 \u00B7 invokeai/frontend/webv1/src/features/nodes/store/workflowSettingsSlice.ts:113 \u00B7 invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts:95 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 5 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":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasWorkflowIntegrationSlice.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b1c0330ee4add99475231a6bcc7de5026897f20be56e0d4a5f330c406cabf3a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:633 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:651 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":633}}}],"partialFingerprints":{"codehealthFindingId/v1":"6970a3dae297868934492bd5e652739313d81020fc957cf7396f8cf169cca19e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/NextPrevItemButtons.tsx:34 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/NextPrevItemButtons.tsx:57 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/NextPrevItemButtons.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd998c2858ee4df938aef00ed4b5203d93f76df1dd164de694b45c652482f434"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelImageUpload.tsx:115 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowThumbnail/WorkflowThumbnailField.tsx:86 \u00B7 invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetForm/StylePresetImageField.tsx:47 \u2014 the 3 copies are spread across 3 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelImageUpload.tsx"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"144009b02d58ad385ed44cf72db760c9d657b47988d3c1b2ab81b42255e609f5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/field.ts:1217 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:1255 \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":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":1217}}}],"partialFingerprints":{"codehealthFindingId/v1":"dadcaa27de9fbfb3e1b7474466f5b40b805e2a7e8a3304ceb598323362625569"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx:51 \u00B7 invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx:78 \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":"invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"32421d30b7d568f6eaa1fbfaaf304b85ede26604c5b58a6f8dc5f7a2287e7fdc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:83 \u00B7 invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx:29 \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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"4807b19d75da0561863dcde8bbcc3c6bdf9bf68eb85b4431c8bd11220c0cf44e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx:29 \u00B7 invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx:28 \u00B7 invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx:21 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"53ab69d835dfc1183e2cbdf0aacf7291fdc28e938f8e47441f53b8e7fb64b13c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/models.ts:285 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/models.ts:303 \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":"invokeai/frontend/webv1/src/services/api/endpoints/models.ts"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a559445757dadfa35ce0d3e6669a64f22bd97e9a797587fd6831fce62fe30f5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs:111 \u00B7 invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:18 \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":"invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"7573b55bcb0f7b16da403e6b5be8465c3cb3412985f7c93b9d2a68d12b8e7299"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts:480 \u00B7 invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts:549 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts"},"region":{"startLine":480}}}],"partialFingerprints":{"codehealthFindingId/v1":"24ea290f9a097dcc85bba65ff543181e9f4e629bcee49b2d7b34464985d68d42"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/ui/shared/ModelFilterMenu.tsx:236 \u00B7 invokeai/frontend/webv2/src/features/models/ui/shared/ModelFilterMenu.tsx:274 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/shared/ModelFilterMenu.tsx"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2dac6b9b0d73d4dae08b732e5881efd8ce01cc74ab7a0ce41b975434b64cc24"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryCard.tsx:155 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryThumbnail.tsx:236 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryCard.tsx"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8722e9230b4d86b7afa7a7601192a01b68c7c40ae7338cd49482be2cc11471c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts:1229 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts:1280 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts"},"region":{"startLine":1229}}}],"partialFingerprints":{"codehealthFindingId/v1":"262ea538bbfe29d6ea758c0a0a7ecb1bc6353b9dbd37566cba64c3e9ea8db681"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterComposite.ts:151 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/generationCompositePlan.ts:47 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterComposite.ts"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"c968f44c63e9a67fe9fec3363dadb2814c50f47e03af2c4b56e3e957547e74eb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/api.ts:239 \u00B7 invokeai/frontend/webv2/src/workbench/projects/api.ts:267 \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":"invokeai/frontend/webv2/src/workbench/projects/api.ts"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"106965a79f8e6d7904e6f11332422b8238d465c7fb01681a7b06600da72eebb9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:675 \u00B7 invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:699 \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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":675}}}],"partialFingerprints":{"codehealthFindingId/v1":"24488ffa0feaede52c21b914c29a3d37534860ba204c8c9c003dbfee76707ef1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:655 \u00B7 invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:679 \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":"invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts"},"region":{"startLine":655}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f1b00018e032c9c6198c79b4e9aa39d87e558ee92095d67e0c87121941212a5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widget-frame/WidgetRenderer.tsx:97 \u00B7 invokeai/frontend/webv2/src/workbench/widget-frame/WidgetRenderer.tsx:201 \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":"invokeai/frontend/webv2/src/workbench/widget-frame/WidgetRenderer.tsx"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e86eeac36802ca652eaa13b3f19b292809dd34e6d721cd3933d12a5b7b70013"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/ShapeOptions.tsx:34 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/TextOptions.tsx:216 \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/ShapeOptions.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b63b0d9f203045f41da2eccb06dcd89b3d9d7919efc0e5534cf9b20ad2a60eb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (17 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFill.tsx:61 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolFillColorPicker.tsx:126 \u2014 the two spans are one implementation copied and then locally edited \u2014 62 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFill.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"44d5b7a44baa17a697a65fff3d1d5d81ac7b42cf1144bd6f586651f6c81a25f6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterModel.tsx:57 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalReferenceImageModel.tsx:53 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterModel.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"31e03043c11fe06004824b3f31b430f248101bb5515690bbcff1ff2c810c7bac"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx:235 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObject.tsx: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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbe7590a56ca12fbc9821ddc51c779a1004aaad24f63edfd3829452c8c56b700"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterDWOpenposeDetection.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterPiDiNetEdgeDetection.tsx:11 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterDWOpenposeDetection.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"adfcf3e96402b3345cecd5b183917714f0ebeb731f83d4e587d6bb93743668bf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskDeleteModifierButton.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceDeletePromptButton.tsx:11 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskDeleteModifierButton.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d7bb52e2cabc904b2034f2d7cb311507a224c2f00e94cd1a7c3cb7bdb6666e5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (17 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerAdjustmentsPanel.tsx:21 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsEditor.tsx:68 \u2014 the two spans are one implementation copied and then locally edited \u2014 95 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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerAdjustmentsPanel.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2a8e4c497b2e8180d4c848dccd8c13e615ab1ed9cd0fa78b00afa6c7ff00777"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx:77 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx:53 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5fa6df69e858c977dbf7bd225ddac1adfbd9de1a6e9d9552fed76c65005431c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx:193 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettings.tsx:166 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4e1c2f0c732f983a759cef743da92b07937c9fac2be8ef41812bc7f29e96866"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 7 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsBboxOverlaySwitch.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsDynamicGridSwitch.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedLayerPreviewSwitch.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedStagingPreviewSwitch.tsx:10 \u00B7 \u002B3 more site(s) not listed \u2014 the 7 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. There is one copy in each of 7 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsBboxOverlaySwitch.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f0603feeedee43116bdcba9698debd588fcfb8a98a4a10d367a57e49678db93"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolBrushButton.tsx:3 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolEraserButton.tsx:3 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolLassoButton.tsx:3 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolMoveButton.tsx:3 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 5 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolBrushButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"db52892b32f0f6911fc73e48fbdd184306802f354515f9420518bc4d964b9cc3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityPreviewImage.tsx:103 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityPreviewImage.tsx:158 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityPreviewImage.tsx"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"21d970a68fc4b0e2c5ed3cea37bc01fd7c413e16c468389ee4af2fb4719b1c2a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/controlLayers/contexts/EntityAdapterContext.tsx:21 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/contexts/EntityAdapterContext.tsx:41 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/contexts/EntityAdapterContext.tsx:61 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/contexts/EntityAdapterContext.tsx:81 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/contexts/EntityAdapterContext.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"c32d4c3c208edd4cdbd6162ad13023049639ec9bd5645bb5d3a2589d94d8de99"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts:381 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts:421 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:1314 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts"},"region":{"startLine":381}}}],"partialFingerprints":{"codehealthFindingId/v1":"80b74ee82962c0d5eb842557c23400f266cb3e0f09d4d51411d427e335aa3904"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:228 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:757 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"45e50298371c5d665d989c1d648403ad5ab08e8495a12cff40bf21b2eead8d8b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1322 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:674 \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":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1322}}}],"partialFingerprints":{"codehealthFindingId/v1":"7122725bdb141b8ce54fbfd3c8ca2751b079900cb4d58684a50fc7f0d6e28ef4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasWorkflowIntegrationSlice.ts:91 \u00B7 invokeai/frontend/webv1/src/features/dynamicPrompts/store/dynamicPromptsSlice.ts:64 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/store/modelManagerV2Slice.ts:101 \u00B7 invokeai/frontend/webv1/src/features/nodes/store/workflowSettingsSlice.ts:114 \u00B7 \u002B2 more site(s) not listed \u2014 the 6 copies are spread across 6 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":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasWorkflowIntegrationSlice.ts"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b7ad2d46f769597d7cffeec242722f05aed4b8183ac6c57a346cf9666256d8e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AlwaysShowImageSizeCheckbox.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AutoAssignBoardCheckbox.tsx:9 \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":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AlwaysShowImageSizeCheckbox.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"33be1a4b1f4494ee88737ee413d23188254cd27ac1c63653711eb9820dc19ea2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:504 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:529 \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":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":504}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ae087d2eea310eff428edf7459bfdcb912ed156ebe8e397cc404ced150a82e6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1682 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:2085 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1682}}}],"partialFingerprints":{"codehealthFindingId/v1":"efd56495eeaacf45f33d57092328423ed909fea1ad423ee935fd2d2cde23bb88"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/BulkDeleteModelsModal.tsx:15 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/BulkReidentifyModelsModal.tsx:15 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/BulkDeleteModelsModal.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bb4fbf34429112cb92287fefc94dc046a5e79fd715bacb23d86690d76591da8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/DefaultPreprocessor.tsx:49 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultScheduler.tsx:36 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVae.tsx:51 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVaePrecision.tsx:38 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/DefaultPreprocessor.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"87d3845c6e1a2232a248c9a3f51a53d9a46734d743e71383beb9943ae2746104"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/edges/InvocationCollapsedEdge.tsx:56 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/edges/InvocationDefaultEdge.tsx:92 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/edges/InvocationCollapsedEdge.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"85dc2479d5abc5b35d3a9d82b4a013237fa187defb03bbd7118983b62adfcad2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx:152 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx:175 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"93d53a3c4ea8019615a4324911f122a549c9b3dd12c421dab5eb2e1e6476af3b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElementEditMode.tsx:27 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/TextElementEditMode.tsx:27 \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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElementEditMode.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"35569d22861327e8374225286edb52e48ce6e4c1cdb9a0f60d2f6a0ca29cf06d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowSearch.tsx:56 \u00B7 invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetSearch.tsx:45 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowSearch.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"886ace28153fda2a39b2240ee1a178db924f35c16b4f5860d6626b861be7c92d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts:463 \u00B7 invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts:484 \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":"invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"a285b4a2ea5381362d408122c586af369900bb1dc644f96157a121d3321e0262"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (17 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/store/util/validateConnection.ts:76 \u00B7 invokeai/frontend/webv1/src/features/nodes/store/util/validateConnection.ts:106 \u2014 the two spans are one implementation copied and then locally edited \u2014 119 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":"invokeai/frontend/webv1/src/features/nodes/store/util/validateConnection.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d41c502f197193d21401d3acd4579eed2ecbd530422e7473c0e67e9b64b1451"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/nodes/types/field.ts:376 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:445 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:480 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:517 \u00B7 \u002B2 more site(s) not listed \u2014 all 6 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":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd295772b0576d96c5aab0f61d1f3680f6ed9d4ee980854d78a8afffed75951f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/workflow.ts:176 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/workflow.ts:197 \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":"invokeai/frontend/webv1/src/features/nodes/types/workflow.ts"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"93e4d6b7063ea706493dc1861b0d2c68fc0cc5835047afc06379401d87c5d8e5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:183 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:287 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:379 \u2014 all 3 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"056e321feb9905bea440008660483d9f16d422338edce80abdb3a30ab8ec2785"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:749 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:767 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":749}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f9a26babac2960f1d1f1d161809f982c8b5b012bc3bce432481c47cfb28a6fa"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx:21 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx:48 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx:75 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5b03bc4716d7e017441ad89c1147f46cbe2a4adc5c0c592d146e2f87a71e8cf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx:28 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx:75 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx:122 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ee16a498c1dffb929e96127ab057f6f2aab2db3de986fdb8e14b0aa5ab6484a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/components/CancelAllExceptCurrentIconButton.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/queue/components/DeleteAllExceptCurrentIconButton.tsx:7 \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":"invokeai/frontend/webv1/src/features/queue/components/CancelAllExceptCurrentIconButton.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ede6e48dd199764b73693a168551c1485ad0cd22a984ff717abe16aaab404f9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/stylePresets/components/DeleteStylePresetDialog.tsx:42 \u00B7 invokeai/frontend/webv1/src/features/systemPrompts/components/DeleteSystemPromptDialog.tsx:34 \u00B7 invokeai/frontend/webv1/src/features/workflowLibrary/components/DeleteLibraryWorkflowConfirmationAlertDialog.tsx:42 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/stylePresets/components/DeleteStylePresetDialog.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"37907933f90da04665d7419932afdd086562ba55b3c1dada414a01c91552405f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.tsx:1952 \u00B7 invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.tsx:2004 \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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.tsx"},"region":{"startLine":1952}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ccab05866c755e3c004c97bc78d3962c398692d8077355da69dab4b8dc61c05"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts:1608 \u00B7 invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts:2260 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts"},"region":{"startLine":1608}}}],"partialFingerprints":{"codehealthFindingId/v1":"1696e5d362e4be48790e84bf509776018e538051c977ca44f5e0fe445345b169"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/ui/CancelQueueItemButton.tsx:35 \u00B7 invokeai/frontend/webv2/src/features/queue/ui/RetryQueueItemButton.tsx:57 \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":"invokeai/frontend/webv2/src/features/queue/ui/CancelQueueItemButton.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"59c717ebec734767858a64bb0ba046c1ba243c3a1c2dede40cd31e996dadcf28"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (17 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/core/buildGraph.ts:403 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/graph-preview/GraphPreviewFlow.tsx:44 \u2014 the two spans are one implementation copied and then locally edited \u2014 161 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":"invokeai/frontend/webv2/src/features/workflow/core/buildGraph.ts"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"494ae2469c104b8b3cc3b2f305be54432b6c50436a85f0a1f9f4c86a6cf13cfe"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv2/src/platform/core/json.ts:8 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/postconditions.ts:32 \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":"invokeai/frontend/webv2/src/platform/core/json.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"b649421e3b92c166884fc48048f7b6f620d3d0411c194f84ea76ce9d45329cfd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/booleanMergeController.ts:180 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts:573 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/booleanMergeController.ts"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b38dffcf7467e5ad711342b32716fad9f0c14ef7f9b0c8f899e71b17d94c17d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts:373 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts:437 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"52531ec8785dc35b38a3cc2683a6acd2cd2465baf189b339befd4bea081db21f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (17 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskLayerController.ts:41 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskLayerController.ts:98 \u2014 the two spans are one implementation copied and then locally edited \u2014 109 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskLayerController.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"845446fed253bd0326d4dc2828d4abccdabc744b382fe2a0afc7a2099f38ca78"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (17 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/renderController.ts:107 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/renderController.ts:134 \u2014 the two spans are one implementation copied and then locally edited \u2014 181 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/renderController.ts"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"38d589e97c9d8234ef8160d68833722e6489de877eceae750f7d96b079ea78ad"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/launchpad/projects/ProjectCard.tsx:111 \u00B7 invokeai/frontend/webv2/src/workbench/launchpad/projects/ProjectRow.tsx:88 \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":"invokeai/frontend/webv2/src/workbench/launchpad/projects/ProjectCard.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"f75eff7a2644f2ac9c3c5eb28c92bbc975f426e69b10eb0aec05f6cd52cbd04a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:1866 \u00B7 invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:2484 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":1866}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9a982901583831e2a654480f8b0d537122cfeb86107cc36064a9c2311b16aa3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widget-frame/WidgetRenderer.tsx:349 \u00B7 invokeai/frontend/webv2/src/workbench/widget-frame/WidgetRenderer.tsx:414 \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":"invokeai/frontend/webv2/src/workbench/widget-frame/WidgetRenderer.tsx"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"98ee97ff57d287770ce0481169cf8edd187cd0999cabf56f26ddcc0027316bd3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasCreateFromBboxSubmenu.tsx:51 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasSaveToGallerySubmenu.tsx:20 \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasCreateFromBboxSubmenu.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2166dc272ed7fb3ba1b4daad8a9dde3a802d128b6eb6fe99788fbda5e5567d4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/GenerateCanvasCompositingSection.tsx:181 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/GenerateCanvasCompositingSection.tsx:200 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/GenerateCanvasCompositingSection.tsx"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"90a58fcf2b7d32eb5fa8d1f533cefe218338961596973f520284257196d01b78"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/GradientOptions.tsx:51 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/ShapeOptions.tsx:40 \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/GradientOptions.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"7361c9d9f94f9b60d714b24f1d3f60bfe7f53932d1a5a9aba7ed2f2a47932734"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/image-map/settingsBindings.tsx:27 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/preview/settingsBindings.tsx:18 \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":"invokeai/frontend/webv2/src/workbench/widgets/image-map/settingsBindings.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbfb2b747c17225bd4eb74cefb84b132df1c3634f6bc4bcc0536d86d9d125cee"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/LayerStackMenu.tsx:26 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayersHeaderActions.tsx:98 \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerStackMenu.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"012883da35fd2304b86bd7a94545aa923401836e3ecf4fa1fb7b46bf0d027447"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 4 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.ts:82 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.ts:101 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.ts:151 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.ts:310 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f4e3cee37578f24686d2bf6e85a019b4420cf56de7b567a8b88dbb6e4219763"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx:166 \u00B7 invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx:198 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e54f844c109e2952569b61d3cb7934726faac5b401bc6b367523c8a7358c2c5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsBboxVisibility.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsTextSessionActive.tsx:7 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsBboxVisibility.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"76997e967ffe60f90c298473fa379ae6189540d89aca2702a5a6c829aa319bda"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx:33 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayer.tsx:29 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidance.tsx:21 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e391151bdff5a537282e932c2a72335a83be5c54a512f5cb3563a2c028ea9d7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskDenoiseLimitSlider.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskNoiseSlider.tsx:8 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceMenuItemsAutoNegative.tsx:8 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskDenoiseLimitSlider.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"eedf196a2e27ef6ce4d6cca60cb6aa47b569b7accfc123854b59b322e26544b1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts:157 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts:134 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"82db874990610ff4b363386c349e239983e54d6594a57e5fb8785ad684f3bb29"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:791 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1101 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":791}}}],"partialFingerprints":{"codehealthFindingId/v1":"236f5f63fe36c0446b319d1333fe604d28fc266fcdb97bccae49cdd3ace2df48"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/dnd/dnd.ts:565 \u00B7 invokeai/frontend/webv1/src/features/dnd/dnd.ts:582 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":565}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5d5c83a8a4675a1b414ea881bb933980c3308f171d1fad9405dfc0a02d1dec3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx:30 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx:48 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx:66 \u2014 all 3 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":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe6e80ed6ea5eb77e578bed3d766e56429e4ebe0f26526eb50c7191f557717ba"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/DataViewer.tsx:138 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataViewer.tsx:116 \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":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/DataViewer.tsx"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"39d9469255a68d44c40764db3a4f262c9621bc2581d88cb616027f7a75bda0a4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 7 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:893 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:919 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:945 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1022 \u00B7 \u002B3 more site(s) not listed \u2014 all 7 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":893}}}],"partialFingerprints":{"codehealthFindingId/v1":"36e5df6a2f67c8f73b277e3afbbdbe1dde98238a61e7fc62eb8e29a17fcfc260"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1192 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1223 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1192}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c648c587c9bb6b74e4e6ce8cb71ad75df4c5f6c339ed83569b76438a594c6e3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/callSavedWorkflowFormUtils.ts:80 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/callSavedWorkflowFormUtils.ts:139 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/callSavedWorkflowFormUtils.ts"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec8d853f5447df978d24aef0c729fe8e78c4b5896a7b00f4b64a1fa7c13dc37d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldEditModeNodes.tsx:34 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldHandle.tsx:75 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/OutputFieldHandle.tsx:75 \u00B7 invokeai/frontend/webv1/src/features/queue/components/common/QueueButton.tsx:38 \u2014 the 4 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 4 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldEditModeNodes.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ba4c89ac67a7ec5f273e3b0de3c4739bcdb04793b4333a2026105df39e18bbd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/InvocationNodeTitle.tsx:72 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/NonInvocationNodeTitle.tsx:54 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/InvocationNodeTitle.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"79d9296cbd60a86aafbc9aa12828e954cb0958c1621636c2597cb81d3ed3accd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElementSettings.tsx:33 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementSettings.tsx:63 \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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElementSettings.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"6599f4ea166903da2255a622a2a23f5d3724879f7197bad3dcf18da9fd39833a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (16 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/WorkflowBuilder.tsx:51 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/ViewModeLeftPanelContent.tsx:18 \u2014 the two spans are one implementation copied and then locally edited \u2014 71 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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/WorkflowBuilder.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0277c9c6b85b083903904a6d714353f5c244acd43f19648a7ef166dfa25563b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/nodes/types/field.ts:352 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:421 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:496 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:628 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5b097e830613a62c368c885ba5d762163671ba5337ae4fc6f723833bb62a6cd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/field.ts:874 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:1031 \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":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":874}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbeb3df62cf38968a48ddbe7e297e3ae1837332cf1adcbab359cb8ed49f2e1fb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/v2/workflow.ts:53 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/workflow.ts:371 \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":"invokeai/frontend/webv1/src/features/nodes/types/v2/workflow.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"450cd0f694070c838054a0ecb9d8a7b9cd7082338eeb62cd8696c64bf086602b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXLoRAs.ts:10 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addQwenImageLoRAs.ts:9 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSDXLLoRAs.ts:12 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXLoRAs.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f090b94a6d269b98fab0123f10268556190474627c27ba3bb6ea71d85978b95"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/workflow/validateWorkflow.ts:161 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/workflow/validateWorkflow.ts:190 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/workflow/validateWorkflow.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bb963677ff5102905c5cb7f7ca9d7010777f7ba6579fdfeca91c429d6d2bb94"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSwapDimensionsButton.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSwapButton.tsx:8 \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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSwapDimensionsButton.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfe254e2d32aafc2baa9b3df56132b08cb5bfad9d36ec8db2ac19a62579e42f6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts:620 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts:660 \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":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":620}}}],"partialFingerprints":{"codehealthFindingId/v1":"24f1cf5bd941167b87f54b366be4eee09034f98489608257629cb9aa2bb8f6b6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/images.ts:941 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/images.ts:962 \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":"invokeai/frontend/webv1/src/services/api/endpoints/images.ts"},"region":{"startLine":941}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5efd9ffcbdf4538f4a3a7033c8031e89a7aa8122fbf63e4d9e9e77b51816c0a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/queue.ts:119 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/queue.ts:135 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/queue.ts"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb831effea3bae767da6bef0a4a151ec38742419b31fb6f8e0b1abc1590b736e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 4 locations): invokeai/frontend/webv2/src/features/fonts/react.tsx:80 \u00B7 invokeai/frontend/webv2/src/features/fonts/runtime.ts:110 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/render/decodedBitmapPool.ts:68 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/render/fontLoader.ts:96 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv2/src/features/fonts/react.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bbec64df57476904bff4ca10701623aac0a85051017d8de24759b5293aac19b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/ui/library/ModelRowContextMenu.tsx:38 \u00B7 invokeai/frontend/webv2/src/features/models/ui/shared/InstallSourceMenu.tsx:94 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/library/ModelRowContextMenu.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdfe102a323c5794947ee8ae3e2c50a5451f4b92cfaa16a679311f3930c05754"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/data/queries.ts:23 \u00B7 invokeai/frontend/webv2/src/features/queue/data/queries.ts:77 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/data/queries.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dbe035d433a4286763fa91b194ea6f26fd2f91fa08988b56e58f20b82bb8f84"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 4 locations): invokeai/frontend/webv2/src/features/upscale/core/graph.ts:565 \u00B7 invokeai/frontend/webv2/src/features/upscale/core/graph.ts:664 \u00B7 invokeai/frontend/webv2/src/features/upscale/core/graph.ts:745 \u00B7 invokeai/frontend/webv2/src/features/upscale/core/graph.ts:825 \u2014 all 4 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":"invokeai/frontend/webv2/src/features/upscale/core/graph.ts"},"region":{"startLine":565}}}],"partialFingerprints":{"codehealthFindingId/v1":"54cca1ab7b0f3fc43c1bda876f1610b00d87474c3f22a584e9e80b59a059bb41"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/editor/NodeContextMenu.tsx:63 \u00B7 invokeai/frontend/webv2/src/workbench/widget-frame/WidgetInstanceContextMenu.tsx:45 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/NodeContextMenu.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"941f5e1a9a2d10a6a33de629906e10440f050f09a89ff43f4ab64ab43fc31a21"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowPublicationHost.tsx:630 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowPublicationHost.tsx:707 \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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowPublicationHost.tsx"},"region":{"startLine":630}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcc50a3b927d896f48ae7d02e922ca382711568bf223335cb351d70a4c0015a8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (16 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskLayerController.ts:103 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/selectObjectBridge.ts:74 \u2014 the two spans are one implementation copied and then locally edited \u2014 75 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskLayerController.ts"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"358457e96ecf8125a2878b36df0232d9c45f1586578116fe4bfdc576c533caa3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (16 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts:361 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts:532 \u2014 the two spans are one implementation copied and then locally edited \u2014 94 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"73b575007666755728c7cf8ca144b8e01fdd688f2cfb53e77c9483594a03296b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/tools/marqueeTool.ts:119 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/moveTool.ts:211 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/marqueeTool.ts"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"665c6e332a6e3f18919cde0a0726a7bfcecf0db93068cccfd2fd3740d8ac7ebb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-operations/contracts.ts:248 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/filterOperationSession.ts:61 \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":"invokeai/frontend/webv2/src/workbench/canvas-operations/contracts.ts"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"07c06926f46133506a808dacbbf7cb221341029e744f7e0ef702823c7dfd700c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts:1072 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts:1114 \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":"invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts"},"region":{"startLine":1072}}}],"partialFingerprints":{"codehealthFindingId/v1":"e48267002f9c56baca28d2d6c0ea3d3fd7e6596c3dae0992a081e8e7601fb026"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:133 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:155 \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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b6f4f5f8926f0401da6e78c3c14281d144f0ea0ca836ede9afc6df8f1731117"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (16 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widget-frame/FloatingWidgetWindow.tsx:514 \u00B7 invokeai/frontend/webv2/src/workbench/widget-frame/FloatingWidgetWindow.tsx:545 \u2014 the two spans are one implementation copied and then locally edited \u2014 110 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":"invokeai/frontend/webv2/src/workbench/widget-frame/FloatingWidgetWindow.tsx"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"76306d2208aefbbb10a373b77f868da1dbfc97872282de4f4b759bc2b3d91aef"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/panes/editorPaneLayout.ts:31 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/panes/editorPaneLayout.ts:70 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/editorPaneLayout.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6ec3b3d544c3df78100e784af0330d7b3322e9f7f5be889cd5e7c441ce87867"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (15 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/app/components/App.tsx:44 \u00B7 invokeai/frontend/webv1/src/features/auth/components/ProtectedRoute.tsx:112 \u2014 the two spans are one implementation copied and then locally edited \u2014 59 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":"invokeai/frontend/webv1/src/app/components/App.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"906e5f9e7631de18ad5f95059b916888411cab9ed778a5928f00aec40136ac8c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 4 locations): invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:133 \u00B7 invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:275 \u00B7 invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:292 \u00B7 invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:430 \u2014 all 4 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":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e12160061da2fa9f7916935137a38d984d7f1b3719ccb8d80a4988e280b5304"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:217 \u00B7 invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:354 \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":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"93b219e9e52c11ab010029b2c605a2e45f5765e5a04f97b3b676823a61302a39"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/components/OverlayScrollbars/ScrollableContent.tsx:26 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsListWrapper.tsx:19 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/components/OverlayScrollbars/ScrollableContent.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"247e5e94d7cc3c0a22a34981940ca097ddd83f38c815a4103159d62c27db2378"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsPreserveMask.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsSaveAllImagesToGallery.tsx:7 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsPreserveMask.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cd1e9b56d40b94128adcf30e2206533d70791616f4e9611980480fea3102888"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx:518 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx:86 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/VideoFieldInputComponent.tsx:95 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":518}}}],"partialFingerprints":{"codehealthFindingId/v1":"39d9bff39b83a257cc0169eaac63a2811fa1e5da8580a22a63864582e0005ee3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx:260 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElement.tsx:82 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dede96f408532ab85fe0765407a5ca29f0ec41a5b47f41f1ef05917ac2b3075"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx:56 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectSaveAsMenu.tsx:16 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"d785807914727e0487c4428053c70cfcf4805383db0e31e513c31d8b7297bfaf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterSpandrel.tsx:108 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/ParamPostProcessingModel.tsx:41 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamSpandrelModel.tsx:44 \u2014 the 3 copies are spread across 3 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterSpandrel.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3db512c81ca7731ed86298d0e95fa686cf720b091dfb16ebf36cd60c853d7a8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (15 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/ParamDenoisingStrength.tsx:26 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx:176 \u2014 the two spans are one implementation copied and then locally edited \u2014 55 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":"invokeai/frontend/webv1/src/features/controlLayers/components/ParamDenoisingStrength.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"99615c4723039ba4a267a71505c45236e02a766a649f3d02411fdbd3e9503133"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsGridSize.tsx:8 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsOutputOnlyMaskedRegionsCheckbox.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsSaveAllImagesToGalleryCheckbox.tsx:10 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsGridSize.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"633ae94bc6da92347dbcbfa6c04f81c4b63671ca2520f598c02f336c1f1123d6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (15 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsInvertScrollCheckbox.tsx:18 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowStarredFirstCheckbox.tsx:13 \u2014 the two spans are one implementation copied and then locally edited \u2014 75 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsInvertScrollCheckbox.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"21c8e60fe6fdbdd4eb1c77a0002d06e1b04a549a042dfc044de80e9b2edd0110"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenuNewLayerFromImage.tsx:29 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenuNewLayerFromImage.tsx:45 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenuNewLayerFromImage.tsx:62 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenuNewLayerFromImage.tsx:79 \u2014 all 4 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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenuNewLayerFromImage.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"d868354ca67cbe8ef05d8d2e0d17c1763744750aceeade519be44f3600ae0be5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx:413 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx:432 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx"},"region":{"startLine":413}}}],"partialFingerprints":{"codehealthFindingId/v1":"b85651980c154cd4b43111614e6537004845522bc753bbeab26110d9df24af0b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx:422 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolWidthPicker.tsx:138 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarScale.tsx:145 \u2014 the 3 copies are spread across 3 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef4af1865621b0a2d4f682461ed183edcb04162a18f0159c3e0ccc12326bbb70"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts:144 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts:160 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1aa90ace24a0327b8310055efa4d7429c9e67ddd2ed8fc6eabb9272cb52d71b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:958 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:974 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":958}}}],"partialFingerprints":{"codehealthFindingId/v1":"c966392961dc10372bea8be1fecb02fc14aa3095f498ab0abeb6499b1d11136e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (15 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/customNodes/CustomNodesInstallPane.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPane.tsx:12 \u2014 the two spans are one implementation copied and then locally edited \u2014 63 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":"invokeai/frontend/webv1/src/features/customNodes/CustomNodesInstallPane.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd480c3596093e62e1bd42ca2ad23cf6b33d1510049795f36e90e2728450c921"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx:52 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GallerySearch.tsx:49 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"40d80e92c321a6aae4870f5e924843d42e6ee02dafc8b6d1d6443668cba6e9aa"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx:56 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx:74 \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":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"4025494abb6f58dbef17104baf9b89a73540ff1ad46bd2ac2b236df622ce06b0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx:212 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx:423 \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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"06d7014eefada888c04e39f8b1688dba938c442364eccb17b825530129ce2468"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/hooks/useRecallCLIPSkip.ts:10 \u00B7 invokeai/frontend/webv1/src/features/gallery/hooks/useRecallSeed.ts:9 \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":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallCLIPSkip.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6ef179f09c0204443ecc4eee7d0da9fc200bffab272fbebd35a1ea47ec321e7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/BaseModelSelect.tsx:16 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelFormatSelect.tsx:16 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelTypeSelect.tsx:16 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelVariantSelect.tsx:13 \u2014 the 4 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. There is one copy in each of 4 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/BaseModelSelect.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cdb41af0f345dc5cc5f771cb0d05f8106bb99ef267e45beaf6fba59587d6938"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElement.tsx:37 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElement.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/TextElement.tsx:9 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElement.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3e275c9d20278b867c29482f6e169b9bcef288c058e67800af8eec66c417693"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowListItem.tsx:228 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowListItem.tsx:245 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowListItem.tsx"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"592ec22e76e6b42d2b92e91b9137fa4be53f426f1c4252a7462ec308d55ea778"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts:135 \u00B7 invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts:162 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb492ff261211886adb1f8aa871835612f43b6b6a7b9ee0891645810ce9b9bdd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:148 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:270 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:362 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c3cac2acd5da1d798cd07054201817494620243040c049ae750e2d311d101a9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:431 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts:258 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts:124 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts:259 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7a070fb7ca2e67b25c5cb39c46a000daca8b865d009cd4002f3289bfb3045f4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts:233 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts:248 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"26bf6c1224f8585cc6d011c1222b3d74eb7bf0d828761dc1701a9cde8e855085"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts:234 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts:297 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"56af1a1ee01dd4a4594b24c7df8a8824ea831cf7a2d28d07e24196764dab4cea"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/schema/buildFieldInputTemplate.ts:221 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/schema/buildFieldInputTemplate.ts:251 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/schema/buildFieldInputTemplate.ts:371 \u2014 all 3 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":"invokeai/frontend/webv1/src/features/nodes/util/schema/buildFieldInputTemplate.ts"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"8467a96acab2a382e4ad17b21791ecd112618d8af05c1e1eafdab94832d4cde3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/schema/parseSchema.ts:62 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/schema/parseSchema.ts:78 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/schema/parseSchema.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbeaca1d1e05069aea03f51c96f1d64b3a49a7eb797718fa5dc81182ea0376f6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 8 locations): invokeai/frontend/webv1/src/features/parameters/components/Core/ParamAnimaScheduler.tsx:18 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImageScheduler.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypePreset.tsx:17 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxScheduler.tsx:15 \u00B7 \u002B4 more site(s) not listed \u2014 the 8 copies are spread across 8 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":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamAnimaScheduler.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"47377c0db8e053fad015bae0ef74769d5a5ac1a6b22bcb7f4892178e28ee5bff"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelImageSizeSelect.tsx:66 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelResolutionSelect.tsx:43 \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":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelImageSizeSelect.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"73314229a24c660677651f5cba4b892d005fcbc2ccc3f1f8cac752232f2c5a8e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/util/pid.ts:11 \u00B7 invokeai/frontend/webv2/src/features/generation/core/pid.ts:27 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/util/pid.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"d07e34849ecf8a82456db507ddb32f0c3e306346d8f5bebf8150324b6ae6f036"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1186 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1232 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":1186}}}],"partialFingerprints":{"codehealthFindingId/v1":"872ab21232e39a15970421459fa4f9fb082b0fcc00c5cea04ce1a0aed54db157"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/ui/layouts/WorkflowsLaunchpadPanel.tsx:28 \u00B7 invokeai/frontend/webv1/src/features/workflowLibrary/components/UploadWorkflowButton.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/UploadWorkflowMenuItem.tsx:9 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/ui/layouts/WorkflowsLaunchpadPanel.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"a21d521a2eae0a331cf5fc2f1d7a26e6176c88ea4fe87a1aa4e170da759eee4a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/images.ts:779 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/videos.ts:172 \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":"invokeai/frontend/webv1/src/services/api/endpoints/images.ts"},"region":{"startLine":779}}}],"partialFingerprints":{"codehealthFindingId/v1":"526cc8417e4c749b9862eab8730026e06b849d6fb75dc38aa82a46990f917c91"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/run-graph.ts:266 \u00B7 invokeai/frontend/webv1/src/services/api/run-graph.ts:291 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/run-graph.ts"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4df48ec15d62f16735296312694245b21dff799e343620a4c7d76530c512880"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/check-architecture-performance.mjs:95 \u00B7 invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs:720 \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":"invokeai/frontend/webv2/scripts/check-architecture-performance.mjs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"3af15d4a34d88ecc5709c4ce17b1cfb9cec5521ecd1f03911ca0f574728ebcea"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/fonts/react.tsx:155 \u00B7 invokeai/frontend/webv2/src/features/fonts/react.tsx:171 \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":"invokeai/frontend/webv2/src/features/fonts/react.tsx"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"d83840dc6cc2936b4d28f57069505bd4f92fd39de31d9354a3706bcab42d6561"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (15 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.tsx:420 \u00B7 invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.tsx:446 \u2014 the two spans are one implementation copied and then locally edited \u2014 59 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":"invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.tsx"},"region":{"startLine":420}}}],"partialFingerprints":{"codehealthFindingId/v1":"d58a766039e97b233a6ef240813f2c342d460ef68c41a85666fd9338e2c7cf42"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/data/backend.ts:408 \u00B7 invokeai/frontend/webv2/src/features/gallery/data/backend.ts:428 \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":"invokeai/frontend/webv2/src/features/gallery/data/backend.ts"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"24969bf0558e87986a4c78c4a56ba0235ee29251aac7a44c8b5962895b78f8e8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (15 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx:496 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx:1151 \u2014 the two spans are one implementation copied and then locally edited \u2014 115 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx"},"region":{"startLine":496}}}],"partialFingerprints":{"codehealthFindingId/v1":"fda764175cf4643dad33c27923df67d56cb1ff1d2ad2fc35941231fe975209e3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts:104 \u00B7 invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts:120 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dcf1e7caa43723a83c05fae9d15f02312cf10e1ffb88072173a115fb858ed91"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/promptFields/NegativePromptField.tsx:65 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptField.tsx:88 \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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/NegativePromptField.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b6e6424b030ff80667005c4a08f9bd39063b721ab6b87ad467fc84063b766b0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/upscale/core/graph.ts:380 \u00B7 invokeai/frontend/webv2/src/features/upscale/core/graph.ts:461 \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":"invokeai/frontend/webv2/src/features/upscale/core/graph.ts"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"e08df046f3480d0aa14b318eae209e2b7ce90c2687c3cc928b11cf5a889bfdb7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 4 locations): invokeai/frontend/webv2/src/features/upscale/core/graph.ts:458 \u00B7 invokeai/frontend/webv2/src/features/upscale/core/graph.ts:562 \u00B7 invokeai/frontend/webv2/src/features/upscale/core/graph.ts:742 \u00B7 invokeai/frontend/webv2/src/features/upscale/core/graph.ts:822 \u2014 all 4 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":"invokeai/frontend/webv2/src/features/upscale/core/graph.ts"},"region":{"startLine":458}}}],"partialFingerprints":{"codehealthFindingId/v1":"c68fa7433d3bc95f16f9831bf3ce6a22272d5577311c9d989b2c7da233e9b779"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx:252 \u00B7 invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx:279 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"74a3350615ba89158f38bcdfbfac2d3d53e16a35a6f14f0cbace177ca83c5486"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/core/validation.ts:239 \u00B7 invokeai/frontend/webv2/src/features/workflow/core/validation.ts:277 \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":"invokeai/frontend/webv2/src/features/workflow/core/validation.ts"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4a07832560960e8e4b53538b7cee645b52c95b74155cd11d05e7f1fe6727070"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/data/libraryBrowseStore.ts:364 \u00B7 invokeai/frontend/webv2/src/features/workflow/data/libraryBrowseStore.ts:385 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/data/libraryBrowseStore.ts"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"94a3190728c15cc20e5d4091ea5f0dafc05ef70c5d8029252633479d15e27b6d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/engineStores.ts:380 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/engineStores.ts:424 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/engineStores.ts"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"630c7430e09cd16aeec5c7dd6863bef40f48aa834710dbd78251c6f2d4009aac"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 5 locations): invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx:689 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasGlobalContextMenu.tsx:25 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/StagingItemContextMenu.tsx:67 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerStackMenu.tsx:28 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 5 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":"invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx"},"region":{"startLine":689}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a0dd202a0f6fe72e7e2af068203179c0ae6cbf72eb9d910759adbd0d0f3b963"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts:1162 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts:1182 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts"},"region":{"startLine":1162}}}],"partialFingerprints":{"codehealthFindingId/v1":"40e6bebe01dc42359f59f1d641938a2ed85e5385fd35e4250541326cc09363d0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/videoRecallRuntime.ts:223 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/videoRecallRuntime.ts:254 \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":"invokeai/frontend/webv2/src/workbench/image-actions/videoRecallRuntime.ts"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"4999540c86a1a2d6d20e99923b9c84ad483f460ecbc402a790bba32bf6860090"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:344 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:396 \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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"64f909aee10ca4dc4991466ff1cc858bf8430d04e72e1933867ee9f39bb2a2c6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/queue-integration/queueRecallCache.ts:224 \u00B7 invokeai/frontend/webv2/src/workbench/queue-integration/queueRunJournal.ts:398 \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":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRecallCache.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4b89b2903c9ac6bf85bab676c10915b114abd93e7f897f3e4df22a9d8289952"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/SamOptions.tsx:231 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/SamOptions.tsx:246 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/SamOptions.tsx"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2df29b15d80edd37ff3fdad655feefaca85dba0709f658b73205974d9963f1f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (15 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/panes/ColorPane.tsx:109 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/panes/SwatchesPane.tsx:35 \u2014 the two spans are one implementation copied and then locally edited \u2014 76 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/ColorPane.tsx"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6039af4598d79d6efc87296539c30be2d49ebac3fe0a0e3e5f972a10c481292"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/preview/useCompareLoupe.ts:420 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewLoupe.ts:378 \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":"invokeai/frontend/webv2/src/workbench/widgets/preview/useCompareLoupe.ts"},"region":{"startLine":420}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d9a1b12310644e0b686426e3deafff0bc2e65d80cd4e6a207c4d8c9debd23a1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewNavigation.ts:842 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewNavigation.ts:878 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewNavigation.ts"},"region":{"startLine":842}}}],"partialFingerprints":{"codehealthFindingId/v1":"21c09d404004cbf66c768f4c6a30678f766e8dc6e01a26a287980a4d2988a7c9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/hooks/useImageUploadButton.tsx:274 \u00B7 invokeai/frontend/webv1/src/common/hooks/useImageUploadButton.tsx:333 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/hooks/useImageUploadButton.tsx"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"260671652fe2558a4ef897260b22f1e834252422cb0ae668fe7b9907cea5dbcb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/util/getDeviceNameLabels.ts:11 \u00B7 invokeai/frontend/webv2/src/features/queue/core/deviceLabels.ts:40 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/util/getDeviceNameLabels.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"dff50131a43cfe14663ef3bbc51c9e525cb491f8c3bc1c580529e900dbe8d0d8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/util/promptAttention.ts:494 \u00B7 invokeai/frontend/webv1/src/common/util/promptAttention.ts:548 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/util/promptAttention.ts"},"region":{"startLine":494}}}],"partialFingerprints":{"codehealthFindingId/v1":"5631c9f05cadef1706ffe498a501211c0c7fe380ec3d70b4ab6d0827b6fd17e7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (14 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityGroupList.tsx:66 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.helpers.ts:32 \u2014 the two spans are one implementation copied and then locally edited \u2014 63 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityGroupList.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"695f5d8241bcc56379ca9bf81deb8e1a45b2f122e904317c7fd1f786f551cfc0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarDuplicateButton.tsx:22 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarSaveToAssetsButton.tsx:30 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarDuplicateButton.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"d738e3226737573c8c6985e2f77064ad83dfc07d9404d445639decff6ebacb33"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx:51 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayer.tsx:45 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"2962369d67601431e59c3ffe7908db60e0772ef5ef1e72712b06ddbd33428ac1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx:338 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx:354 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee4e421e4791de3797b64e5e25d745a314a3bdedb88049e7f4daee12e8a43bb1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (14 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsClipToBboxCheckbox.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowStarredFirstCheckbox.tsx:13 \u2014 the two spans are one implementation copied and then locally edited \u2014 70 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsClipToBboxCheckbox.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"1faa3a83724829211e91fa61442d700672cf875366edda4ba471d338939d9dec"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsPopover.tsx:62 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsPopover.tsx:79 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsPopover.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"97c9bd689c41d6c07fbc138be2c9e3c148796ae6f86b994a0e467b292076443c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolBboxButton.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolBrushButton.tsx:19 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolColorPickerButton.tsx:22 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolEraserButton.tsx:19 \u00B7 \u002B2 more site(s) not listed \u2014 the 6 copies are spread across 6 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolBboxButton.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"8310f426fc7228537acf372a573494631c2cc083721c398b88d54ae69e6124bf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts:243 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts:276 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts:303 \u2014 all 3 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"66a5a1d7765d1d2ae98f23659588fbeec88bca2a0b35cf94c3277cc52c6f256d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/pressure.ts:214 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/pressure.ts:611 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/pressure.ts"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"b52b452b45663a9630362af3acfcc0c90268d4a4605fbd203bbbce20451ae7ec"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 8 locations): invokeai/frontend/webv1/src/features/controlLayers/store/util.ts:295 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/util.ts:310 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/util.ts:325 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/util.ts:340 \u00B7 \u002B4 more site(s) not listed \u2014 all 8 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":"invokeai/frontend/webv1/src/features/controlLayers/store/util.ts"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"e66bd4cc980899a4a0f722ecc66f657f2be83643374dcd4201fb7ca096592c8c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:258 \u00B7 invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:284 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"2241d48c1baddefbdd5694aad61888432cd9481e40e48c20abe4abca7a5eb5a2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/dnd/dnd.ts:658 \u00B7 invokeai/frontend/webv1/src/features/dnd/dnd.ts:675 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":658}}}],"partialFingerprints":{"codehealthFindingId/v1":"febaa8024ea7a195c85dbbc9d2048240d8a417571809b608a95be413766cc76f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemMetadataRecallActionsCanvasGenerateTabs.tsx:30 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemMetadataRecallActionsUpscaleTab.tsx:14 \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":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemMetadataRecallActionsCanvasGenerateTabs.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffb34a86d0953a144270dd8530cc266cc63ad6a8cfd7eef9848d83f68a9223a6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/store/gallerySlice.ts:212 \u00B7 invokeai/frontend/webv1/src/features/nodes/store/workflowSettingsSlice.ts:120 \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":"invokeai/frontend/webv1/src/features/gallery/store/gallerySlice.ts"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd8870813df90db55e85d04d91d3cfd93c266fbd5a411e83767de42f6e584207"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/imageActions/actions.ts:225 \u00B7 invokeai/frontend/webv1/src/features/imageActions/actions.ts:242 \u00B7 invokeai/frontend/webv1/src/features/imageActions/actions.ts:258 \u00B7 invokeai/frontend/webv1/src/features/imageActions/actions.ts:274 \u2014 all 4 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":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2f7d20c7251ac49bba75b3859583254c9b6a66b0c3617c3633f2935c3ba863a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/imageActions/actions.ts:249 \u00B7 invokeai/frontend/webv1/src/features/imageActions/actions.ts:265 \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":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"614da6f43ffd67c89f537a34e6f058b9d884116becc862f205eca497cf16c993"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1590 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1742 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1590}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2450098165de1307695f46bcc44809c1e703129c0c90ab43a3329ec69f936c7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1707 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:2042 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:2110 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1707}}}],"partialFingerprints":{"codehealthFindingId/v1":"97807118160f6f46b73d61964c17d64cb376fedf992a6aa3fffdd30962a34ee8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (14 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterModelsToast.tsx:49 \u00B7 invokeai/frontend/webv1/src/services/events/onModelInstallError.tsx:165 \u2014 the two spans are one implementation copied and then locally edited \u2014 79 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":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterModelsToast.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a8e0e646c7fb9f4ef831c3d12312cf5d4aaf58d24804dd4fa2a3a005c70f115"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceResults.tsx:70 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListNavigation.tsx:39 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceResults.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"1adbcfc9e44e19b2338e6cf326334cfadc12770b4abbf7e7da49da3a007a3cd2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx:132 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx:158 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcf40dbca0139012652a79a8ca245150ab5a10b40516d4121a806f7f93384670"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorArithmeticSequenceSettings.tsx:34 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorLinearDistributionSettings.tsx:34 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorUniformRandomDistributionSettings.tsx:45 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorArithmeticSequenceSettings.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"10e88f71dd7e8a37ed62b028b98820d0a667d71b51201cfcf5efdf375e85e12c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldNamesByStatus.ts:44 \u00B7 invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldNamesByStatus.ts:62 \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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldNamesByStatus.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"014101b7533fc01c81c091e4122af3bc5a8affcb952fda9ae5fbdc9e51170585"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts:1043 \u00B7 invokeai/frontend/webv1/src/features/prompt/store/expandPromptSlice.ts:53 \u00B7 invokeai/frontend/webv1/src/features/stylePresets/store/stylePresetSlice.ts:71 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts"},"region":{"startLine":1043}}}],"partialFingerprints":{"codehealthFindingId/v1":"62923571adf8caf50b68a067c1a9ca44a3479229076ad744bf016f37a82d2e74"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts:85 \u00B7 invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts:118 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f6df4f2c9570cc50b5ccce58e09d5898ef60f1711fa873562242b2eeef8dfb9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/field.ts:1196 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:1235 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":1196}}}],"partialFingerprints":{"codehealthFindingId/v1":"718f6512c1422539aad82007c1cb7761429b42f8430bccd8e191ecb140af1e80"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts:176 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts:261 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts:335 \u2014 all 3 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef625cf50552759273943b0b4c5073d8fd6b152538fdd36282ea81f7ba5d3f80"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:294 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:386 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"05d409d5a11da790592e74537bb60f69cfbc04178eeb497c022ba2065ff987ba"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts:132 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts:121 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe71de29357dc9a9b8b5ef415eabb1c0c8a2c39afcbc86796d406e8beae2385c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 14 locations): invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCFGRescaleMultiplier.tsx:24 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamCFGScale.tsx:24 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeExponent.tsx:28 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeScale.tsx:26 \u00B7 \u002B10 more site(s) not listed \u2014 the 14 copies are spread across 14 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":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCFGRescaleMultiplier.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"890aefbc666f67d90f6c741066495dae5e5a3f321ec2a21ae4596b68004bdfe2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 18 locations): invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCFGRescaleMultiplier.tsx:40 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamCFGScale.tsx:40 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeExponent.tsx:44 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeScale.tsx:42 \u00B7 \u002B14 more site(s) not listed \u2014 the 18 copies are spread across 6 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 18 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCFGRescaleMultiplier.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bd03aa000b212d14c14ecb0b5451d502ecc63bd4580c5c11c50f840bd7016c4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledHeight.tsx:51 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledWidth.tsx:51 \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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledHeight.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2a22f8398688ffb4b144bf11ac8080149c8aa9f15b89274dcdcdbe047900c89"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 7 locations): invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceEdgeSize.tsx:22 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMinDenoise.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/MaskAdjustment/ParamMaskBlur.tsx:21 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamSteps.tsx:23 \u00B7 \u002B3 more site(s) not listed \u2014 the 7 copies are spread across 5 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 7 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceEdgeSize.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddee67066f8ed695356917b7ec36c18e7f060dd5292480934ee0414761ea8ecc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/MaskAdjustment/ParamMaskBlur.tsx:44 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillPatchmatchDownscaleSize.tsx:50 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillTilesize.tsx:43 \u2014 the 3 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/MaskAdjustment/ParamMaskBlur.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"02141d3627e7cf26f40f29893afdc7baba42d6c00f91aa9d655c29efea217aaf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts:102 \u00B7 invokeai/frontend/webv1/src/features/system/store/hotkeysSlice.ts: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":"invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce5049a33c499ad40520aeedc00c0add4a5a6dbf330c9e7d407a4c639adb2c06"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 7 locations): invokeai/frontend/webv1/src/features/queue/hooks/useCancelBatch.ts:17 \u00B7 invokeai/frontend/webv1/src/features/queue/hooks/useClearInvocationCache.ts:21 \u00B7 invokeai/frontend/webv1/src/features/queue/hooks/useDisableInvocationCache.ts:21 \u00B7 invokeai/frontend/webv1/src/features/queue/hooks/useEnableInvocationCache.ts:21 \u00B7 \u002B3 more site(s) not listed \u2014 the 7 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 7 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useCancelBatch.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"46e809a90657e4d8f8ccb93cc2e92e6730336c51bb5982b06298bdf9d76ec799"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/settingsAccordions/hooks/useExpanderToggle.ts:6 \u00B7 invokeai/frontend/webv1/src/features/settingsAccordions/hooks/useStandaloneAccordionToggle.ts:6 \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":"invokeai/frontend/webv1/src/features/settingsAccordions/hooks/useExpanderToggle.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"752f5d3565142755e2b214dd0bed8809f64a6c75a148e9dc725450a73579f67c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogLevel.tsx:15 \u00B7 invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsLanguageSelect.tsx:45 \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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogLevel.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ceb640749c9d48f765e8d2c61a79dfe5f89baaf19d698f1baee99dcb472c5d6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/images.ts:720 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/images.ts:760 \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":"invokeai/frontend/webv1/src/services/api/endpoints/images.ts"},"region":{"startLine":720}}}],"partialFingerprints":{"codehealthFindingId/v1":"473de6e46323f772f3471a95886dfeadd958fe618f85ee4dd795af6d907dff74"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 5 locations): invokeai/frontend/webv1/src/services/api/endpoints/videos.ts:110 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/videos.ts:133 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/videos.ts:157 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/videos.ts:217 \u00B7 \u002B1 more site(s) not listed \u2014 all 5 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":"invokeai/frontend/webv1/src/services/api/endpoints/videos.ts"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"863b1878724b8d982c461cec183c4e712ee3e1ed189230994723c89b139084e0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3 locations): invokeai/frontend/webv1/src/services/api/endpoints/videos.ts:127 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/videos.ts:305 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/videos.ts:325 \u2014 all 3 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":"invokeai/frontend/webv1/src/services/api/endpoints/videos.ts"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebe64b76644f6c29e55f6e150979fb90a3442197b34c2e1a521d709dad86c305"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/videos.ts:308 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/videos.ts:328 \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":"invokeai/frontend/webv1/src/services/api/endpoints/videos.ts"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"f767d003d9d412088d65a75645f75b34b7a433ffe419bc0543ee2a73ecab85d4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/events/setEventListeners.tsx:713 \u00B7 invokeai/frontend/webv1/src/services/events/setEventListeners.tsx:834 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":713}}}],"partialFingerprints":{"codehealthFindingId/v1":"45b015262b85ff6fd684ba5e304255f37576c0e34c030a8d55d557686e6bbf7b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/write-contract-caller-matrix.mjs:84 \u00B7 invokeai/frontend/webv2/scripts/write-workbench-ownership-inventory.mjs:46 \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":"invokeai/frontend/webv2/scripts/write-contract-caller-matrix.mjs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"41c3d1be5b4a15d8a48da7095eda9c820912d150fc6f00c4b4cb8418fcb05b75"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/data/realtimeRuntime.ts:129 \u00B7 invokeai/frontend/webv2/src/features/queue/data/realtimeRuntime.ts:133 \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":"invokeai/frontend/webv2/src/features/gallery/data/realtimeRuntime.ts"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"e99ea89b95b07805abd0fc0f2e0c63327b18c8148c1ebebfe62f42e22cda370e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx:78 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx:257 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx:685 \u2014 the 3 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"2915ba5e1b1b4336d9bf53893340762e19247f381ab4e9facbc43693cf58823d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:113 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graph.ts:160 \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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"3da4e19c7e69647ed835c993098cc93a66aeb532233d95e6e8f5621f3cfe15e0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/graphBuilder.ts:179 \u00B7 invokeai/frontend/webv2/src/features/generation/core/previewGraph.ts:73 \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":"invokeai/frontend/webv2/src/features/generation/core/graphBuilder.ts"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"2acd8e7dc61124b893bb16ede7b65002662b6b5ed50a7f348bb2306ac8922e57"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/promptFields/DynamicPromptsButton.tsx:71 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplatesButton.tsx:91 \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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/DynamicPromptsButton.tsx"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad7a1c0a700f87ef56fcd9f8ff10c7848d03d3cf9d6cbfaedef6afc169e74d52"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/identity/ui/useIdentityNotify.ts:3 \u00B7 invokeai/frontend/webv2/src/features/models/ui/useModelsNotify.ts:3 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/identity/ui/useIdentityNotify.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"8968f51a620937d4ebf749fcb799835a67139484141771de8eb2b0e6851d5ed6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/runtime.ts:2404 \u00B7 invokeai/frontend/webv2/src/features/queue/runtime.ts:2424 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":2404}}}],"partialFingerprints":{"codehealthFindingId/v1":"703ac031302ea459ecace18ede097890750f945d4679e8e5d5f1198b05f46ae4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (14 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/ui/formatDuration.ts:2 \u00B7 invokeai/frontend/webv2/src/features/queue/ui/formatDuration.ts:29 \u2014 the two spans are one implementation copied and then locally edited \u2014 85 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":"invokeai/frontend/webv2/src/features/queue/ui/formatDuration.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"75a25dc29f80f6c2f6a9153221f480e2b5c555d662a16f62ce0e65f8639f9ee0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx:531 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx:561 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx"},"region":{"startLine":531}}}],"partialFingerprints":{"codehealthFindingId/v1":"b50f41b6a81db8e668af5c3cc03348c8a6da27cf9edbeaf006419e02bc0b6d1f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (14 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/platform/state/externalStoreCore.ts:4 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/engineStores.ts:299 \u2014 the two spans are one implementation copied and then locally edited \u2014 72 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/state/externalStoreCore.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"97ddbe545d2287f57550f2c3c866477a4fd2afed43716310116210815779fdea"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (14 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/platform/state/projectedExternalStore.ts:49 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/useCanvasEngine.ts:46 \u2014 the two spans are one implementation copied and then locally edited \u2014 52 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":"invokeai/frontend/webv2/src/platform/state/projectedExternalStore.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"08a032ef16115be4a4e2cb01add6bfbd1b13d5d38bd077391f0f6fff1cb62a9e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/rasterExportController.ts:79 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/rasterExportController.ts:232 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/rasterExportController.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8117da00fe477cf1949d74fec197330f92c62af19caaad33dcbd49e3c9a6148"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts:607 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts:1029 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts"},"region":{"startLine":607}}}],"partialFingerprints":{"codehealthFindingId/v1":"f73cfd44c4d79c8e8d2852cfb168db236853dcdf605c900e68d8d3318ff920dd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/engineStores.ts:363 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/engineStores.ts:413 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/engineStores.ts"},"region":{"startLine":363}}}],"partialFingerprints":{"codehealthFindingId/v1":"e62bc8a16cbfba3260e24a6ca32d742e1c7f6213451553a7c12750f715288abf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/tools/paintTool.ts:89 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/paintTool.ts:128 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/paintTool.ts"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"eef91fdb74a28934e81af7d476430d01fa5eac851b59309d5844b30a2fbc4edb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (14 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/tools/shapeTool.ts:339 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/shapeTool.ts:366 \u2014 the two spans are one implementation copied and then locally edited \u2014 80 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/shapeTool.ts"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c8d3bef399bd6bda2d91d6755c5c9a086700086e072e771e7c46c9c8a1296a0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 5 locations): invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts:99 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.ts:85 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.ts:104 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.ts:154 \u00B7 \u002B1 more site(s) not listed \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea179b3409409a71dd64001c782a118193c7c46f34cfd0d5cf5ef4b7e24436ef"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts:933 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts:971 \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":"invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts"},"region":{"startLine":933}}}],"partialFingerprints":{"codehealthFindingId/v1":"46dcd5506303f2ba2202f5bbea161e8e6984b34d70fcb8b1ddd20cf4a86ac881"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/useProjectActions.ts:63 \u00B7 invokeai/frontend/webv2/src/workbench/projects/useProjectActions.ts:81 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/useProjectActions.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"66b7190cd54c99542813810ed5fec8bade2f7eb4f53bbbbde92f8bf49afaf5ea"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (14 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/invoke/prepareCanvasInvocation.ts:203 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/invoke/prepareCanvasInvocation.ts:223 \u2014 the two spans are one implementation copied and then locally edited \u2014 107 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/invoke/prepareCanvasInvocation.ts"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1d89d4b8c4aec9237635c37ca27de03e9bc43c895199ad3ba6a288d4ec8979f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/RegionalGuidanceSettings.tsx:103 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/RegionalGuidanceSettings.tsx:119 \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/RegionalGuidanceSettings.tsx"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"492d881c01032587bd26caa9e26dc36cf79838e71e51d2f5776cc5bcc92fb267"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3 locations): invokeai/frontend/webv1/src/common/components/ColorPicker/RgbColorPicker.tsx:45 \u00B7 invokeai/frontend/webv1/src/common/components/ColorPicker/RgbColorPicker.tsx:58 \u00B7 invokeai/frontend/webv1/src/common/components/ColorPicker/RgbColorPicker.tsx:71 \u2014 all 3 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/components/ColorPicker/RgbColorPicker.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"5602c7bccf2dda651de93f654925947b4206b7f80ad8de30283c7a984d641591"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/hooks/useImageUploadButton.tsx:141 \u00B7 invokeai/frontend/webv1/src/common/hooks/useImageUploadButton.tsx:155 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/hooks/useImageUploadButton.tsx"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"79a3dc0a851103e304d62f0f0c984722b1c1a80eabf95c13dd47911535a955ba"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (13 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/util/convertImageUrlToBlob.ts:9 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts:330 \u2014 the two spans are one implementation copied and then locally edited \u2014 66 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":"invokeai/frontend/webv1/src/common/util/convertImageUrlToBlob.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"04847ff5994082488dbd0415b007a86e1d3073063e6e02d82bb82ed3592a7367"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsSelectedEntityStatus.tsx:58 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsSelectedEntityStatus.tsx:73 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsSelectedEntityStatus.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2614e57293211100bac1b2a6c024141b24c5dcabd4e04018f441ae008f2f5d7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityGroupList.tsx:46 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx:44 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityGroupList.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab43f1537abfa6412a3550f9e654d825e6216978c8cfec083e451c088e6166ab"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (13 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerBadges.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsTransparencyEffect.tsx:11 \u2014 the two spans are one implementation copied and then locally edited \u2014 71 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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerBadges.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1464146f6827e5878af4c10183001f9d376a5385e6c330276ae696ac289b0fc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaItemsList.tsx:60 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/scrollIntoView.tsx:63 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaItemsList.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"28195ee3091f0fd3bd2cdba7dc0d7a5a81aadd30359db21e29da7d3db7762c2b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx:634 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx:647 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx:660 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx:673 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx"},"region":{"startLine":634}}}],"partialFingerprints":{"codehealthFindingId/v1":"32df9f93c6a4716209c06e0414d4661a5dac87bc695fc74c5bf5f320085b925c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (13 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarNewSessionMenuButton.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarProjectMenuButton.tsx:9 \u2014 the two spans are one implementation copied and then locally edited \u2014 51 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarNewSessionMenuButton.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4e9567065dfcdc1e00f4fe7ed9a7ab614656462e1c1ee8f106d55a7a9482bc9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectLoad.ts:140 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectSave.ts:101 \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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectLoad.ts"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc501fb84dbb6fa6f216c7462b1eabf109aac1d27f0aa61d866d02e6171b3bff"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasBackgroundModule.ts:220 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts:446 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts:389 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasBackgroundModule.ts"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"302b686793f62106609d20d2c2ad8bf79aa72225f3f59580c6b6adb04fed7d0e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (13 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts:240 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasTextToolModule.ts:81 \u2014 the two spans are one implementation copied and then locally edited \u2014 56 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb8969672cc447db133e5683e484e641c4805f82c787a0b73ff26695696a9c58"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts:38 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:161 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"eafd8285db7d9eac4638617bf346376a4914a9df703bf2a55b37acd1f4fb5052"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts:165 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:1084 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac423471a7df47fec739617a8823577a1510948dd8ee0e97fd1767c18b822b19"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts:443 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts:467 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts:512 \u2014 all 3 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"725dc6ee270f6b7fb0c69273d9de9475cc9f9d530182a3f7059ac711437bb050"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts:1186 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBboxToolModule.ts:504 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":1186}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7a63d80617f4590b74deb4e7a7ed842149e1b63b7b0465cb75acdd9711d982c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (13 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntityRendererModule.ts:39 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStagingAreaModule.ts:121 \u2014 the two spans are one implementation copied and then locally edited \u2014 74 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntityRendererModule.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"db865e2a23e4e823f7c63d843f488d66584297eb2b2fcfb4d0d2d98029cb6a8f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts:595 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts:611 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts"},"region":{"startLine":595}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f119767e1780cd83f35c7ba66cbb6de40f6ced00367198c00c5bd439847ea1b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:283 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:450 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"900fe04be6a2eb32ba196367780c88171dedc00df3eb17448f93829eb32de908"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts:55 \u00B7 invokeai/frontend/webv1/src/features/system/store/hotkeysSlice.ts:29 \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":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f725240db179dd46346961a0e482372e74dfa2dc4828a0345fe170f8607e2a5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx:109 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx:133 \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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"e16d7f72eba48b9336b9323af1fbb44e6e29be5be2a72dea36f4e41193cdf031"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx:87 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx:69 \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":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"435f21df403230ee3b2602de0ecbe7a9ecac5d6ef43f37a955ddde4e10d3c549"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AutoSwitchCheckbox.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowArchivedBoardsCheckbox.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowStarredFirstCheckbox.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/UsePagedGalleryViewCheckbox.tsx:7 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 5 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":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AutoSwitchCheckbox.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"bec283cb51fee439bcfec64ebf53e690febce02d6d9386ffe91ec0b074c5499a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx:563 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx:637 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"24454d542b7978c344e13d96cc95d41df5adc96dc945ff22c0c18798006f4c5a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/NodeOpacitySlider.tsx:5 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceEdgeSize.tsx:16 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMinDenoise.tsx:9 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/NodeOpacitySlider.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"54948093f945193b7fbd2198b13616e4f0813dfbb9d3ac71034ab8be83bf121d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/SaveWorkflowButton.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/SaveWorkflowButton.tsx:9 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/SaveWorkflowButton.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"65444d7ca8851d03088eb7b436cc1099164fb95ad25bec2570991febc8b9df40"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/DividerElementEditMode.tsx:22 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElementEditMode.tsx:22 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementEditMode.tsx:28 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/TextElementEditMode.tsx:22 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/DividerElementEditMode.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"33c57bef38213e3276a60e3a4a223bbe093cec2a8c428dccd342483c9ebd1315"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/common.ts:23 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/v2/common.ts:4 \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":"invokeai/frontend/webv1/src/features/nodes/types/common.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e7cc200d90bcc4577fe7cd3934f2e026504ea7c964b952b6851497caed97885"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/nodes/types/field.ts:112 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:126 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:140 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:166 \u2014 all 4 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":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"b35218d1b957ff23a608f62074ade4d93e4f44be20303ea04ffb9f5d8eda930d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:267 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:358 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"1eef05f99931f7ecff1d394c81ea33aa3347ce3ef52211bb7587a1095dea3915"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:53 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts:28 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"334bf1630b61507e746c895956c6620e7a4072ed20586bf1c407e40115c41570"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (13 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx:205 \u00B7 invokeai/frontend/webv1/src/features/prompt/PromptTriggerSelect.tsx:93 \u2014 the two spans are one implementation copied and then locally edited \u2014 74 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":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c4ed28216151ddc4af42d2916e63298a32758dcac8c668a47aca2582b74c16d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1126 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1185 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1231 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":1126}}}],"partialFingerprints":{"codehealthFindingId/v1":"9349b1a3ec7671a4941181edac491c60f4473534265d2a2afe08c43bafe875ed"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx:39 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx:34 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadUseALayoutImageButton.tsx:35 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"fff7f3af1490ff93fe7f5401460e3d40b9774f2b3ceaa3d1e9215bd993a6b667"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromImage.ts:19 \u00B7 invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromLibrary.ts:19 \u00B7 invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromObject.ts:12 \u00B7 invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromVideo.ts:19 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromImage.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"c974fb823ef22d043827279ea4116f1415970162ba19423d9fbdf5e139ef8512"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/images.ts:1112 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/videos.ts:398 \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":"invokeai/frontend/webv1/src/services/api/endpoints/images.ts"},"region":{"startLine":1112}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfa93cf34f0bb2cf81b54c066bc4cf02976109c5bfe4d774073c0c5a1db7bf6e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/run-graph.ts:501 \u00B7 invokeai/frontend/webv1/src/services/api/run-graph.ts:516 \u2014 all 2 copies are in the same file, and each CITED SPAN is a SPECIALISATION DECLARATION \u2014 a type whose \u0060extends\u0060 clause names a base and whose body hands that base its own values through \u0060super(\u2026)\u0060. The shared module this dimension usually asks you to extract already exists: it is that base, every one of these sites already reaches it, and the \u0060super(\u2026)\u0060 call this row matched on is where each site passes its differences in. So do not read this as an extract-a-helper row \u2014 there is no missing helper, and what is left at each site is the declaration of one distinct specialisation, which cannot be deleted without deleting the thing it declares. Read what actually differs between the spans, because two different answers follow. Where the sites differ only in the values they hand the base \u2014 a type argument, a service, an alias, a cache \u2014 the repetition is a TEMPLATE, and the only moves that collapse it are to generate these declarations from the set they enumerate or to replace the repeated construction with one factory each site calls with its own values; where that set is the point, each site pinning one distinct thing, the repetition IS the enumeration and there is nothing to remove. Where instead a span carries logic OUTSIDE the delegation that is the same at every site, that logic is the part to move, and its home is the base type rather than a new module. Reported because the copies still drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/run-graph.ts"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"786947f8306381d9a11e13e757281d05f442ec4de9acabf7ac5e2b8fd457e1fd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/types.ts:654 \u00B7 invokeai/frontend/webv1/src/services/api/types.ts:674 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/types.ts"},"region":{"startLine":654}}}],"partialFingerprints":{"codehealthFindingId/v1":"2aaf60e3539b6b7ad84577db1afb508b37cba024549d186774752669e7a9e1d9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/events/setEventListeners.tsx:201 \u00B7 invokeai/frontend/webv1/src/services/events/setEventListeners.tsx:252 \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":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecdcd461f2b76b5b28f85df15e538f477783507a51c76208835dab2ebff5ec51"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/mock-backend.mjs:16 \u00B7 invokeai/frontend/webv2/scripts/mock-backend.mjs:34 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/mock-backend.mjs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"c80710ca38770010e8792d99dec7acdea505a575e1e9118adfb42b7d5748fe4b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/write-workbench-ownership-inventory.mjs:62 \u00B7 invokeai/frontend/webv2/src/architecture/dependencyPolicy.ts:91 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/write-workbench-ownership-inventory.mjs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"84ae7cb86346e2014610d5a8f3aa4e0f41693c1617937c05e04e457e757d01f1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/fonts/runtime.ts:422 \u00B7 invokeai/frontend/webv2/src/features/fonts/runtime.ts:555 \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":"invokeai/frontend/webv2/src/features/fonts/runtime.ts"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"86bac99a8b4b393d517e608c38a92b58c5a98619817d3ee43f7586c949502170"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardFilters.tsx:150 \u00B7 invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardFilters.tsx:163 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardFilters.tsx"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dd2ccff3b2495efd7732888cf180b3c331b4ed10fcb50d3b2d50e0759b27085"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/ui/GallerySelectionBar.tsx:122 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/panes/HistoryPane.tsx:48 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GallerySelectionBar.tsx"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"67eab2d2410872615926e76668f845548e1688faef029b5939b937c6033bb8d4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:737 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graph.ts:854 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graph.ts:1087 \u2014 all 3 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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":737}}}],"partialFingerprints":{"codehealthFindingId/v1":"7834fc5852d935a1ce2624c2488132582ff17fca42e039e42d8a2cad33bb2a27"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplatesPanel.tsx:193 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardsPanel.tsx:256 \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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplatesPanel.tsx"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"be2afaa9b43dd19cb03c3eaf6781fe0d83ad6e80703300096d2c5f77d59970a9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx:176 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx:189 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca46b620ab483af56051946b10634bad99ecb303355c175379352cab5a355edf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/data/installsStore.ts:114 \u00B7 invokeai/frontend/webv2/src/features/nodes/data/nodesStore.ts:34 \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":"invokeai/frontend/webv2/src/features/models/data/installsStore.ts"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb12a47d0c12872f222bf892ba93d475238fbaee7feb64ebeafe20a8f83747b3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/data/generationDevicesStore.ts:141 \u00B7 invokeai/frontend/webv2/src/features/queue/data/generationDevicesStore.ts:160 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/data/generationDevicesStore.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"874b6775992b6439002cd22f44d328a2f96f3114a19c64300ed5db445dc940db"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/runtime.ts:1119 \u00B7 invokeai/frontend/webv2/src/features/queue/runtime.ts:1181 \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":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":1119}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e74397c0f86781a9d5382e905d2f29f6fb0e204587920a295e6757d6ebc48a8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/ui/queueMenuActions.tsx:141 \u00B7 invokeai/frontend/webv2/src/features/queue/ui/queueMenuActions.tsx:177 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/ui/queueMenuActions.tsx"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed81c8269c7e87f8e26f1bebbd3606f21131a52bbce0ffa96f9d356ab276348d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx:352 \u00B7 invokeai/frontend/webv2/src/features/video/ui/VideoConceptsSection.tsx:34 \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":"invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f91a689ba009eae529d9780bd957d135fd88eade8889a327ad52057bddbe667"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/editor/AddNodeDialog.tsx:888 \u00B7 invokeai/frontend/webv2/src/workbench/palette/CommandPaletteRows.tsx:188 \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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/AddNodeDialog.tsx"},"region":{"startLine":888}}}],"partialFingerprints":{"codehealthFindingId/v1":"f60c21b6af321bd118b18b9e78c6410ddce997dfabeb82a00e17d2d84b0876ef"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/linear/FormBuilderTab.tsx:484 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/linear/FormBuilderTab.tsx:503 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/linear/FormBuilderTab.tsx"},"region":{"startLine":484}}}],"partialFingerprints":{"codehealthFindingId/v1":"1be9efdf2c169ee5dfafea521998d22788e095f8b11dec0df44101587501ffda"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (13 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/platform/state/externalStoreCore.ts:9 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/operationStores.ts:11 \u2014 the two spans are one implementation copied and then locally edited \u2014 63 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":"invokeai/frontend/webv2/src/platform/state/externalStoreCore.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7add54cd0e3a4b5b0d2852a590945585d32fa43d63814f0d9869a742c80f8a0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/platform/ui/ConfirmDialog.tsx:96 \u00B7 invokeai/frontend/webv2/src/workbench/shell/AlphaNoticeDialog.tsx:29 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/ConfirmDialog.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a2f9fed59e5497d2ad20d75955dd08fafa163f555968f57933415d111a889a4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/controlPixelController.ts:302 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/controlPixelController.ts:420 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/controlPixelController.ts"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8ad87716261e39786053a68adb4f69cba6a7cf4f38629201a098e0b6b1445de"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (13 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskResultController.ts:110 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/stagedResultController.ts:203 \u2014 the two spans are one implementation copied and then locally edited \u2014 78 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskResultController.ts"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f93a144fac63adcaae4f4a59b988f937645fff7b6d532f8365fea68d4f0d237"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (13 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/layerRasterizer.ts:154 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/layerRasterizer.ts:178 \u2014 the two spans are one implementation copied and then locally edited \u2014 82 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/layerRasterizer.ts"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"37e25eefeed08f103d6d0ab8a29f74220854687eb6ade3c0933a7e3e8057447e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/render/controlTransparency.ts:25 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/render/maskFill.ts: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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/controlTransparency.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"c815017d0bc1944defa825e123a4344b2e2400998b8f1b466a884e3d73234092"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/render/overlayRenderer.ts:326 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/render/overlayRenderer.ts:417 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/overlayRenderer.ts"},"region":{"startLine":326}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd860f64861e98ce7a7f76572cc14ea52be6ee2aad89cd5aa9783b173e8100e5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 4 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/tools/gradientTool.ts:107 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/marqueeTool.ts:122 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/moveTool.ts:214 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/samTool.ts:101 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/gradientTool.ts"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c6cc24a9e235e87f1311aabaf45e4c8f7d72ef2c196e06e74cf4d3e87b5d854"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/launchpad/LaunchpadNav.tsx:108 \u00B7 invokeai/frontend/webv2/src/workbench/widget-frame/WidgetFrames.tsx:185 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/launchpad/LaunchpadNav.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ef808c4a047c6a142d201e67905b1bc5fb079e761a6687ba4ea69f7590da060"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:2176 \u00B7 invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:2233 \u00B7 invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:3020 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":2176}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8be0ba2dd671eb70a45b459f33b63c4362e8fdb0a403aafb87830c54abcc0ac"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:290 \u00B7 invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:912 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"8458f8c0698c05305a7c7ebfd9a4566499a5c9fddb91281eaefef14105ca9cb4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/settings/store.ts:181 \u00B7 invokeai/frontend/webv2/src/workbench/settings/store.ts:220 \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":"invokeai/frontend/webv2/src/workbench/settings/store.ts"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0a38190254b842d32d6aec3454c08826048816842442a64ac21ddaf48bf274e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/settings/store.ts:294 \u00B7 invokeai/frontend/webv2/src/workbench/settings/store.ts:333 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/store.ts"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5fbaa1f64e697b7ccb2827703b412487046480f0e50a91fc59c197a68b9bf3a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasHeaderActions.tsx:188 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasHeaderActions.tsx:229 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasHeaderActions.tsx"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"48f3c16e094829ad76d299bfec101dd47a22ee6e5f6f0d22b294edf269ff486f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 4 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx:338 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/InpaintMaskSettings.tsx:125 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRegionSettings.tsx:113 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/RegionalGuidanceSettings.tsx:266 \u2014 the 4 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. There is one copy in each of 4 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b55419b11207fe7c15a3c638c822c351bdb52e37d3c8759326b71c2b0a2fbed"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/LayerChildMenu.tsx:120 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerGroupContextMenu.tsx:278 \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerChildMenu.tsx"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"44bdba330814f839259c47016257d464dce2ae1711c4f0791d9a65fcacfbdc0c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx:373 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerGroupContextMenu.tsx:180 \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"cba856fe69f53717558f1c12b503cc23d330492f6e1d1ddb43125bda07726e71"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx:563 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx:576 \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"a18f69fffc1da1ffe6b4d5d00efa2ad349f40258297d560e778a4e6564634e0e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/panes/HistoryPane.tsx:17 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/panes/OverviewPane.tsx:29 \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/HistoryPane.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"c96622271910a0b62bbd4354673132d7d565d181a3bcdff26ef6e517ca6ac94e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx:350 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx:948 \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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c602cedbc868481f75a133b2b650660d440c35e51d4e8b899fc78d2eb73a29e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx:121 \u00B7 invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx:135 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"d184dca615038e11850ff9180b249f69820b030ede53fed092267b2d56dd46f1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx:127 \u00B7 invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx:148 \u00B7 invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx:167 \u00B7 invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx:199 \u00B7 \u002B1 more site(s) not listed \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":"invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"28f56836a6d4fdb5e1e33cb0826518b73ced7faec9cfda7dd84749c833baf3ef"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAddEntityButtons.tsx:15 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListGlobalActionBarAddLayerMenu.tsx:15 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAddEntityButtons.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1049b641220b0097ef74f6fe3e3afb78dc9bca6f2d7cbc95df9d4c51b516a53"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarOpacity.tsx:167 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolWidthPicker.tsx:149 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarScale.tsx:155 \u2014 the 3 copies are spread across 3 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarOpacity.tsx"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f5da1fb1a1711a3a83944502f0bcb0385469d3f397ea06dfba4530f046a69bf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (12 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx:128 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/workflowHasImageField.tsx:48 \u2014 the two spans are one implementation copied and then locally edited \u2014 97 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"374560f9408fa70ab09cdce735d4acf26e64a812341eec66ba34e09a8df5b1bb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx:33 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMask.tsx:19 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayer.tsx:29 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidance.tsx:21 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"e408d87947a2dc11813f280a5529f5656ef8d8aaa12d32cb5aec5fe6064a381d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterAdjustImage.tsx:58 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterBlur.tsx:35 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterDepthAnythingDepthEstimation.tsx:29 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterNoise.tsx:50 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterAdjustImage.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"06dc0d159004585006cfc5f550c8db71b78526e3b5feb2fab3ffdc125df16b2f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (12 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsEditor.tsx:68 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerSimpleAdjustmentsEditor.tsx:51 \u2014 the two spans are one implementation copied and then locally edited \u2014 81 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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsEditor.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"9675ed7333381ce5a32521aff850c40b920aade44276f310838049b5387c3984"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (12 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsInvertScrollCheckbox.tsx:17 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsPreserveMaskCheckbox.tsx:7 \u2014 the two spans are one implementation copied and then locally edited \u2014 85 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsInvertScrollCheckbox.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"28504574964eaf95a440ae1af393850807bb28a68eba4f4a515cbbc93dceadb9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolBboxButton.tsx:2 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolTextButton.tsx:2 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolBboxButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"48b48b0e5072ac450898b45a78246bc052e46dd20a27b71e59bf173062d635a5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (12 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Transform/TransformSmoothingControls.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedRandomize.tsx:8 \u2014 the two spans are one implementation copied and then locally edited \u2014 58 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Transform/TransformSmoothingControls.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2a217b663e473aaf2b4c885ae89be51db6ffee774ad1b9d604d0e54c54568eb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/hooks/copyHooks.ts:57 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts:62 \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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/copyHooks.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"3362fd93ba9c12b11fade1b373a0a53ac1e1b79900497d8f28da32b6ddf68379"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts:273 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts:511 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"418a39b4ae5c8b3b91c1334d2f98b740329fc821af4573088300c3a932311eac"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityBufferObjectRenderer.ts:59 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts:104 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityBufferObjectRenderer.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9dca730021e06521454f8c91a5cdf3bb5deee4a8009c7ae5f0fe4e9282d725d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts:112 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:324 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"45f3ba735010c744dbc5f74c05e7a2dfeb95a7c639ac10e6b0c0828771a94aa5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts:354 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:1249 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"87fddb8e33bec79088157fb0f9c85d76a65205753fe75d4d5fd6587abc96e7ba"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectBrushLineWithPressure.ts:180 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectBrushLineWithPressure.ts:207 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectBrushLineWithPressure.ts"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f8cfa27f220266af05098a3cff39a2686d3e1c7dbcaecdb34991f3510c844f4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts:93 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts:105 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"031d9a0481241f0cc75cfd0f06b42dc53eb4c870c4d572abc212ac3afae5595b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts:415 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts:432 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e467c7dcbf0d2ebc4a9f78b20c5954bf30d6d97606eb87ac5d0b1a80b2de213"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts:543 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts:579 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts:613 \u2014 all 3 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"99cae7962e484efca01308fbd2d426c9668efd7a06bd6d5b0b09079059c96194"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1214 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1226 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1214}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5108df8d6a4c1fc7371ff02108f55ea6788e390016f8033f4866976994e0c5a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/dnd/DndDragPreviewMultipleImage.tsx:45 \u00B7 invokeai/frontend/webv1/src/features/dnd/DndDragPreviewSingleImage.tsx:37 \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":"invokeai/frontend/webv1/src/features/dnd/DndDragPreviewMultipleImage.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"462e4839e2c9fd7851fb6a3bc5fce6c0d29e6d48f1e004f430aa4502a73e8c5b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/dnd/dnd.ts:608 \u00B7 invokeai/frontend/webv1/src/features/dnd/dnd.ts:625 \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":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"2781695f46af3008ff595abbd8dd6e0793f0d830c2eca914046633e947128f3a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1901 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1924 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1966 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1901}}}],"partialFingerprints":{"codehealthFindingId/v1":"9043de6469f6cec356dfd278832ffdf1620bc54952cd060a23fc9be905c76392"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManager.tsx:15 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxHeight.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxWidth.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsHeight.tsx:10 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 5 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManager.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"299bce8b8412ec9d096f8cffeba0fa09a9ffdcf36ccaa967ab5293adac172191"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelImageUpload.tsx:96 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowThumbnail/WorkflowThumbnailField.tsx:67 \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelImageUpload.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"31540a1620759325a132b3a7e7ba44eae48e01be27eb50b68223e05a7a3b453f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNode.tsx:82 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNode.tsx:96 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNode.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bdc1133f20c1e2b86a8f99724fb1dadde36117a08619cb3f252dbc45b761459"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/BoardFieldInputComponent.tsx:107 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorImagesFromBoardSettings.tsx:83 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorImagesFromBoardSettings.tsx:128 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/BoardFieldInputComponent.tsx"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"231e224b8f8ba87e02a9d2e9192b907122f261e681a2c1da08754ad6ed461f82"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/SaveWorkflowButton.tsx:4 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/SaveWorkflowButton.tsx:4 \u00B7 invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/SaveWorkflowMenuItem.tsx:4 \u2014 the 3 copies are spread across 3 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/SaveWorkflowButton.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f093c0e41166addb8c257763c654e9635870719bf5e8ff16c5baeea764b3e03"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 12 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopRightPanel/WorkflowEditorSettings.tsx:55 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopRightPanel/WorkflowEditorSettings.tsx:69 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopRightPanel/WorkflowEditorSettings.tsx:83 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowGeneralTab.tsx:54 \u00B7 \u002B8 more site(s) not listed \u2014 the 12 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopRightPanel/WorkflowEditorSettings.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"054163d5335f05120194a0f28aabd3728b9c8bfb574d3804bd5f8bf3be2f2c8b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementStringDropdownSettings.tsx:23 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementStringDropdownSettings.tsx:36 \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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementStringDropdownSettings.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fc7931eece125f19191435aec63635a63ac284365cc39975b7f8b4e853f8058"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts:911 \u00B7 invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts:926 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts"},"region":{"startLine":911}}}],"partialFingerprints":{"codehealthFindingId/v1":"94675ce7f09ddda5d75eac72a732cd2c5885b8ee3b24c23ac9d318a2ba740583"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts:61 \u00B7 invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts:85 \u00B7 invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts:118 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"a04b67667e43f495c986b61851b2a7cb67a8da9f579acab9a07c661d172d7f1a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/error.ts:10 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/error.ts:39 \u2014 all 2 copies are in the same file, and each CITED SPAN is a SPECIALISATION DECLARATION \u2014 a type whose \u0060extends\u0060 clause names a base and whose body hands that base its own values through \u0060super(\u2026)\u0060. The shared module this dimension usually asks you to extract already exists: it is that base, every one of these sites already reaches it, and the \u0060super(\u2026)\u0060 call this row matched on is where each site passes its differences in. So do not read this as an extract-a-helper row \u2014 there is no missing helper, and what is left at each site is the declaration of one distinct specialisation, which cannot be deleted without deleting the thing it declares. Read what actually differs between the spans, because two different answers follow. Where the sites differ only in the values they hand the base \u2014 a type argument, a service, an alias, a cache \u2014 the repetition is a TEMPLATE, and the only moves that collapse it are to generate these declarations from the set they enumerate or to replace the repeated construction with one factory each site calls with its own values; where that set is the point, each site pinning one distinct thing, the repetition IS the enumeration and there is nothing to remove. Where instead a span carries logic OUTSIDE the delegation that is the same at every site, that logic is the part to move, and its home is the base type rather than a new module. Reported because the copies still drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/error.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"18409ca993405d964fe6f1112a3f1f8250c7d4ddddccc02d7fec7f8b80986412"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addImageToImage.ts:48 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts:67 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts:59 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addTextToImage.ts:44 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 5 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addImageToImage.ts"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"82ae78d3076ab5351b518d1574083f39ea39a6dd9ca70bbee2433a627e6c12c7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:412 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts:194 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":412}}}],"partialFingerprints":{"codehealthFindingId/v1":"16eaaadfb967b5a2da9f4245b49493aad03080bdfbb5f71ed52b4e88f55a9bb0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx:30 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx:71 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEModelSelect.tsx:25 \u2014 the 3 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":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"91de53ffa6f13dd036e0439be8c1bbbc0120e37cd8785ab538c92c6f96d40349"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageQuantization.tsx:26 \u00B7 invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogLevel.tsx:15 \u00B7 invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsLanguageSelect.tsx:45 \u2014 the 3 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageQuantization.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"a30766a0d2e826e14bbdf8677f14e9a53eef3d9a9f8e98c5dccb1e2a6fd2d187"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:95 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:127 \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":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bf7607dade1234af9c897498a7b7422eb1bf584f01eaff100139f04d9e0bd8d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:234 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:248 \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":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"980e9c5a3f59256c434c0ca830904b7deb95c6464e77d5da5dfed51463d03a6a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleCFGScale.tsx:8 \u00B7 invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerCFGScale.tsx:8 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleCFGScale.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f46dc1f0d3ed801693424bc7ba3ddaac64eca0b01de49d42f1347fc4bae8603"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/prompt/usePromptAttentionHotkeys.ts:50 \u00B7 invokeai/frontend/webv1/src/features/prompt/usePromptAttentionHotkeys.ts:63 \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":"invokeai/frontend/webv1/src/features/prompt/usePromptAttentionHotkeys.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"99805844682f912ab23420af2bb4bc71611aeee076daaf17ed160deb8c25042e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/components/ClearModelCacheButton.tsx:13 \u00B7 invokeai/frontend/webv1/src/features/stylePresets/components/DeleteStylePresetDialog.tsx:33 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/ClearModelCacheButton.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"48160ee74cb4c7c7d6413141d1b42bf71000261123c7f53c3af849d1482fbd71"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/queue/store/readiness.ts:919 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1007 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1125 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1184 \u00B7 \u002B2 more site(s) not listed \u2014 all 6 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":919}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a7eab627739ea06ef545a547428211b8cf7d84cdba1860dc5c75ea4fb345a03"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1089 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1193 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1239 \u2014 all 3 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":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":1089}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ad0bfc2632c46c851ed49f8c05a7a939ec844db22ac78d19c969198053ea51f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (12 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx:18 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx:32 \u2014 the two spans are one implementation copied and then locally edited \u2014 61 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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ff7346f392a2aedea11e0fd008be7c846edbccf2bd04f7151ea1b0ad9ae14f1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (12 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx:16 \u00B7 invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx:31 \u2014 the two spans are one implementation copied and then locally edited \u2014 74 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":"invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc8a42c5d0dd6fb885dce8746476b402120dccfe6bfd0f1327fbca251a608351"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/ui/layouts/DockviewTab.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasViewer.tsx:18 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasWorkspace.tsx:21 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabLaunchpad.tsx:36 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 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. There is one copy in each of 5 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTab.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1cb0762b93613834472c311d35ef73ed77c54b4655f7b5102ee34e647c25ae9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowConfirmationAlertDialog.tsx:158 \u00B7 invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx:65 \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":"invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fda35506761a5cfbf61d997c2ba5903556df19abe1157a28a9726ec838a1de9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/queue.ts:186 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/queue.ts:366 \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":"invokeai/frontend/webv1/src/services/api/endpoints/queue.ts"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4b643182e5a948cc9706f2abc73548b3f6d057ff220f0f50f0824660d52cb84"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/hooks/modelsByType.ts:58 \u00B7 invokeai/frontend/webv1/src/services/api/hooks/modelsByType.ts:86 \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":"invokeai/frontend/webv1/src/services/api/hooks/modelsByType.ts"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"d27200e272380f985b23daaf2b25fc594b0899350af45e19e63287ab24773cb6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): invokeai/frontend/webv1/src/services/events/nodeExecutionState.ts:42 \u00B7 invokeai/frontend/webv1/src/services/events/nodeExecutionState.ts:57 \u00B7 invokeai/frontend/webv1/src/services/events/nodeExecutionState.ts:74 \u2014 all 3 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":"invokeai/frontend/webv1/src/services/events/nodeExecutionState.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"226d018d40bdad236d407881ac62d252b92e0a2ca95b0d35580765f2717b73f9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 5 locations): invokeai/frontend/webv1/src/services/events/setEventListeners.tsx:331 \u00B7 invokeai/frontend/webv1/src/services/events/setEventListeners.tsx:352 \u00B7 invokeai/frontend/webv1/src/services/events/setEventListeners.tsx:396 \u00B7 invokeai/frontend/webv1/src/services/events/setEventListeners.tsx:441 \u00B7 \u002B1 more site(s) not listed \u2014 all 5 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":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"64f5d54575537519d611df848511de91eb9f66890d30a077f15698929576312a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:141 \u00B7 invokeai/frontend/webv2/scripts/run-project-file-journey.mjs:222 \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":"invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1a473007ed1f329317c099c6a3870fc40ded9e091679ac3881a34d4147f94b0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:941 \u00B7 invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:1191 \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":"invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs"},"region":{"startLine":941}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8a63bc709b1ec06c62f64bb61eac6bdb1f386052b128a642b3004f602d67b33"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardFilters.tsx:150 \u00B7 invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardFilters.tsx:163 \u00B7 invokeai/frontend/webv2/src/features/gallery/ui/GalleryItemSortMenu.tsx:41 \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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardFilters.tsx"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9c688822eb1a9894e59b3bb0c5e4da1dd56ce8586bac6de7dc5cb8e72c3e778"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts:423 \u00B7 invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts:510 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"00bf6ad76a798bc10846d4629fc376ad67b2ac96600e77aa9cd97cfd2a09859a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/GenerateConditioningRebalanceField.tsx:234 \u00B7 invokeai/frontend/webv2/src/workbench/settings/WidgetSettingsButton.tsx:116 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/GenerateConditioningRebalanceField.tsx"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"f75a9e2f864630ab743a2489b567c1354d14f206533872aa783c2f62700739e1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/GenerateSettingsForm.tsx:161 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/GenerateSettingsForm.tsx:222 \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":"invokeai/frontend/webv2/src/features/generation/ui/GenerateSettingsForm.tsx"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd57ad22962b6234d40516e49af76b580161f080c3c3c9050db1a385aa10f23a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplatesPanel.tsx:212 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardTransferActions.tsx:49 \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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplatesPanel.tsx"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb25455130dc153e7ca871ec5c81c7a3851ef8346c149ab8357faddeb8765a47"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (12 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/intermediates/ui/OperationPanel.tsx:94 \u00B7 invokeai/frontend/webv2/src/features/intermediates/ui/OperationPanel.tsx:180 \u2014 the two spans are one implementation copied and then locally edited \u2014 62 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":"invokeai/frontend/webv2/src/features/intermediates/ui/OperationPanel.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"654b3adf34c5f4b6bc3d5c0b819cf727b18b88256ae731ca6bc50baf7e2f0b17"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/data/relationshipsApi.ts:8 \u00B7 invokeai/frontend/webv2/src/features/models/data/relationshipsApi.ts:21 \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":"invokeai/frontend/webv2/src/features/models/data/relationshipsApi.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5dd0a961b3e1c9d8bb75f8024dbbdd4f315161651700438d0e9d96047870e71"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/ui/detail/ModelDetail.tsx:343 \u00B7 invokeai/frontend/webv2/src/features/models/ui/detail/ModelDetail.tsx:361 \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":"invokeai/frontend/webv2/src/features/models/ui/detail/ModelDetail.tsx"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"133ad1a3230a864aad17a699d0529d968462a2d332cfe68ad2af6a8d88a7f006"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/video/core/graph.ts:425 \u00B7 invokeai/frontend/webv2/src/features/video/core/graph.ts:631 \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":"invokeai/frontend/webv2/src/features/video/core/graph.ts"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef09898be0ee93b56c88cb5fe9cb2421279c47e3a3dc74991402878712707ecd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx:512 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx:542 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx"},"region":{"startLine":512}}}],"partialFingerprints":{"codehealthFindingId/v1":"66595965eff9e099a77899a5dd26b7ab37357b64eb39e9f25499645ae0bd8da7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/workflow/ui/graph-preview/GraphPreviewOpenAsMenu.tsx:54 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/graph-preview/GraphPreviewOpenAsMenu.tsx:74 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/graph-preview/GraphPreviewOpenAsMenu.tsx:103 \u2014 all 3 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":"invokeai/frontend/webv2/src/features/workflow/ui/graph-preview/GraphPreviewOpenAsMenu.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"df3ea13d8d13766cf276ff31ea329d48b380ceffc48dc7faac7f380d816311b9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/workflow/ui/library/ProjectWorkflowsView.tsx:397 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryCard.tsx:161 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryThumbnail.tsx:242 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv2/src/features/workflow/ui/library/ProjectWorkflowsView.tsx"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"971e22843290e6d8bbc6de9dc81e5c69bec1f775e527e99a2dc36ac0cc20d31c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.tsx:266 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.tsx:299 \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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.tsx"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a72e2d55437321d95095df04c9c8620cfae1d050e19aeb985cd4238818fe6e8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/library/useWorkflowPublication.ts:198 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/library/useWorkflowPublication.ts:238 \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":"invokeai/frontend/webv2/src/features/workflow/ui/library/useWorkflowPublication.ts"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4acc4507542be3e55a861fdc2088c7901530472365af315cb9dcb3504c91435"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/library/useWorkflowPublication.ts:221 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/library/useWorkflowPublication.ts:255 \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":"invokeai/frontend/webv2/src/features/workflow/ui/library/useWorkflowPublication.ts"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"7115bfa9249447ed5c3a8ea99d94211f77aa907abf07a3ef59c6d68975c2ccd9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/platform/ui/Field.tsx:120 \u00B7 invokeai/frontend/webv2/src/platform/ui/Field.tsx:143 \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":"invokeai/frontend/webv2/src/platform/ui/Field.tsx"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"1272100b337059f0c8df5cf1bdbc1032f1879743370620ad2ed75d9a64e6a760"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/platform/ui/HsvBoxPicker.tsx:72 \u00B7 invokeai/frontend/webv2/src/platform/ui/HsvWheelPicker.tsx:128 \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":"invokeai/frontend/webv2/src/platform/ui/HsvBoxPicker.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dc587b451f49e8ad77362d871f9ac6cf876734dc5a937cc887dbc3b65770c20"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/platform/ui/HsvWheelPicker.tsx:285 \u00B7 invokeai/frontend/webv2/src/platform/ui/HsvWheelPicker.tsx:297 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/HsvWheelPicker.tsx"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"c72f6e915ca8a9402468a1ca7a1405feabb98de896325a5d6057472ceefc103e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/booleanMergeController.ts:81 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts:248 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts:405 \u2014 the 3 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/booleanMergeController.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"360cd765f83cf058f2796429e0f6b5a1c6e2c61c1db2f9b97069937fda943d99"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts:733 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts:752 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts"},"region":{"startLine":733}}}],"partialFingerprints":{"codehealthFindingId/v1":"88c9df54c5906fb78bf570b3b01686260c32b8418e56698abfa7a294b546704a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerCache.ts:272 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerCache.ts:295 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerCache.ts"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"d60cbbf185aec8045164e28d1d853a77fa806ce14f06ff0890eb2cfdadf40918"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx:555 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx:958 \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":"invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx"},"region":{"startLine":555}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d850d646d6fe64611f8b801b8d9949f7eefc2082cc802c8a2dc8e148050e980"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts:547 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts:590 \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":"invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts"},"region":{"startLine":547}}}],"partialFingerprints":{"codehealthFindingId/v1":"bff9d54d8cdee0e206f27c38fc963467209bc78efb9d8a7902f655e27dcda296"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/launchpad/home/ResumeCard.tsx:26 \u00B7 invokeai/frontend/webv2/src/workbench/launchpad/projects/ProjectCard.tsx:29 \u00B7 invokeai/frontend/webv2/src/workbench/launchpad/projects/ProjectRow.tsx:23 \u2014 the 3 copies are spread across 3 files, and what repeats is a LIST OF ENTRIES rather than behaviour \u2014 the same entries written out more than once. Extract them into one shared, exported constant and spread that constant into each site, rather than into a function the sites call: a list like this often lives in declarative metadata (a decorator\u0027s options object, a static configuration table) that a build step must be able to read statically, where a function call is not allowed. Adding an entry to one copy and not the other is the failure this prevents."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/launchpad/home/ResumeCard.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"052ed77152a0c4e69f3a20d35b6cbd7359c8e90492ea42e655892cc4c064202b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/launchpad/projects/useProjectCardActions.ts:30 \u00B7 invokeai/frontend/webv2/src/workbench/shell/topbar/ProjectSwitcher.tsx:119 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/launchpad/projects/useProjectCardActions.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3dab68284a2c4fd8f0a79ac92089e5cdf7eaf43ce322d1a49327b1d797a9a13"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:231 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:321 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac0cab1888286a12a33f61d6e38cb0a43faf4bb1e3b905ef11e610677231babb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:306 \u00B7 invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:1153 \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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"552bb50137533aaf22786de53c339804d3babb10739a7c1523846f55207e5a3c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:927 \u00B7 invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:1158 \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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":927}}}],"partialFingerprints":{"codehealthFindingId/v1":"59eb384bbd800b5703920a4831f1ab05d15c2c7d20dc451e1feac57c430909f3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (12 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/invk/fontTransport.ts:54 \u00B7 invokeai/frontend/webv2/src/workbench/projects/invk/fontTransport.ts:75 \u2014 the two spans are one implementation copied and then locally edited \u2014 61 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":"invokeai/frontend/webv2/src/workbench/projects/invk/fontTransport.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"da05c06f2756fbefd511af812094dd4727d15379061f97fda7352fe110ad9532"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasHeaderActions.tsx:222 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasHeaderActions.tsx:235 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasHeaderActions.tsx"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"337fbdc9a2af8d88a97769ca2001e0b0b16dd25a9d67554302e18e0935c54f0a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/LayerChildMenu.tsx:54 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerStackMenu.tsx:26 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayersHeaderActions.tsx:98 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerChildMenu.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3ebd15e8b2ce39331d172e0a8816c4f4d428f70822082dc641bd91c49be2519"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx:725 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx:738 \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx"},"region":{"startLine":725}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d87418dbffcdfead131d1b8b7e76dc808b075e378f8d21a5c4e392603a35f94"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/panes/HistoryPane.tsx:44 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/panes/HistoryPane.tsx:56 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/HistoryPane.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"af329372bd2682d88aca5fc6468a7e5b1032944d9238716ab8aa87737be8814b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3 locations): invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:384 \u00B7 invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:403 \u00B7 invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:855 \u2014 all 3 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":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"cffedaef67a2f6c388fa65a994d4db1435e3a3b3a59026612f9f7439efec953d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:813 \u00B7 invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:871 \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":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts"},"region":{"startLine":813}}}],"partialFingerprints":{"codehealthFindingId/v1":"e22d1843b7c1fe72ad7c4a2cbfcf6b0e0f0bc6f81dbbb8c615e47362b48a53c7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 4 locations): invokeai/frontend/webv1/src/common/components/ColorPicker/RgbaColorPicker.tsx:96 \u00B7 invokeai/frontend/webv1/src/common/components/ColorPicker/RgbaColorPicker.tsx:107 \u00B7 invokeai/frontend/webv1/src/common/components/ColorPicker/RgbaColorPicker.tsx:118 \u00B7 invokeai/frontend/webv1/src/common/components/ColorPicker/RgbaColorPicker.tsx:129 \u2014 all 4 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/components/ColorPicker/RgbaColorPicker.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6c7acde05c424490639018215fd8c1136761e22a6ebf8eb56d24d3578dd654d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx:427 \u00B7 invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx:459 \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":"invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"42d03ed24b04ac6e278f44be6e03420648419bf5d16852d9f84a06d872ecdc3d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/hooks/useClipboard.tsx:44 \u00B7 invokeai/frontend/webv1/src/common/hooks/useClipboard.tsx:56 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/hooks/useClipboard.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0a58cc23411a9f6434a424c2fb38b87ca893aec44a2dc4c3a79dfff9e42319f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/util/baseUrl.ts:24 \u00B7 invokeai/frontend/webv2/src/platform/transport/deploymentBase.ts:10 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/util/baseUrl.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbf16ada87458a723a6fad640ed4f0d7415c7f13f83b9d3faf9c4697c302a7bd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsInvocationProgress.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsPreserveMask.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsSaveAllImagesToGallery.tsx:7 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsInvocationProgress.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cf0b71e4b2dc4318cfacfc90969c554bd7c1d97007a7508fe669eb71ebf6501"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAutoProcessSwitch.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsOutputOnlyMaskedRegionsCheckbox.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsSaveAllImagesToGalleryCheckbox.tsx:10 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAutoProcessSwitch.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"04e85596be57522e7d019052587e23a63c781185e2cbad83d20c48450458cc58"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (11 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerBadges.tsx:17 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceBadges.tsx:9 \u2014 the two spans are one implementation copied and then locally edited \u2014 53 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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerBadges.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"8eac7dcf9f46096b34d36399f1507004be8e708e80de4af66c592ee13cac519c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsExtractMaskedArea.tsx:108 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/hooks/useInvertMask.ts:66 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsExtractMaskedArea.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e584d272b79f76d868864dfba3ef57f09149cdf390de76466988b8f5ee47a2f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceAddPromptsIPAdapterButtons.tsx:16 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceMenuItemsAddPromptsAndIPAdapter.tsx:17 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceAddPromptsIPAdapterButtons.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"14db409d99086438e9105dbeea0ba5c5f9238d4a99d6c8517dc03e953172035d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (11 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsClearCachesButton.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsRecalculateRectsButton.tsx:6 \u2014 the two spans are one implementation copied and then locally edited \u2014 60 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsClearCachesButton.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"bff4da940ab6a20682887b8349b05d64d30a1520b5c23d38fc39967a44c5541b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (11 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsLogDebugInfo.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsRecalculateRectsButton.tsx:6 \u2014 the two spans are one implementation copied and then locally edited \u2014 62 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsLogDebugInfo.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf4dfb547e135590a0e54ffc972b36915481cf6eb51d12d8afd974e98d2f8edc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (11 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsPreserveMaskCheckbox.tsx:8 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowStarredFirstCheckbox.tsx:13 \u2014 the two spans are one implementation copied and then locally edited \u2014 54 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsPreserveMaskCheckbox.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"54df597fdd64286892e92e84e16d16625a8a2a9ce5a19391c599d1bdf8c289c1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/QueueItemStatusLabel.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/QueueItemStatusLabel.tsx:29 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/QueueItemStatusLabel.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"97a052d6e13e033695465f39ed5ebe6204cbfb025bf70b84de8a7bf3028d9e56"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolLassoModeToggle.tsx:38 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolShapeTypeToggle.tsx:56 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolLassoModeToggle.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e4f3f24710e11fa06f6a7c55fa7a89ee67e703b5e3a2184869cdaff1c0ed935"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarFitBboxToLayersButton.tsx:29 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarFitBboxToMasksButton.tsx:29 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarFitBboxToLayersButton.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"746d3ae4ca43f735ecff8bbad2bd4ce48ad5d3a13bdc5d4640151c2dd5a3ce59"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarScale.tsx:195 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarScale.tsx:218 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarScale.tsx"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"72fd40c8f19e4a28365db6583e46997e365e32afa647a05d2eebb8d7a961cff2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/hooks/addLayerHooks.ts:136 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/hooks/addLayerHooks.ts:161 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/addLayerHooks.ts"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"21d03d87650949d5a8a506de73fb4acba9cfd3a4187516f39234b0741cb3f3f2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectLoad.ts:142 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectSave.ts:103 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/hooks/useExportCanvasToPSD.ts:146 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectLoad.ts"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"6123d13b07e6a2939dbb925e1c15d68ed8aee657560687b22cd278a60dfabebb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasUndoRedoHotkeys.tsx:13 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasUndoRedoHotkeys.tsx:25 \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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasUndoRedoHotkeys.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"765aabdb235c6a45dc20783b5d31749ab502f9cc2909a404872ecaf115c5f30a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectBrushLine.ts:52 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectEraserLine.ts:48 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectEraserLineWithPressure.ts:50 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectOval.ts:41 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectBrushLine.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"15fa75abd0f7c7d798eb7b5f0be7d3ff10327a1f3febb1d4c3d378d6ff4a4723"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:1020 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:1034 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts"},"region":{"startLine":1020}}}],"partialFingerprints":{"codehealthFindingId/v1":"f33552a95dd86048b4267da541f3ee69d138b513090a7aabdeb91df4f1913f4d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts:172 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts:188 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"e13985d62c45db26c000217fdab1a9f41eafc9cdd21187f6067f3fb6cfbff740"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/pressure.ts:661 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/pressure.ts:711 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/pressure.ts"},"region":{"startLine":661}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6268e11d001b5f33fbcba7ccb3f07703c927811818a2f4e4663fd37cb9aaa33"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:187 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:198 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4fd6c172f8883950101c70511b8c037b355922a6cbbf08df069b88c808d8114"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:468 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:811 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fadd5cf3f9e2a0cf7e3615b595c464470e58a7584cc43ff8107c0aee0feaf55"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:719 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:730 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":719}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dcb8fb240f4eb8a2c178544554d5a3fd5c12e7decea941f71c707cde1cafe95"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:856 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:867 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":856}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5172bcd51b6c9d48f0895e24c53367e4383e2b68961231adf238520a65249b8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1501 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1512 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1501}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a0c0bbb71e0677d167a1751b9d38d201cf87ce1f52b4c5163ed79561a54e625"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:88 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:100 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"d645ec76bd25af3fa9443c80b781ecb83516b949f6e73f75d0d7f7bbe3932b23"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts:115 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts:129 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts:221 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts:232 \u00B7 \u002B2 more site(s) not listed \u2014 all 6 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0a93d96a0287a190471523771b9a1e8f86eeee5cef24d383a4090247ac93340"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/dnd/dnd.ts:696 \u00B7 invokeai/frontend/webv1/src/features/dnd/dnd.ts:711 \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":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":696}}}],"partialFingerprints":{"codehealthFindingId/v1":"969352b821a376da320d2d7c9022095888544427002faa5d42486c9b56435523"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/dynamicPrompts/components/ParamDynamicPromptsMaxPrompts.tsx:24 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamSteps.tsx:21 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamCreativity.tsx:18 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamStructure.tsx:18 \u00B7 \u002B2 more site(s) not listed \u2014 the 6 copies are spread across 3 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 6 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dynamicPrompts/components/ParamDynamicPromptsMaxPrompts.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf4f1bda231cdd7289f6e254e205e5700271e22e27a998e928dcd2b35cd62bf7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 12 locations): invokeai/frontend/webv1/src/features/dynamicPrompts/components/ParamDynamicPromptsSeedBehaviour.tsx:31 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaleMethod.tsx:28 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMode.tsx:22 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamAnimaScheduler.tsx:23 \u00B7 \u002B8 more site(s) not listed \u2014 the 12 copies are spread across 12 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":"invokeai/frontend/webv1/src/features/dynamicPrompts/components/ParamDynamicPromptsSeedBehaviour.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"df842516896df7b9319c64e4cb4cba5e6e954fa72711b515dcc05ef8a06fa113"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AutoSwitchCheckbox.tsx:13 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowArchivedBoardsCheckbox.tsx:16 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowVirtualBoardsCheckbox.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/UsePagedGalleryViewCheckbox.tsx:11 \u00B7 \u002B2 more site(s) not listed \u2014 the 6 copies are spread across 3 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 6 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AutoSwitchCheckbox.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ab33c8b43590e5ff4c10bbaa3421eb129dd5f04be211e2d0105100602cfec4f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ImageMinimumWidthSlider.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileOverlap.tsx:19 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileSize.tsx:19 \u2014 the 3 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ImageMinimumWidthSlider.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"e79166994fbc71fae0395e1e5ad57596ff49e65eb842cdf4ef0f3041cfe9b804"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/DataViewer.tsx:165 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/DataViewer.tsx:204 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/DataViewer.tsx"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"632fc6b3eaf4540ffb9b80144b7f3d03821244cdc74ea8c5a2448e2bd352691c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/VideoMetadataViewer.tsx:65 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/VideoMetadataViewer.tsx:76 \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":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/VideoMetadataViewer.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"16dd0aad7aaabb98d14f1bea65cf1267396e020ca5ce69ede0f1645021ca81ef"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx:129 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx:140 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx:151 \u2014 all 3 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfee891580045804e9d24bdc9daf91bc1878cdaa4602b88e6879fe37bc55466c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:325 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:340 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf0fe8d9fe0df736e5990aab3fe9e8904fa95d3ce1d2f298099e5dbc2c207c16"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1292 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1324 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1353 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1382 \u00B7 \u002B2 more site(s) not listed \u2014 all 6 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":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1292}}}],"partialFingerprints":{"codehealthFindingId/v1":"422b38268bedb3df466bb5924d3d07e9d556c9a59c18e7abbf2667687c554860"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1771 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:2017 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1771}}}],"partialFingerprints":{"codehealthFindingId/v1":"e749e0ac82e899e8688cebc03faf081d106849e33f6c87d93e914e9ac56b6c85"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1790 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1820 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1846 \u2014 all 3 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":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1790}}}],"partialFingerprints":{"codehealthFindingId/v1":"1973060cc064798cff19c60ab8865c1aade2c21c89171a1069a7b85e4803bc41"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1834 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1859 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:2022 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:2055 \u00B7 \u002B2 more site(s) not listed \u2014 all 6 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":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1834}}}],"partialFingerprints":{"codehealthFindingId/v1":"504682fafb878fc1183d504a76f0bc5855347e6bc73b96fa2c3377bfb6ddf3d4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1883 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1948 \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":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1883}}}],"partialFingerprints":{"codehealthFindingId/v1":"f65cf7c8d4f672ed8f5a447c39e8cbf6048f5fcc377ed2f3b6f1648db55d74eb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:2734 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:2768 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2734}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7b4605108cd68390882b5bb745e88c891010fbe76d162e2f0ddb4f0fe2db32d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ExternalProviders/ExternalProvidersForm.tsx:210 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ExternalProviders/ExternalProvidersForm.tsx:237 \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ExternalProviders/ExternalProvidersForm.tsx"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb7384f2e6babd86c898ce015c1c114ff424351131416c18ba17355ce3d44600"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueItem.tsx:320 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueItem.tsx:344 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueItem.tsx"},"region":{"startLine":320}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6f1bf2c3df21ff3c2a1a9f48f308cbce2604f55a9c0b81bcdd764493993ee30"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/SyncModelsDialog.tsx:68 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/SyncModelsDialog.tsx:92 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx:190 \u00B7 invokeai/frontend/webv2/src/features/models/ui/library/OrphanedModelsDialog.tsx:61 \u00B7 \u002B1 more site(s) not listed \u2014 the 4 copies are spread across 4 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/SyncModelsDialog.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"e992854873e0aded978918c55be6db7c1c9303016d88c165a2025c665c0c0b8a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (11 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelSettingsExportButton.tsx:24 \u00B7 invokeai/frontend/webv2/src/features/models/ui/detail/ModelSettingsMenuItems.tsx:38 \u2014 the two spans are one implementation copied and then locally edited \u2014 71 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelSettingsExportButton.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef6b9e3b422c4cab02129c853c610cbefdab90549fdcae6a39d68d5934ae306a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/VideoFrameIndexFieldInput.tsx:138 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx:1261 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/VideoFrameIndexFieldInput.tsx"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1933d339fd2c6c8e0966b80633e51ac28237cdb7c8e9939c7a0f058cf59715a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (11 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/StringField/StringFieldInput.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/StringField/StringFieldTextarea.tsx:9 \u2014 the two spans are one implementation copied and then locally edited \u2014 63 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/StringField/StringFieldInput.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"0698321f829e5a286327200f9a5bf9832331f317ee1c42bb16a355b5f39e469b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/NodeOpacitySlider.tsx:8 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceEdgeSize.tsx:19 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMinDenoise.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillColorOptions.tsx:16 \u00B7 \u002B2 more site(s) not listed \u2014 the 6 copies are spread across 3 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 6 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/NodeOpacitySlider.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0a32ae9a858df2a8e7b9aebb06c1f58c49a014fa517a67eb769330f1eb3bd3e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/center-or-closest-edge.ts:21 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/center-or-closest-edge.ts:32 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/center-or-closest-edge.ts:43 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/center-or-closest-edge.ts:54 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/center-or-closest-edge.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"37f901291ef2694b25195e851af4c1be49e89f64bb265c698dd9c71ada8db827"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/hooks/useNodeIsIntermediate.ts:6 \u00B7 invokeai/frontend/webv1/src/features/nodes/hooks/useUseCache.ts:6 \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":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeIsIntermediate.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"583706f2014d30e18701c6d424a82ed88aec87b9d9ea4e7c848157492894c5eb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/types/field.ts:396 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:464 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:546 \u2014 all 3 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"64d1b25f15fa3ab2062aa7bea6bcc64d9be4a729cb111cd8b536a53839d58fba"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts:32 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts:64 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts:55 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts:80 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"b366ef847a1d9d1092dd27daf6c9a99b9e2bcff5e1bda4787c74299944f2ac55"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts:96 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts:151 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"55a8fa3221816e88884a6bb92ea62e7feed1352a9024e9b5262eaae6d288ffc8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/schema/parseFieldType.ts:60 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/schema/parseFieldType.ts:84 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/schema/parseFieldType.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"be47c48ddf17de4bd89f78218893b9239a6cefae00e5267dc225310b9dfab5bc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 18 locations): invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamClipSkip.tsx:59 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamCFGScale.tsx:35 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeExponent.tsx:39 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeScale.tsx:37 \u00B7 \u002B14 more site(s) not listed \u2014 the 18 copies are spread across 6 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 18 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamClipSkip.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0113499e3babcbef02f79913ef5f4d2c277e075167be80a5c720388eafc2c4f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/parameters/components/Core/ParamWanGuidanceScaleLowNoise.tsx:17 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleCFGScale.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerCFGScale.tsx:9 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamWanGuidanceScaleLowNoise.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d05da70a334216c0a0112f1e8879c9acf8c50b64d495c9ee46891adc30e2088"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/components/CancelCurrentQueueItemIconButton.tsx:18 \u00B7 invokeai/frontend/webv1/src/features/queue/components/DeleteCurrentQueueItemIconButton.tsx:14 \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":"invokeai/frontend/webv1/src/features/queue/components/CancelCurrentQueueItemIconButton.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"08222db890b067c61cb317b9f174c3c537a6d91afdb698c5891deffd0cf19a32"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:36 \u00B7 invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueUpscaling.ts:15 \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":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"edcea1e2d96eeea73299be4d2b6a488a7d0994aea4854dc3f94eadbfb3b7b718"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/hooks/usePauseProcessor.ts:35 \u00B7 invokeai/frontend/webv1/src/features/queue/hooks/usePruneQueue.ts:22 \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":"invokeai/frontend/webv1/src/features/queue/hooks/usePauseProcessor.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"b84991654a73f838600f7fbbf0cc1fd1fda71781f4d4482a30dad4e3c8895e7b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1505 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1520 \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":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":1505}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb10d97d00ad384b890e08b2ec28b449974b6c5e8c124cb809ee0388280509f3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerCFGScale.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerSteps.tsx:12 \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":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerCFGScale.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1c308d334e2a335626d73a8fec13ce4a8b96135147cf2a83f0227d1626e48f9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/system/components/HotkeysModal/HotkeyListItem.tsx:189 \u00B7 invokeai/frontend/webv2/src/workbench/settings/HotkeysSettingsSection.tsx:477 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/HotkeyListItem.tsx"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fb7269b3d8046dd632d6ddec3d1f8f45e8695a6e32aa1b2b5c086e644b89cc1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsGenerationDevices.tsx:223 \u00B7 invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.tsx:1632 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsGenerationDevices.tsx"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"0efd0f1038b5625d11f2f0cdc7eca60ae6b3e83d6988247a31e0f1254e5b9057"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/images.ts:397 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/images.ts:464 \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":"invokeai/frontend/webv1/src/services/api/endpoints/images.ts"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef31c6d1325d2d7fcdc0b56aaf4be788db42c946627c8cfff0736291870dda19"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/models.ts:230 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/models.ts:255 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/models.ts"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"771e9f5f461af356ece24d67ec1ad0e591740dde1050835d13e05cddba4ece13"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:515 \u00B7 invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:1008 \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":"invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c492b5614bed75fa05d81227823079f7fad45aa1fcbd82a8f7859961bcb270f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 4 locations): invokeai/frontend/webv2/src/features/fonts/launchpad.tsx:5 \u00B7 invokeai/frontend/webv2/src/features/models/ui/ModelsPage.tsx:6 \u00B7 invokeai/frontend/webv2/src/features/nodes/ui/NodesPage.tsx:6 \u00B7 invokeai/frontend/webv2/src/workbench/settings/launchpad.tsx:6 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv2/src/features/fonts/launchpad.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"27017ea0b6a2b8516fd37674995821cb90b6fc6e65ba7c174c15b522efe4b1c7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/data/backend.ts:1570 \u00B7 invokeai/frontend/webv2/src/features/gallery/data/backend.ts:1594 \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":"invokeai/frontend/webv2/src/features/gallery/data/backend.ts"},"region":{"startLine":1570}}}],"partialFingerprints":{"codehealthFindingId/v1":"82b5ac890417b6bfaf895e3779b20d6a23b95f542456dea1aaf4ea1a7c403e02"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/ui/useGalleryGridHotkeys.ts:257 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/useCanvasHistoryHotkeys.ts:34 \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":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryGridHotkeys.ts"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"700328396d99f9e78f000604817ca2e697ee7c462ae09a621f17ae5336c39bd7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:679 \u00B7 invokeai/frontend/webv2/src/features/upscale/core/graph.ts:408 \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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":679}}}],"partialFingerprints":{"codehealthFindingId/v1":"78821a79e421af60ec0df244a2cdeef348cfaedb9a3a27749c72d60b61aca3ad"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:944 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graph.ts:1429 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":944}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c8871070172bace289c8c27e446a2d63a5711de791e2ad56216e38cbc4b5643"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/settings.ts:178 \u00B7 invokeai/frontend/webv2/src/features/generation/core/settings.ts:202 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/settings.ts"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cce2344ad97a7ba75f46478e2c08f92ad8791084ef47291f04383090d79c7d9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/settings.ts:456 \u00B7 invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx:690 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/settings.ts"},"region":{"startLine":456}}}],"partialFingerprints":{"codehealthFindingId/v1":"27c96ca9b9d374825574131a4868f3f49ed81caf78b54952b51aa01c3c9facb6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/GeneratePresetsPopover.tsx:369 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplatesPanel.tsx:192 \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":"invokeai/frontend/webv2/src/features/generation/ui/GeneratePresetsPopover.tsx"},"region":{"startLine":369}}}],"partialFingerprints":{"codehealthFindingId/v1":"53eabacf93857f580c6cffeb222d84773d7e7366c76f0af0fa94131b291e4aef"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/promptFields/NegativePromptField.tsx:120 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptField.tsx:243 \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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/NegativePromptField.tsx"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb7a1574e2f3d404c4fb5becde2465d6db8242b10d149ab4270e9adc1044bd8a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx:802 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx:900 \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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx"},"region":{"startLine":802}}}],"partialFingerprints":{"codehealthFindingId/v1":"c48735a7da5acd8b017c42067eea7e01fb90970e3122cff7181217bf6404d2d8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx:978 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplatesPanel.tsx:303 \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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx"},"region":{"startLine":978}}}],"partialFingerprints":{"codehealthFindingId/v1":"78909881383502a9a2d7c2ce3d833f6901890f5189d1bce39236147b33311154"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageControls.tsx:341 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageControls.tsx:386 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageControls.tsx"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"f675c3175898e50d72d81980c5c80b1eb3a621c0c26dc2f984930bfd1c2beede"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx:482 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx:515 \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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffbf24590aa1999f714993803227e07dc2487642b5c366460d074703fdd21c4c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx:540 \u00B7 invokeai/frontend/webv2/src/workbench/shell/AlphaNoticeDialog.tsx:33 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/MissingFontsDialog.tsx:101 \u2014 the 3 copies are spread across 3 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx"},"region":{"startLine":540}}}],"partialFingerprints":{"codehealthFindingId/v1":"21b66c400a7bf2454b49e39454999637e42b6de6279abc64db363fddb59a8f67"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/ui/credentials/ExternalProviderKeyCards.tsx:217 \u00B7 invokeai/frontend/webv2/src/features/models/ui/credentials/ExternalProviderKeyCards.tsx:253 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/credentials/ExternalProviderKeyCards.tsx"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"3856d956298ff8dc51767ccc86b67d147039ca1d5e091895702ec48ca0d2b231"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/video/core/graph.ts:762 \u00B7 invokeai/frontend/webv2/src/features/video/core/graph.ts:976 \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":"invokeai/frontend/webv2/src/features/video/core/graph.ts"},"region":{"startLine":762}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a9d8e9af71890c014e0346c3b71e85897cba3eaf16641008c886970ff2151ce"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/core/callSavedWorkflow.ts:344 \u00B7 invokeai/frontend/webv2/src/features/workflow/core/callSavedWorkflow.ts:374 \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":"invokeai/frontend/webv2/src/features/workflow/core/callSavedWorkflow.ts"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"588784a42523214e7de67ac627cac8bbf8f07ec8ccb5d77797488af1e544db21"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/core/document.ts:999 \u00B7 invokeai/frontend/webv2/src/features/workflow/core/document.ts:1013 \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":"invokeai/frontend/webv2/src/features/workflow/core/document.ts"},"region":{"startLine":999}}}],"partialFingerprints":{"codehealthFindingId/v1":"c94146dabf78005467d9c236f56f86af0f99ba33867dda9bf31c137bbb123d74"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts:348 \u00B7 invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts:477 \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":"invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"44dea6b99773a32b32aff0e980d7b1916b0a64ecb42158a889c6a5f3533d54af"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts:370 \u00B7 invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts:518 \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":"invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f1f41b62507f78fce39297975bbcebfbd3c1ba4bfff75d958eb49ad5e69774e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (11 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/PendingLibraryWorkflowLoader.tsx:91 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/library/useOpenLibraryWorkflow.ts:133 \u2014 the two spans are one implementation copied and then locally edited \u2014 50 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":"invokeai/frontend/webv2/src/features/workflow/ui/PendingLibraryWorkflowLoader.tsx"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1fc865a3293fec126f973c214db402f06bf46456e6e5e29b4044adf31b277ea"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx:426 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx:492 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":426}}}],"partialFingerprints":{"codehealthFindingId/v1":"380892a145df79f5e192063bd85132ae42717afc76d768bc5aa46a6c6f223e41"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/platform/react/useModifierHeld.ts:17 \u00B7 invokeai/frontend/webv2/src/workbench/shell/topbar/QueueCluster.tsx:179 \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":"invokeai/frontend/webv2/src/platform/react/useModifierHeld.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"6985abeb50784b315fec2d0cee37d19e6b2c2b19faf69e117b652d04db319fd5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3 locations): invokeai/frontend/webv2/src/platform/state/externalStoreCore.ts:85 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/engineStores.ts:382 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/engineStores.ts:426 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/state/externalStoreCore.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"10d464e3c6159f6f5d9d712356236d826a80663b2464119e794b78d190e92655"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/platform/ui/theme/system.ts:222 \u00B7 invokeai/frontend/webv2/src/platform/ui/theme/system.ts:234 \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":"invokeai/frontend/webv2/src/platform/ui/theme/system.ts"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ea14da1286692c40abab54edd0804e7d2c75cde2135fc6f24aff28b01462071"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/booleanMergeController.ts:61 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts:232 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts:390 \u2014 the 3 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/booleanMergeController.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"37302cd9e503d3504a23209df222660d48e48d830d008f9bc18dc2eb1831f1de"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/controlPixelController.ts:68 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/selectionPixelController.ts:44 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/controlPixelController.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf78835a17c67f80941f148013e258b3fbfc82cd4a83aa00f4607d5581792fe2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/cropLayerController.ts:61 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/extractMaskedAreaController.ts:97 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/cropLayerController.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"b76c7ad8bd959904b5f8d1e7167a3864bdb1c980381e1442795eb73fadfa375a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/extractMaskedAreaController.ts:188 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts:272 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts:429 \u2014 the 3 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/extractMaskedAreaController.ts"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7d52583b9c05609320e7ea2a16e330c747b9464800ce3203c79656680b00533"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/textEditingController.ts:58 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/engineStores.ts:656 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/textEditingController.ts"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"e504bc47e23dac1fb958f67aecd57155b955713d72fa6722633077e8ad2766b3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts:666 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts:803 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts"},"region":{"startLine":666}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f675d822b298ebde6847047f90d5bb9d69100052a4f9185f866f7825bdf39c8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/tools/bboxTool.ts:155 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/marqueeTool.ts:126 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/bboxTool.ts"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"560258e583fa29ceaff1a16d32f7a5a1ba528a57d21eb9868bfdd38567143ef2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-operations/createCanvasEngine.ts:179 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/createCanvasEngine.ts:308 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/createCanvasEngine.ts"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ef2d6f6b8c1e00f7c81cc78e6a2ad6ec06d8743c049c2874809d2eb82d8d910"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/canvas-operations/operationController.ts:107 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/operationController.ts:126 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/operationController.ts:178 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/operationController.ts"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"897f0ecc4decaa360fcdb0a0db239dfc9b9bf1d8348164bf0a758b204509f75f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/videoRecallRuntime.ts:210 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/videoRecallRuntime.ts:241 \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":"invokeai/frontend/webv2/src/workbench/image-actions/videoRecallRuntime.ts"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"24cc7d25b6d555137162bb171d164a9217417ec3b96134564a5226011adc744a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/api.ts:309 \u00B7 invokeai/frontend/webv2/src/workbench/projects/api.ts:349 \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":"invokeai/frontend/webv2/src/workbench/projects/api.ts"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"00c8389ed10ce6cbd4b0bb7b7eaf36864047aa378fdd32b641f3be657734085f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:1444 \u00B7 invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:1501 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":1444}}}],"partialFingerprints":{"codehealthFindingId/v1":"04118a0349493ced5ef471b7109d87e1011eed5daae5c23c70c902f97936c397"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/workbenchDatabase.ts:184 \u00B7 invokeai/frontend/webv2/src/workbench/projects/workbenchDatabase.ts:202 \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":"invokeai/frontend/webv2/src/workbench/projects/workbenchDatabase.ts"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"d308a1e53a0982e6def35c22b5f1fac52a5a91e0895a1e7c124a4a63749befed"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 4 locations): invokeai/frontend/webv2/src/workbench/settings/store.ts:260 \u00B7 invokeai/frontend/webv2/src/workbench/settings/store.ts:306 \u00B7 invokeai/frontend/webv2/src/workbench/settings/store.ts:349 \u00B7 invokeai/frontend/webv2/src/workbench/settings/store.ts:376 \u2014 all 4 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/store.ts"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa74b39ca13cb244fbc7596f92a93e0d76c601af5926c38e7d8ded830b6ca272"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/shell/CenterArea.tsx:332 \u00B7 invokeai/frontend/webv2/src/workbench/shell/topbar/ProjectSwitcher.tsx:262 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/shell/CenterArea.tsx"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"3223dd535e702077f3a8529225c88ef306c3f9b2136fe60c1089493d2216cf30"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetStrip.tsx:617 \u00B7 invokeai/frontend/webv2/src/workbench/shell/topbar/ProjectSwitcher.tsx:271 \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":"invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetStrip.tsx"},"region":{"startLine":617}}}],"partialFingerprints":{"codehealthFindingId/v1":"2aceed5699c9716c7cbaf5ccda3e356ba2f4e01874f2ff95f72868028ea24989"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgetPlacementCommands.ts:128 \u00B7 invokeai/frontend/webv2/src/workbench/widgetPlacementCommands.ts:163 \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":"invokeai/frontend/webv2/src/workbench/widgetPlacementCommands.ts"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0946e74317d288025cb60d6b6326562e417ea8fe2f4a9b4286c2ebc68c2a66e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/widgets/autosave-status/manifest.ts:5 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/queue-status/manifest.ts:5 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/server-status/manifest.ts:5 \u2014 the 3 copies are spread across 3 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/autosave-status/manifest.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"58a5b626b49fb36d85753307cddb303dec4581270bba10b604abdc29825e0fe0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapPlot.tsx:421 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapPlot.tsx:442 \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":"invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapPlot.tsx"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"12a654dccaadad2a33d23f99cd0ef6cbb8175c504473f81d562211fce814b225"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/LayerGroupContextMenu.tsx:293 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerGroupContextMenu.tsx:346 \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerGroupContextMenu.tsx"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"37dc04895d9649dab9ee4a780ff31fa6edfad317d11eecc9fd732d0145fad47b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRegionSettings.tsx:104 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/RegionalGuidanceSettings.tsx:245 \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRegionSettings.tsx"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"7350f9089a16aef44b6ecadcc8ae94aea9399d443ba45ca231d4f774db1128eb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRow.tsx:449 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRow.tsx:470 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRow.tsx"},"region":{"startLine":449}}}],"partialFingerprints":{"codehealthFindingId/v1":"020fae6b4c304cc34d9c538f3d6e7d2f043a2b5c2bcab82363fe8cb6d917cf3e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/panes/ColorPane.tsx:293 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/panes/SwatchesPane.tsx:168 \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/ColorPane.tsx"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f3dd275b1779c43821b1ed1ba67f086d0d3054d1d5800728a9ddc0b34a6e571"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/panes/PropertiesPane.tsx:30 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/panes/TransformPane.tsx:40 \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/PropertiesPane.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"5787b035fcb49b90c331b2023e5bda52cbf3057660642518e73c77a6cf8a0728"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterControlMode.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/IPAdapterMethod.tsx:8 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/FLUXReduxImageInfluence.tsx:5 \u2014 the 3 copies are spread across 3 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterControlMode.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"59afc21f307b0eedc6ea2f409a6d5085be950f4de3ece73c8ac2180dafd088b0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx:137 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx:192 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c4572621949f006d1c48772d123cc85b877eed1d924a4d4e2964d08390fb641"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx:211 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/TextEditPortal.tsx:44 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"def2b5fc46bb02cf993bdc2936d85378029dcf7801e1addd69c14ef6b153c731"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbar.tsx:66 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbar.tsx:76 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbar.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7049aeb24dd6e8526de4e8d4d928c8b4bc169a0e158c631780b568c3e26a54d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarRedoButton.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarUndoButton.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLoadWorkflow.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSwapDimensionsButton.tsx:6 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarRedoButton.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"3044173bec20d50f3bacdf50ec684b5c097a402e14111fdc64888b8aae09153d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityDeleteButton.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityEnabledToggle.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityIsLockedToggle.tsx:14 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityDeleteButton.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"82b2612378615c9aa498a834df5031121d6c538026d0d2a65295c97c117382dc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsArrange.tsx:22 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsArrange.tsx:32 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsArrange.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"b27fd89f2426b8f1df4f0db56f865f2413b9256636e30ff08042da367ea0a31d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsCopyToClipboard.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsCropToBbox.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx:15 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsCopyToClipboard.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"970db396260f0f22c88ef352c6fcf791b54c9a1ff1be22b0656fbbf6eaaea049"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsFilter.tsx:3 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsSelectObject.tsx:3 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemUseAsPromptTemplate.tsx:3 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsFilter.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3c3b5c7814b8d6b6e9a76079c019a673f1fb688229ade70b70e41e33e36b79a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsRunWorkflow.tsx:4 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemChangeBoardVideo.tsx:4 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSendToUpscale.tsx:7 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsRunWorkflow.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"27596b17e7481e6dfc176ad1160644d3bdde1df67fec6e0988f0664351864917"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/hooks/addLayerHooks.ts:251 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/hooks/addLayerHooks.ts:262 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/addLayerHooks.ts"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fac1104250500647eaaf05088e21c5c0b36bcac46011a3a3acbf4f52b5ba27a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts:170 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts:203 \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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b413f009a9e69f4239236443d51e8e007bc7f2c8ec7fefed819972c8ca9b9ed"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (10 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasBackgroundModule.ts:57 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts:240 \u2014 the two spans are one implementation copied and then locally edited \u2014 84 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasBackgroundModule.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"887aa2a5b6b81117d36e3b65428393ece36dfbf153a81b6ed099db3ea954c733"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (10 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasBackgroundModule.ts:57 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts:199 \u2014 the two spans are one implementation copied and then locally edited \u2014 69 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasBackgroundModule.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"20e3bb8d27ad4c055a4369f5d83c1ddfc7d3fffd68ef5c16447d16782eb576c9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (10 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositionGuideModule.ts:79 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts:161 \u2014 the two spans are one implementation copied and then locally edited \u2014 96 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositionGuideModule.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"5edb700a1eb498919125d979e73b8839bb1765fa2e402b93620c86d8daf17dba"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts:516 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectGradient.ts:145 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectRect.ts:74 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts"},"region":{"startLine":516}}}],"partialFingerprints":{"codehealthFindingId/v1":"94d51d5a80d74b7f40da9163f722c745b843e4ecdb19ef7fb42646df45c4022a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (10 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntityRendererModule.ts:39 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBboxToolModule.ts:180 \u2014 the two spans are one implementation copied and then locally edited \u2014 103 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntityRendererModule.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"f64c0802647492976a8452002be3369c8beaeac0b731a9a85716695ef386e0c7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 7 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:327 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts:69 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasColorPickerToolModule.ts:154 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts:51 \u00B7 \u002B3 more site(s) not listed \u2014 the 7 copies are spread across 7 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5450ad12b26fb0ac117fab1d7aa93bd53b7d16c8c72bd8c47660135928e1ca8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:397 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:434 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"f173f329727368bb71a3198639477e204a1209ad271b8f6beb6dd9bcbf45d810"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:670 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:709 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts"},"region":{"startLine":670}}}],"partialFingerprints":{"codehealthFindingId/v1":"82d22aa9fe08af8f8a8f2d56fc35cb482c7722d7e02aaeb837ffaa0309c423d2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStagingAreaModule.ts:62 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasWorkerModule.ts:16 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStagingAreaModule.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d7f3228ed3cd5bdc633839f57a7778da9edf339c28c2c6a67f660f8c9e02f17"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasGradientToolModule.ts:22 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasViewToolModule.ts:15 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasGradientToolModule.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"dad09aaa0799ac644189060c4a52ebe46f7ae0eb53406583ff2a6b63d63ef6f8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts:245 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts:436 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"f84ffbc46282bbfadddc0cf489ca9d3eedf03cebc0721812e29d9b10db4db8e3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts:529 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts:562 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts"},"region":{"startLine":529}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee84da9e95b18fd4964e1d8872b7521816dcacdecbfa6e32e87346798c2c6b19"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (10 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/filters.ts:33 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/filters.ts:174 \u2014 the two spans are one implementation copied and then locally edited \u2014 65 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/filters.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"dca35b1a3e4b8675fea414b10925a5a8e2174862ba4822f520151126bc16abf5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:353 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:426 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:494 \u2014 all 3 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":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3fe3ae97b8f8508ba4b627496c20fc88114821dd7303eb5dd3d6e9f57854f17"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:371 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:382 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"073a3cf152b704c07c42d075f11ee7aed6bb1081b6fe5dd5f87233a480fbc7b8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts:314 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts:330 \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":"invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"c98f1cdb9612dd44c94ea24ad0eea062378135d51927616eddc5cf21f192ad9b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx:86 \u00B7 invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx:97 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"13642ab5ea008a345dc5b4860f9013247774d7ae644f62fedb2a4fc79f411a83"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx:13 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/useGallerySearchTerm.ts:11 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowSearch.tsx:15 \u00B7 invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetSearch.tsx:12 \u2014 the 4 copies are spread across 4 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 4 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"13f4ac00602a32118cdb3f0ce57048cf0060db241be61ccabd69533b1fa0ce1e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx:64 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx:92 \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":"invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"e59b3449f16acd2c2cf96e7171773a2e30738fd7e395328cb11013c49bcfb2a1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGridPaged.tsx:115 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGridPaged.tsx:127 \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":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGridPaged.tsx"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"d10e57836e0d81f297400534402a0800680473e4f31cd53378ac0cc0cd6987d8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSideBySide.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/EditModeLeftPanelContent.tsx:13 \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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSideBySide.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ee2b8878782b7f18ad1423140d4686217333dd8e9c7ffcad713ed5f892bca31"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/NoContentForViewer.tsx:128 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx:99 \u00B7 invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx:68 \u2014 the 3 copies are spread across 3 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/NoContentForViewer.tsx"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"839ac8de7dbce9e1a07ce3ba65e65d0fb6f97e75562bf55303010b310ac49576"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:761 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:779 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:797 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:815 \u00B7 \u002B2 more site(s) not listed \u2014 all 6 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":761}}}],"partialFingerprints":{"codehealthFindingId/v1":"482780c3c6f32165ebfaba4cc34cc8e68668b71af55d8a9564e1cdfd3c3028db"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/ControlAdapterModelDefaultSettings.tsx:37 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/CpuOnlyModelSettings/CpuOnlyModelSettings.tsx:71 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx:72 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/ControlAdapterModelDefaultSettings.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a041551180de5f60117389d5ac934643f4bd619207c0832d0e0363f588ae797"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/RelatedModels.tsx:287 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/TriggerPhrases.tsx:91 \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/RelatedModels.tsx"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"354f0c48e3004ed558be54ff8f9f776358d0f556a5be36e7859177d6a5358ad2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/context.tsx:157 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/context.tsx:167 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/context.tsx:177 \u2014 all 3 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/context.tsx"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"e512774662ce7ee154667ba0d46d8dbc5180596a138a4966446c7055b0964f22"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/VideoFrameIndexFieldInput.tsx:143 \u00B7 invokeai/frontend/webv2/src/features/video/ui/TrimBoundThumb.tsx:46 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/VideoFrameIndexFieldInput.tsx"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"62fb3882de428bab5e7d6a8e18f55e340061e93d26881791d481d982431961d7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementEditMode.tsx:69 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementViewMode.tsx:82 \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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementEditMode.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"07bbd1a2fd363788666744c62268a52df4da22cbd63aeb4bc1b8b92fd8ba2396"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts:260 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts:302 \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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd3bffd884ac7257bbcf63597e6d9aa9b95987193aeba4949901ac33597bd778"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/hooks/useNodeIsIntermediate.ts:1 \u00B7 invokeai/frontend/webv1/src/features/nodes/hooks/useNodeNotes.ts:1 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeIsIntermediate.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"873bc386aef2971b4a2c2ca66ac069fa8852b5cfd265fefc3a05bfb4e0d6a793"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (10 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/buildNodesGraph.ts:136 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/node/resolveBatchValue.ts:29 \u2014 the two spans are one implementation copied and then locally edited \u2014 65 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildNodesGraph.ts"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bd9f54f3a7f070ec97b4b1c268fa021d68482d7e9037ecead03b62ba7d5b79f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts:23 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts:54 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts:46 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b19d91da19a64a5046bc843dddfbe277ba724143e56aee9ffc7612c33964124"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts:294 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts:165 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts:314 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6afd1c79447d6ba8036fe528e645cd4a3c02bce1fb70afbd21822d911a481a9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts:125 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts:270 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc41438961449cca0739d7fd183b2942f765cded3011cff6b483945f54aa2c03"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (10 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addTextToImage.ts:69 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts:135 \u2014 the two spans are one implementation copied and then locally edited \u2014 62 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addTextToImage.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"717e5537741959065b3eaa97a7328f17131df2fabd89ff9fae816c84304efe55"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx:61 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx:88 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a44a5c555826a4aac7449e5d166029625ade18efe0d363db961b0884e635534"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (10 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx:202 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx:249 \u2014 the two spans are one implementation copied and then locally edited \u2014 57 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":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cfdc897baefdf0a2a94317c935ff5317705429c6d39349402adc941370cf8ee"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/components/InvocationCacheStatus.tsx:16 \u00B7 invokeai/frontend/webv1/src/features/queue/components/InvocationCacheStatus.tsx:26 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvocationCacheStatus.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"75f062e5b8d5f58539ac4accbc6ddeae4a1835fa389ba73f794ce1dd0d085e77"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/store/readiness.ts:497 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1285 \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":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":497}}}],"partialFingerprints":{"codehealthFindingId/v1":"963cdca6096c6931d6bf6b5c003277b2579b75563c7c08fe44bd13e06cc27263"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx:72 \u00B7 invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx:66 \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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a6f8a06658f19092ce4be64b607fbd28fb337008335a528af2fc0e37077a7e5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/ui/layouts/CanvasTabLeftPanel.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/GenerateTabLeftPanel.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/UpscalingTabLeftPanel.tsx:6 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasTabLeftPanel.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"17ca52ce5c182ad251baf0f62db80841b076387d3518c0c4216263d18b6e0704"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useDownloadCurrentlyLoadedWorkflow.ts:11 \u00B7 invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useDownloadWorkflowById.ts:25 \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":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useDownloadCurrentlyLoadedWorkflow.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"9453b2ae56060bc0cbf2d1dd78b0c4c3117b932c95775fb630d00561c34f2afc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/gallery.ts:18 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/videos.ts:30 \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":"invokeai/frontend/webv1/src/services/api/endpoints/gallery.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cc01fa6c6317a29738fd2125d6e602ff62c4c980baf86e748300d0605462e28"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/images.ts:544 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/images.ts:590 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/images.ts"},"region":{"startLine":544}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b02fbc71df07ce595a2f0811c5bb2f5f96f97d12619e7608c6c7b1d436f9b6c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv1/src/services/api/hooks/accessChecks.ts:16 \u00B7 invokeai/frontend/webv1/src/services/api/hooks/accessChecks.ts:32 \u00B7 invokeai/frontend/webv1/src/services/api/hooks/accessChecks.ts:48 \u2014 all 3 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":"invokeai/frontend/webv1/src/services/api/hooks/accessChecks.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"8945ee002d20406d22d65bbf9e55fa4e01137a172de2acd28bf2805098020394"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/events/setEventListeners.tsx:273 \u00B7 invokeai/frontend/webv1/src/services/events/setEventListeners.tsx:289 \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":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffed2bb8ae09af3526cb244e182a82d9355ebcc4d50fbf0c975b0b397094f59f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/events/workflowExecutionCoordinator.ts:161 \u00B7 invokeai/frontend/webv1/src/services/events/workflowExecutionCoordinator.ts:183 \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":"invokeai/frontend/webv1/src/services/events/workflowExecutionCoordinator.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec0791a6c94e4295129a49ebdfc85019114274ead8f12f2fc3fed2f44de69717"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/mock-backend.mjs:463 \u00B7 invokeai/frontend/webv2/src/features/queue/data/queueServer.testing.ts:49 \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":"invokeai/frontend/webv2/scripts/mock-backend.mjs"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f2ed7e80ec3805cd49ab0d0ac8add2a69538e6ea751765c3e3b0d2bd9793528"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:50 \u00B7 invokeai/frontend/webv2/src/platform/browser/settleAnimations.testing.ts:10 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"6323c5a696fcd29e672a42b7d02241428c73a8b17d9fb2d5cb5df11ef4e6fecb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:730 \u00B7 invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:940 \u00B7 invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:1261 \u2014 all 3 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":"invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs"},"region":{"startLine":730}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5f5b5219832292cc31a57787716e936742f53a7ccb82e1121c8032827076b38"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4 locations): invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx:345 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerChildMenu.tsx:132 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerGroupContextMenu.tsx:290 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerGroupContextMenu.tsx:343 \u2014 the 4 copies are spread across 3 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a5434471859359f032b9085129ab88cbba8030376ef86f70094b7863784a43e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:226 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graph.ts:1054 \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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"990b965dc1cfa91dbf704a733ab4237f41548ccb185d561f577167cc00290e3b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4 locations): invokeai/frontend/webv2/src/features/generation/ui/GenerateAdvancedFields.tsx:354 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/GenerateRenderSection.tsx:169 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/GenerateRenderSection.tsx:190 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/GenerateRenderSection.tsx:208 \u2014 the 4 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/GenerateAdvancedFields.tsx"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdee5ec5396604a5075dbfab384f7f0d6ddd11ac16941bd27cba3bf704c91cef"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/GenerateRenderSection.tsx:399 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/GenerateRenderSection.tsx:410 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/GenerateRenderSection.tsx"},"region":{"startLine":399}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a607e8ef4c4b169d1704ad81dbec69bf11494638dbdaa927e4a403ca1e0cb64"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx:462 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx:719 \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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"a87b4fa203791ac537f6ed78bad93f532f7eb558893289cc3b3d639d97e3b35a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx:477 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx:728 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx"},"region":{"startLine":477}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aa1e58ad64c04ed1a8c20bd78d41dd0aab200270c4f94979922c85d088e3bbc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardTransferActions.tsx:208 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardTransferActions.tsx:229 \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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardTransferActions.tsx"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e6783e2ce4b004e76d27f0417ff4e3060470bfc794c8ecac60fb2d11ffcf6db"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx:514 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/ReferenceImageSettings.tsx:115 \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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5d072e3d43a4748f358620a6400a680f780109cf26e53f0304105395fa702ed"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/generation/ui/shared/ConceptRow.tsx:294 \u00B7 invokeai/frontend/webv2/src/features/models/ui/library/ModelRowContextMenu.tsx:38 \u00B7 invokeai/frontend/webv2/src/features/models/ui/shared/InstallSourceMenu.tsx:94 \u2014 the 3 copies are spread across 3 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/shared/ConceptRow.tsx"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d7dd0ab4463532f025493e100c5b854eb19743c26ddd16580b014d64a9b62d3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/models/data/fp8StorageSupportStore.ts:66 \u00B7 invokeai/frontend/webv2/src/features/models/data/modelsStore.ts:99 \u00B7 invokeai/frontend/webv2/src/features/nodes/data/nodesStore.ts:67 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv2/src/features/models/data/fp8StorageSupportStore.ts"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d1a71559717def530e773b4f3880e7d517f42078205aaccc4edb388f65372b9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/data/installsStore.ts:162 \u00B7 invokeai/frontend/webv2/src/features/models/data/startersStore.ts:55 \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":"invokeai/frontend/webv2/src/features/models/data/installsStore.ts"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"626f0fc45d3ea21baffe187e642d751f90c3ecf5e13680c1c9bf6297b0dfda80"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/data/transport.ts:3 \u00B7 invokeai/frontend/webv2/src/features/nodes/data/transport.ts:3 \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":"invokeai/frontend/webv2/src/features/models/data/transport.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e6f85993d11586336a98bd9cb5e92530c6eb2d1441cda7aab12cc1328b24396"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/ui/add-models/StarterList.tsx:163 \u00B7 invokeai/frontend/webv2/src/features/models/ui/detail/RelatedModelsSection.tsx:163 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/add-models/StarterList.tsx"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"b45476d01e4e06f4297fa48306337cbaa8e5ef34303ece7f48fa550b14943278"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4 locations): invokeai/frontend/webv2/src/features/models/ui/detail/ModelEditForm.tsx:223 \u00B7 invokeai/frontend/webv2/src/features/models/ui/detail/ModelEditForm.tsx:238 \u00B7 invokeai/frontend/webv2/src/features/models/ui/detail/ModelEditForm.tsx:256 \u00B7 invokeai/frontend/webv2/src/features/models/ui/detail/ModelEditForm.tsx:295 \u2014 all 4 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/detail/ModelEditForm.tsx"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc401f5528fcb64a55cfacbf36672a744dd43044874df882c925da314b40b263"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (10 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/ui/shared/ModelActionsMenu.tsx:58 \u00B7 invokeai/frontend/webv2/src/features/nodes/ui/library/NodePackContextMenu.tsx:63 \u2014 the two spans are one implementation copied and then locally edited \u2014 95 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":"invokeai/frontend/webv2/src/features/models/ui/shared/ModelActionsMenu.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"65f78a88a34e019293d3246f38a866f15a536070db7584259bfc99c33f8cd920"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/core/promptBatch.ts:60 \u00B7 invokeai/frontend/webv2/src/features/queue/core/promptBatch.ts:91 \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":"invokeai/frontend/webv2/src/features/queue/core/promptBatch.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"316b9b8c51dcb52fbccfe1ea2acb23a89def72e8efecdda875cc3db3838fa8c8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/data/generationDevicesStore.ts:79 \u00B7 invokeai/frontend/webv2/src/features/queue/ui/modelCacheStore.ts:87 \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":"invokeai/frontend/webv2/src/features/queue/data/generationDevicesStore.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"027b9a4b5c7e333a896e18e9ae34a68aea4bceefdd4f1a11309210503f0a3f43"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/ui/CancelQueueItemButton.tsx:24 \u00B7 invokeai/frontend/webv2/src/features/queue/ui/QueueHeaderActions.tsx:42 \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":"invokeai/frontend/webv2/src/features/queue/ui/CancelQueueItemButton.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"4251ccb090c88246478b607e660e4f80a48bc9607e47ccfd1a90b7772f87191f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx:600 \u00B7 invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx:611 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx"},"region":{"startLine":600}}}],"partialFingerprints":{"codehealthFindingId/v1":"728d1b773e7b84bdb116a8fe1528180c17e61f9571001fc2f76feb0be5920bd3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts:440 \u00B7 invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts:677 \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":"invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts"},"region":{"startLine":440}}}],"partialFingerprints":{"codehealthFindingId/v1":"673d3b853daa9e7a844d2496a41a2b9785527eb2ebe93571b334f3f490f44863"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/core/validation.ts:222 \u00B7 invokeai/frontend/webv2/src/features/workflow/core/validation.ts:254 \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":"invokeai/frontend/webv2/src/features/workflow/core/validation.ts"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"b07426891eaa8e29e3a762b642da15a5ffec1d834ee23d487531ff62dc617ccd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/editor/AddNodeDialog.tsx:173 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/editor/AddNodeDialog.tsx:516 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/AddNodeDialog.tsx"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"31514a31066d6872119702fafad9795bdc12d7c0ff3b98c5f7e708e2f29d968c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (10 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/editor/AddNodeDialog.tsx:653 \u00B7 invokeai/frontend/webv2/src/workbench/palette/usePaletteNavigation.ts:153 \u2014 the two spans are one implementation copied and then locally edited \u2014 53 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/AddNodeDialog.tsx"},"region":{"startLine":653}}}],"partialFingerprints":{"codehealthFindingId/v1":"594db82ed9bc1974a45db70194786684be70a33ff06c6ecd2ed158112e8d3875"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/editor/flowAdapters.ts:154 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/editor/flowAdapters.ts:168 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/flowAdapters.ts"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"89cb26d18fd6fa227bd176bea7ae03e3750f2c301e5d140514b648476762726c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/fields/NumericInput.tsx:205 \u00B7 invokeai/frontend/webv2/src/platform/ui/SliderNumberField.tsx: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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/NumericInput.tsx"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"299f17b4ecf08e3dbc8772c31ea02745e0fa2bd482daa7902c52f26ad847dbf8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx:1275 \u00B7 invokeai/frontend/webv2/src/platform/ui/settings/SettingControl.tsx:40 \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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":1275}}}],"partialFingerprints":{"codehealthFindingId/v1":"f41699a21f330b0ea4f0d8b77943856cac9af11f3670284724542005712c6ae9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowPublicationHost.tsx:527 \u00B7 invokeai/frontend/webv2/src/workbench/projects/components/OpenProjectDialog.tsx:182 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowPublicationHost.tsx"},"region":{"startLine":527}}}],"partialFingerprints":{"codehealthFindingId/v1":"e17714e082c2745342566385ca4b3f2b00e27d0137ab1a0163a0caf230ba0af1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/booleanMergeController.ts:139 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts:312 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/booleanMergeController.ts"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1e249f795ebce4ced7f195694b37c67007a4f37d732ba8bf96a1876885ef591"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/copyLayerController.ts:48 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/cropLayerController.ts:64 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/extractMaskedAreaController.ts:100 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/copyLayerController.ts"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"f230bd4234273669d2d23cb5d9deafae4cf5b253572bf674d3051f414742aca4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/filterResultController.ts:105 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/selectionImageController.ts:58 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/filterResultController.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cfb08a56b9e73316a66e446cd73f6c6c121bc0ee8839d0e99a82862cfcefa34"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts:124 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts:176 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ce027e729cad525bd334ada8eb014beaa3b7720daa7317af68a9db37353e909"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/textEditingController.ts:76 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/TextOptions.tsx:126 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/textEditingController.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"1427eb9e401ca771ed76b37554df940abe14947c45995503de998c2d8104a498"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts:1374 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts:1397 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts"},"region":{"startLine":1374}}}],"partialFingerprints":{"codehealthFindingId/v1":"b432eee237b50a59a58caeda43a14583e1e67a25736123c4c6267faac10baad5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterComposite.ts:87 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/generationCompositePlan.ts:89 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterComposite.ts"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bc92ab29fb21d2eac5e3c62f9e46913ff57d82d4aaf54fa3b733918bb824eef"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionOps.ts:42 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionState.ts:371 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionOps.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"d865d48973a5d1c0e522551a3f65121b5b39967e572880fb5d1f9d11c33484dc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/tools/bboxHitTest.ts:310 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/bboxHitTest.ts:320 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/bboxHitTest.ts"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"18d2a2b2bf5184bca2ab1de37320f4ed674f314cf39edff2e17e31dece6b390a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/tools/bboxTool.ts:124 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/gradientTool.ts:93 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/transformTool.ts:273 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/bboxTool.ts"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"2161743c5ea8b312d5a0151b4c5c877691aa99ef0de5c83ff945880ae4c633db"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/tools/gradientTool.ts:199 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/shapeTool.ts:275 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/gradientTool.ts"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"c881d1e23a4b554e69d69465bb7a595030be7e22ba0dbe6ce4135f99721916d4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/diagnostics/DiagnosticsPanel.tsx:298 \u00B7 invokeai/frontend/webv2/src/workbench/diagnostics/DiagnosticsPanel.tsx:308 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/diagnostics/DiagnosticsPanel.tsx"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"b22ae688ec918d43b150abc5f8ef6e85a96060dbcbe0555dcb417546e49100a4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/hotkeys/firstPartyCommands.ts:429 \u00B7 invokeai/frontend/webv2/src/workbench/hotkeys/firstPartyCommands.ts:440 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/hotkeys/firstPartyCommands.ts"},"region":{"startLine":429}}}],"partialFingerprints":{"codehealthFindingId/v1":"1155aa1fbef5c6e94449ff52fda643a497d0e4f21148b10b2b14ba2b1f07bb02"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts:869 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts:888 \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":"invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts"},"region":{"startLine":869}}}],"partialFingerprints":{"codehealthFindingId/v1":"e92a221f00455759672401130a9e949cd08a2d49228dec8d8007c9c8374d0b6e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-map/api.ts:99 \u00B7 invokeai/frontend/webv2/src/workbench/image-map/api.ts:176 \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":"invokeai/frontend/webv2/src/workbench/image-map/api.ts"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c4352a6019bf158fb1796d5ed60bb6277ef1430963a46248d149dd5f858d585"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (10 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-map/imageMapStore.ts:285 \u00B7 invokeai/frontend/webv2/src/workbench/image-map/imageMapStore.ts:375 \u2014 the two spans are one implementation copied and then locally edited \u2014 52 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":"invokeai/frontend/webv2/src/workbench/image-map/imageMapStore.ts"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1a0b820321218a1dc05f3b57d53b3aa3ca7fb8543f62ec9193daff388e5e1c2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/palette/paletteProviders.ts:319 \u00B7 invokeai/frontend/webv2/src/workbench/palette/paletteProviders.ts:348 \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":"invokeai/frontend/webv2/src/workbench/palette/paletteProviders.ts"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef77b0b0a14e0d0c552d44b208d2c12c9dcf8a182c6085d5e1194fcd6261bdbf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/components/ProjectFileOptionsProvider.tsx:96 \u00B7 invokeai/frontend/webv2/src/workbench/shell/PasteMediaRuntime.tsx:62 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/components/ProjectFileOptionsProvider.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a58c771026b906bde7ac753e0824fbfdb4ebc4529a425add6b47b3d4094c232"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:312 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:478 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"176eec98c762cfd867fdead5bd8e9e9895ccaca1236b2ebe4e55522cab175a79"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:410 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:431 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:462 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:582 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8072a39db6acb6fdc24680794e81a433e588ccd8c971fcde5cc1d2d593cb7f7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:597 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:800 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts"},"region":{"startLine":597}}}],"partialFingerprints":{"codehealthFindingId/v1":"50ce368203fe8c0683bceafd21ebaee124771e7aef5048200493026399f3441b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.ts:1311 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.ts:1476 \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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":1311}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1c7b192edcdc8984383ee65e2cbf8d3cd0e601aefee69ddd8b0ef0765f053a7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:1099 \u00B7 invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:2109 \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":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":1099}}}],"partialFingerprints":{"codehealthFindingId/v1":"f23263bc517894b65b2fa25c45dd3837ab255082b47381d466e793fa66272a77"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:1534 \u00B7 invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:1568 \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":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":1534}}}],"partialFingerprints":{"codehealthFindingId/v1":"13242629371e060e9eea5908c450c88feebf628f0f017b91ae1e6514cd936b37"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:206 \u00B7 invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:376 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5122e381032780d9d8a89c32f3827afaeeb11c34980146c8d306a6e3fc7ca2d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:404 \u00B7 invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:1056 \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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed509b10724802be3e8f5cda3142406fda42e3ca0bd16e7af29f8760a0cba3b2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:515 \u00B7 invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:560 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"f11e6da20089ba531f6613c6438473fcacfdcefd7c77a9f57fb483e9a8c186b7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (10 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/library.ts:132 \u00B7 invokeai/frontend/webv2/src/workbench/projects/openProjects.ts:31 \u2014 the two spans are one implementation copied and then locally edited \u2014 55 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":"invokeai/frontend/webv2/src/workbench/projects/library.ts"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"000a01d9a555ee0c4ecbedcdf5216e1f9fd49380bac72f76d5ec0c529d198634"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/queue-integration/queueRecovery.ts:57 \u00B7 invokeai/frontend/webv2/src/workbench/queue-integration/queueRecovery.ts:93 \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":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRecovery.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8972e701c5d1e3406fcdef689ad2f1dd84fe028f959839fdf8b5231cb995872"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasHeaderActions.tsx:148 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasWidgetView.tsx:491 \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasHeaderActions.tsx"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"592ffa8c1600bb05de803ae0437cce4000dbf15652ee905848212bfe90e77bfb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/GradientOptions.tsx:371 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/ShapeOptions.tsx:209 \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/GradientOptions.tsx"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"11e0de361cb16929a7c76a98f0079a991dcb5b5885076df8fd97395a41a4504a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx:413 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/panes/LayerSection.tsx:207 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx"},"region":{"startLine":413}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff401b52af2b46c0ccedadc915cd4bec5bf367c7dcdb1b6b7ff430fddc496cba"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/runLayerWorkflow.ts:132 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/runLayerWorkflow.ts:167 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/runLayerWorkflow.ts"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"2492c4ecca2e290c33b1b0b8431bc6d5c5bfa3d4b4caede69d9f7e3e0690ee2e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:157 \u00B7 invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:312 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"e245733dd2a4df5f0c2c76f0a1de9fa7934dccb91cd5bc0dc9cd499b31918351"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/hooks/useImageUploadButton.tsx:118 \u00B7 invokeai/frontend/webv1/src/common/hooks/useImageUploadButton.tsx:128 \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":"invokeai/frontend/webv1/src/common/hooks/useImageUploadButton.tsx"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5f509987ebdb38f9194bd2a54782dfe860d4e7bf01e24e4a2a6bb2c64590375"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/util/arrayUtils.ts:3 \u00B7 invokeai/frontend/webv1/src/common/util/arrayUtils.ts:26 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/util/arrayUtils.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"fadb6e089c157c05548f8ae628c645bf998c6085d4691f7c48e2c111109c6617"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/util/promptAST.ts:141 \u00B7 invokeai/frontend/webv1/src/common/util/promptAST.ts:200 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/util/promptAST.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"417453092ac8e131ef1ef962550fc4ac542de3efd8760c6afd22ddb19368ebfa"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (9 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/util/retireDefaultServiceWorker.ts:13 \u00B7 invokeai/frontend/webv2/src/platform/pwa/sw.js:24 \u2014 the two spans are one implementation copied and then locally edited \u2014 57 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":"invokeai/frontend/webv1/src/common/util/retireDefaultServiceWorker.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"a30b1f29ab87a7197d8084f78059ebe480e165cf263793b9de0df5a89a6a9bda"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/auth/components/UserManagement.tsx:161 \u00B7 invokeai/frontend/webv1/src/features/auth/components/UserManagement.tsx:371 \u00B7 invokeai/frontend/webv1/src/features/auth/components/UserProfile.tsx:140 \u2014 the 3 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":"invokeai/frontend/webv1/src/features/auth/components/UserManagement.tsx"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"f364c247078a4093cbadba260a9482198c29aac0b477a394aa0c2f4e2e08ab73"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/auth/components/UserManagement.tsx:226 \u00B7 invokeai/frontend/webv1/src/features/auth/components/UserProfile.tsx:192 \u00B7 invokeai/frontend/webv1/src/features/auth/components/UserProfile.tsx:237 \u00B7 invokeai/frontend/webv1/src/features/auth/components/UserProfile.tsx:300 \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":"invokeai/frontend/webv1/src/features/auth/components/UserManagement.tsx"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"eab2f9648368b0f9b9795d264de9b1c4fc9ac0599e3ff33f33014babbc607249"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAutoProcessSwitch.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectInvert.tsx:15 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAutoProcessSwitch.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2e2206448d3a114432a1a951de37c89b23476dd9d5a93564ab68eb5759a21d7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 7 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarDuplicateButton.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarRedoButton.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarUndoButton.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemDeleteVideo.tsx:7 \u00B7 \u002B3 more site(s) not listed \u2014 the 7 copies are spread across 7 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarDuplicateButton.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"762b85e01682fe6668cc5141a1f62689e12b4bd64d9e3bd8934eba9e14e9abcb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasOperationIsolatedLayerPreviewSwitch.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedLayerPreviewSwitch.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedStagingPreviewSwitch.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsOutputOnlyMaskedRegionsCheckbox.tsx:10 \u00B7 \u002B2 more site(s) not listed \u2014 the 6 copies are spread across 6 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasOperationIsolatedLayerPreviewSwitch.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"41d88d9502a00e011b6d5afb05fb327cc0666d3622615d9c21dc235a9a78a175"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx:18 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayer.tsx:17 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMergeVisibleButton.tsx:7 \u2014 the 3 copies are spread across 3 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"dddc520c4e783f9fd78b01c33cf3d62186d689a9523dd545730ae1417fa12473"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterNoise.tsx:33 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorParseStringSettings.tsx:15 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorParseStringSettings.tsx:16 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringGeneratorParseStringSettings.tsx:16 \u2014 the 4 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 4 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterNoise.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"a15a5312aced96510c8814e31dade2dd9b69d58f281e3a02b9fe2b19da47ee7e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerSimpleAdjustmentsEditor.tsx:64 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerSimpleAdjustmentsEditor.tsx:73 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerSimpleAdjustmentsEditor.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d151e44e229408f04ba0f571f69ddcbe8fa177d305d19d6b135aec51f37d8eb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (9 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsInvertScrollCheckbox.tsx:17 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsPressureSensitivity.tsx:13 \u2014 the two spans are one implementation copied and then locally edited \u2014 62 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsInvertScrollCheckbox.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff21276e90bcae397953e4f48a88ed3f1195c4f2b60c6d1468f1e45c75ac49e2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (9 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx:133 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/text/textRenderer.ts:172 \u2014 the two spans are one implementation copied and then locally edited \u2014 65 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a3477cf5d38ddcb24ec96cb721cf257cbb14e312e3e613c2d31b6f5994e35ae"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityDeleteButton.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityEnabledToggle.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityIsLockedToggle.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsDuplicate.tsx:12 \u2014 the 4 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. There is one copy in each of 4 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityDeleteButton.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e375bb6922ec6daaf426c62a5468eb2d918bcc7391a78f568cfae655b907dd9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityEnabledToggle.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityIsBookmarkedForQuickSwitchToggle.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityIsLockedToggle.tsx:7 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityEnabledToggle.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"530ed6fd537b1d0e53ae55cad7d7aea7f003f3963bc85fe17c44d9c1dcc5c105"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityEnabledToggle.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityIsLockedToggle.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsSave.tsx:8 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityEnabledToggle.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d686f1fd1dc6c4db0637c8b8887a1696aeaace05ee694e58351f8ecdc36d776"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMergeVisibleButton.tsx:5 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceResultItem.tsx:2 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMergeVisibleButton.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb64cbddc9f7229eb9073089a8be8839d69ba7d6b9ac839cb58fb3e32438028e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/hooks/useNextPrevEntity.ts:13 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/hooks/useNextPrevEntity.ts:27 \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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useNextPrevEntity.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"db1dc4dc837956f8fe7c33a8b24e6f319b7ced933ef8316dae9ff91b4e7ebe5e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (9 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasBackgroundModule.ts:55 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCacheModule.ts:96 \u2014 the two spans are one implementation copied and then locally edited \u2014 64 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasBackgroundModule.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbddeea341e636aaf900dd9b542c437179a10e804a010e10313faa734f072f5f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (9 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasBackgroundModule.ts:55 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts:76 \u2014 the two spans are one implementation copied and then locally edited \u2014 57 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasBackgroundModule.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d08918ddd37c9a1236afea466f472710097b39072c0bff24fea851ff0eded68"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (9 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCacheModule.ts:96 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositionGuideModule.ts:34 \u2014 the two spans are one implementation copied and then locally edited \u2014 57 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCacheModule.ts"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"3033a4967bf75b8dea1fe160419d6125566c55d51158917659bad863be844364"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (9 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCacheModule.ts:96 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts:134 \u2014 the two spans are one implementation copied and then locally edited \u2014 57 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCacheModule.ts"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"132c4fd027963faa6ea4732062961b196b2eb55732090bbc4b8866933674feed"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositionGuideModule.ts:132 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBboxToolModule.ts:510 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts:382 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositionGuideModule.ts"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"06f105bbf0aafa54ced4defb33fa98b4609d5be59ac3875de3519544b5b0b764"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (9 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositionGuideModule.ts:34 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts:76 \u2014 the two spans are one implementation copied and then locally edited \u2014 64 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositionGuideModule.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d90b1df32c32ae24cb7157f1fed1b98c4b4d30d461e01bf158f9ce1623da857"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (9 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositionGuideModule.ts:34 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntityRendererModule.ts:29 \u2014 the two spans are one implementation copied and then locally edited \u2014 64 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositionGuideModule.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"f047e73b1d1a7888fda3cfbe5e7b12108ce9e49d85c7f4600cecd4f87c96c96d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (9 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts:76 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts:134 \u2014 the two spans are one implementation copied and then locally edited \u2014 64 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"4419a4b8ac35e02609fca685ab39d8a41d599655070b14f2271de9d103aa84db"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityBufferObjectRenderer.ts:321 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStageModule.ts:711 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStagingAreaModule.ts:268 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityBufferObjectRenderer.ts"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6c75f4bc81e1571a808c8d8c8663037658472acd11a6a81dbab345c8b176905"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts:535 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:1583 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"6befd55e3e49fa13bfe6b38f880b1763103f81e974585bf618b51eb8a0a8b430"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts:253 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBboxToolModule.ts:159 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"738b95315e2e0e05b0bc329eb58d98b270ae5db902c0a0b3188496ffe2d0e174"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectImage.ts:129 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectImage.ts:152 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectImage.ts"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"b690bdf1a237aa589b4d39eaa0b9c8a4c67266944951ee83f0ca5ea8adfec399"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBboxToolModule.ts:76 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts:74 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts:56 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts:67 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 5 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBboxToolModule.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"3566bf831b59d85d8d0d1511f6ecceaec7a5a510ff90ee15bbe12438e9753f2d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts:244 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts:277 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e47bf6091343a1e74f6107e734b79570f1cfc5d0f74a5aded8148a0e61f3d2a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts:314 \u00B7 invokeai/frontend/webv1/src/services/events/setEventListeners.tsx:976 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"d11e286eb59d0c5e548f43a07517635b043e212c728ecde9f9b8fcbb06057d39"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:859 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:870 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1424 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1523 \u00B7 \u002B2 more site(s) not listed \u2014 the 6 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":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":859}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe84473dc5618d1bd266300cd1d19c474454921eec1f0e1a19316e53c7bc3958"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 10 locations): invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:248 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:262 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:276 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:290 \u00B7 \u002B6 more site(s) not listed \u2014 all 10 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":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"c070b56ed895b3b0c2a2aa01fc4d495e96ef2a9d3a6a68412c05ed5b47c7fb10"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/cropper/lib/editor.ts:1321 \u00B7 invokeai/frontend/webv1/src/features/cropper/lib/editor.ts:1359 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/cropper/lib/editor.ts"},"region":{"startLine":1321}}}],"partialFingerprints":{"codehealthFindingId/v1":"af609b982c66ac36583270dcb9aaf764a49c6cada67dd0577e5a4f68ebc04ad8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:202 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx:69 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"54fa57a32d709d96c8e3a5f63119949aeaaa8afc7b99e9c40da6e284c8cabc09"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardContextMenu.tsx:111 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/Boards/NoBoardBoardContextMenu.tsx:43 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardContextMenu.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"0374c4298bcad36139f6b19f45306bb2831aea146cb9d3eabbee92f0bd66bef6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx:5 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleProgressButton.tsx:4 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedShuffle.tsx:5 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"04ca919afdfe60aa9a753cbf5bcbf00055a98154a74dd52d83678c107ca8f694"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx:20 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx:31 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx:42 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx:53 \u00B7 \u002B1 more site(s) not listed \u2014 all 5 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":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"18b71de2c12f117fdcf5de998605abb7fca4aca4bf1ba88805ff1702e5299d53"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSendToUpscale.tsx:19 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemUseAsRefImage.tsx:21 \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":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSendToUpscale.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dc0fb1d462ee4f1be8b0243f79d8ed7a5a6b35f0f1903d3f3f5ff094a4a7bfd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx:435 \u00B7 invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueList.tsx:116 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"7739f661bde58ed5ef94d88547fafec803800faf706f4846be613b7740fa9ca6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:562 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:607 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:630 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":562}}}],"partialFingerprints":{"codehealthFindingId/v1":"872bdc2831aa149c4b3d5595f76deb3f8833500e49bd3ebb6341bfb6c0f61c02"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 20 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:746 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:764 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:782 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:800 \u00B7 \u002B16 more site(s) not listed \u2014 all 20 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":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":746}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb5d54d53c10ce66a42c7028ee4ad4a5aa92867b80be0877573f9249e98851d8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:863 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1912 \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":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"eabab51ee6b9687b7a5ba9fd593be88f2a1c89770665b938b6b2c899da638249"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1400 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1429 \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":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1400}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ca0963bf7aa7f3a62da5c9711a84fe5fe76cd5af25ba202490556598ab1fece"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 15 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1464 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1599 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1656 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1693 \u00B7 \u002B11 more site(s) not listed \u2014 all 15 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":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1464}}}],"partialFingerprints":{"codehealthFindingId/v1":"03eea14fe47bc4c114b5aff161c25f62e23b8a2b8a50df1e9b8f33b512fa500d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterBundleTooltipContent.tsx:16 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterBundleTooltipContent.tsx:29 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterBundleTooltipContent.tsx:39 \u2014 all 3 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterBundleTooltipContent.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"24238f3bef6af3e5bf04781094d0960204b97aa9238a2e6a76a3da5fc498a63b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx:64 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListBulkActions.tsx:57 \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"0111807cb9de2d6a1eba5a0092694e8c8ab02e204b8712ed8c38805a8e586267"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/SyncModelsDialog.tsx:156 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/SyncModelsDialog.tsx:175 \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/SyncModelsDialog.tsx"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"29509cf692fb0cc9034b5692a9cc3290051f257abbb21128dbeab52333339922"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx:592 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx:602 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb82938333fbdc9eb9ebc5b2dacf8f393e55d59c5c94e59e04f912d41b70d9c4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeWrapper.tsx:20 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Notes/NotesNode.tsx:24 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeWrapper.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d72f09a6d3157f302ff37c77e7d6cf6ab10af3d665c583086d3782eff426e93"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (9 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/BoardFieldInputComponent.tsx:73 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillMethod.tsx:29 \u2014 the two spans are one implementation copied and then locally edited \u2014 50 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/BoardFieldInputComponent.tsx"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"422a4edb2672c0294fc91aa2ed2f2a67437755eb25f64d620cd5eb3803a5738e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElement.tsx:269 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElement.tsx:279 \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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElement.tsx"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"688917376f9b638cf83a963ac327f88c39fdab1e1d36c9b3e7e773d49801e200"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementFloatSettings.tsx:81 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementIntegerSettings.tsx:82 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementStringSettings.tsx:47 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementFloatSettings.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"da2f1468e7f25ce84bf7f916b022ca30beb4ccd7ea54051efedadcbc4cef4b01"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts:277 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts:318 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts:342 \u2014 all 3 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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bac1b6b9a5a0111eece039ef34783e7db15186d6b3dcf730bad05544680fe61"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/EmptyState.tsx:23 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/EmptyState.tsx:60 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/EmptyState.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf9bff45ac942a617902543779874ccb50deedeb565d706923c1ffa731b59614"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 8 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowGeneralTab.tsx:51 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceEnabled.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceWeights.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceEnabled.tsx:10 \u00B7 \u002B4 more site(s) not listed \u2014 the 8 copies are spread across 5 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 8 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowGeneralTab.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec6ea480028e0ec6c217ba4b2a0f114933a5dde486fb08c120bd3ca51649303b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (9 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldNamesByStatus.ts:13 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/node/getSortedFilteredFieldNames.ts:4 \u2014 the two spans are one implementation copied and then locally edited \u2014 97 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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldNamesByStatus.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"06420d86d64cb0b7ef94b278876bfcb60a710a97a6a41460730155c2ba92e73c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts:393 \u00B7 invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts:404 \u00B7 invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts:548 \u00B7 invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts:702 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"c228ce710bac6e693a94bebdf914201888098bd191a4f47597adb5d3e118e41a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts:277 \u00B7 invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts:317 \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":"invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"344e49953204fc50cebe57b3d29065ffa298a2354b07170506b801f4ad9bbf42"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/field.ts:1307 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:1385 \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":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":1307}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e93f191f28e6da6b9e0523c2f3bc90a8978910c051ba5c4c5ac24998c9ab5af"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/workflow.ts:83 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/workflow.ts:94 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/workflow.ts"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa063c14438a12663f536e0eaeb3d056134ad45667b20b95453661ce83b20208"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (9 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.ts:114 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graphBuilder.ts:52 \u2014 the two spans are one implementation copied and then locally edited \u2014 50 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.ts"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f994e2332f99828377bef8f471717a7e6aabe0377d4d9fe1bc1a87d7819c9a3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:244 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:333 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:424 \u2014 all 3 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"73483f2842e0241b0e0937af52082e035d6f2c698959fe7ce337302c0f644b51"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:858 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts:315 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts:414 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":858}}}],"partialFingerprints":{"codehealthFindingId/v1":"f141ede2bcc5d5b63cd68c095e9dfd6544abfa2185e9a8d892bdf07c8332e29e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts:27 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts:85 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"78aea454e70cd5e0e11036c870375d2ffa66ecb553d83ecd5d52bddf19a528d5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/schema/parseFieldType.ts:123 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/schema/parseFieldType.ts:134 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/schema/parseFieldType.ts"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4fdaa4b788dfca9f123626401b6dc1339e3b63db6050bcd2541a85a8aac5540"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamFLUXVAEModelSelect.tsx:30 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEModelSelect.tsx:36 \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":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamFLUXVAEModelSelect.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"1176eccf285958ffe4fd287b2cdde4f24228db05965d5a42ebce0f44c198cafe"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/queue/components/CancelAllExceptCurrentIconButton.tsx:2 \u00B7 invokeai/frontend/webv1/src/features/queue/components/DeleteAllExceptCurrentIconButton.tsx:2 \u00B7 invokeai/frontend/webv1/src/features/queue/components/DeleteCurrentQueueItemIconButton.tsx:2 \u00B7 invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/NewWorkflowMenuItem.tsx:2 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/queue/components/CancelAllExceptCurrentIconButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe76f870777aed9619c9b42d509fa0f279d1c99551b92fa6542aeaa1f3ba0277"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/queue/components/PauseProcessorButton.tsx:2 \u00B7 invokeai/frontend/webv1/src/features/queue/components/PruneQueueButton.tsx:2 \u00B7 invokeai/frontend/webv1/src/features/queue/components/ResumeProcessorButton.tsx:2 \u2014 the 3 copies are spread across 3 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/PauseProcessorButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdba3c0a40188151812dd0c080be1e101e488446893be12a782a7b7b9a2e26e4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetForm/StylePresetModal.tsx:87 \u00B7 invokeai/frontend/webv1/src/features/systemPrompts/components/SystemPromptsModal.tsx:51 \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":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetForm/StylePresetModal.tsx"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f4bb778695d0dbb64e098131598b4336a10f115e62b631872494f4fcc199761"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetListItem.tsx:24 \u00B7 invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetListItem.tsx:58 \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":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetListItem.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"b92f506b28fd31a93d7c899109e92b42d27427a2afce287e4aa3a72be9e3b4e2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/stylePresets.ts:9 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/workflows.ts:13 \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":"invokeai/frontend/webv1/src/services/api/endpoints/stylePresets.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"d73a4571a8ef963e5b3dea79db56d29c029245a4eb6b5ebed337e135386061ec"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/types.ts:500 \u00B7 invokeai/frontend/webv1/src/services/api/types.ts:510 \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":"invokeai/frontend/webv1/src/services/api/types.ts"},"region":{"startLine":500}}}],"partialFingerprints":{"codehealthFindingId/v1":"4effba1b310c527072a041e679d2f994911fd284e142a76f6c5872957aaa5c1e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx:316 \u00B7 invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx:363 \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":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6ee8850ea4a9dd04a7d6f0319cf84e40005564ade222edd200beac8fa4c8241"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/mock-backend.mjs:1761 \u00B7 invokeai/frontend/webv2/scripts/mock-backend.mjs:2426 \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":"invokeai/frontend/webv2/scripts/mock-backend.mjs"},"region":{"startLine":1761}}}],"partialFingerprints":{"codehealthFindingId/v1":"3660266e0b8562c4d729e429c68823a23a8d735eded4b76851a238659455b0a7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:756 \u00B7 invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:772 \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":"invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs"},"region":{"startLine":756}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f1075f03db23f1e5af49b7e679407df7b30063efcfbf0ed1d6674c294f64bf7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/fonts/react.tsx:22 \u00B7 invokeai/frontend/webv2/src/features/fonts/runtime.ts:89 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/render/fontLoader.ts:75 \u2014 the 3 copies are spread across 3 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/fonts/react.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cdd4e87d15088c023b556889aff599366ac8efea63018b18b8b8274e0c0a7ee"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (9 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx:502 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayersHeaderActions.tsx:61 \u2014 the two spans are one implementation copied and then locally edited \u2014 60 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx"},"region":{"startLine":502}}}],"partialFingerprints":{"codehealthFindingId/v1":"6268566f372c216283bf4e183ab966ac7ff19ed0f3fff78da014dd9ec493911e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.ts:159 \u00B7 invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.ts:169 \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":"invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.ts"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e9fdd9dbcb6fae2cb30f05661fecb39690b02dfc58a5c63c2587ab9b468bffb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:801 \u00B7 invokeai/frontend/webv2/src/features/upscale/core/graph.ts:513 \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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":801}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d522c7227178f05118d9e81bdc4a5a8e378b4fe111f34b0e8e4832f4aab1724"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:1110 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graph.ts:1219 \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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":1110}}}],"partialFingerprints":{"codehealthFindingId/v1":"34eb3d5089d0fa8a3a0157e69de9fc7efe6ef84abbadcbc47b370b3eb48f9dce"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:1549 \u00B7 invokeai/frontend/webv2/src/features/video/core/graph.ts:308 \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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":1549}}}],"partialFingerprints":{"codehealthFindingId/v1":"823cd5b52e9d86a661f273bba97888b9ebc802aa236d571538bc20b6c03ca5c7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts:179 \u00B7 invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts:206 \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":"invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"6370fc6cbbed565d410b29022d9162a24e4b7f45abdbf16fad7d275d892f6f24"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4 locations): invokeai/frontend/webv2/src/features/generation/data/architectureCapabilitiesStore.ts:65 \u00B7 invokeai/frontend/webv2/src/features/models/data/modelsStore.ts:88 \u00B7 invokeai/frontend/webv2/src/features/models/data/startersStore.ts:46 \u00B7 invokeai/frontend/webv2/src/features/nodes/data/nodesStore.ts:56 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv2/src/features/generation/data/architectureCapabilitiesStore.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"5400c487ec60b660c9132bb897bc983552f2ce5002ce01eb0b7691f31f9e3705"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/identity/ui/useIdentityNotify.ts:6 \u00B7 invokeai/frontend/webv2/src/features/models/ui/useModelsNotify.ts:6 \u00B7 invokeai/frontend/webv2/src/features/nodes/ui/useNodesNotify.ts:8 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv2/src/features/identity/ui/useIdentityNotify.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ad561a732fe4d3961133823766359d19300d69209e4f359cf2b4ec0ef57f8e0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/data/api.ts:68 \u00B7 invokeai/frontend/webv2/src/features/models/data/api.ts:81 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/data/api.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca334aac80bce31cab1199837c3be117136017f690f5377c02b6aaa0f2b9f848"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/data/api.ts:229 \u00B7 invokeai/frontend/webv2/src/features/nodes/data/api.ts:30 \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":"invokeai/frontend/webv2/src/features/models/data/api.ts"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"149677ecab369be45c285d6becd92f584b1f5ffe753e9ebf092fa0984ccbaaf2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4 locations): invokeai/frontend/webv2/src/features/models/data/externalProvidersStore.ts:66 \u00B7 invokeai/frontend/webv2/src/features/models/data/fp8StorageSupportStore.ts:70 \u00B7 invokeai/frontend/webv2/src/features/models/data/modelsStore.ts:103 \u00B7 invokeai/frontend/webv2/src/features/nodes/data/nodesStore.ts:71 \u2014 the 4 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 4 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/data/externalProvidersStore.ts"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2ad86abe15a7fe04fa69c4e709ce5999a2c918c8a61dd51cff8cd2fa13606e6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/ui/detail/DefaultSettingsSection.tsx:251 \u00B7 invokeai/frontend/webv2/src/features/models/ui/detail/ModelEditForm.tsx:324 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/detail/DefaultSettingsSection.tsx"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"154b850e716a65d9a5c5e9b784f3aa43fc881d598c11c0b21bd70d118d3276ee"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallQueueBar.tsx:204 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/linear/NodeFieldSettingsPopover.tsx:343 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallQueueBar.tsx"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"54f8ad8abb80eeb6781208a70c084d1508872c689bd19cc9ae5b0cca61cafb23"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/queue/data/generationDevicesStore.ts:85 \u00B7 invokeai/frontend/webv2/src/features/queue/ui/modelCacheStore.ts:89 \u00B7 invokeai/frontend/webv2/src/workbench/settings/aboutInfoStore.ts:46 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv2/src/features/queue/data/generationDevicesStore.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a9532f2024845125bf044f02039c82bdbeeaca89808177c2d4966f17decd3a2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/ui/NowNextSection.tsx:25 \u00B7 invokeai/frontend/webv2/src/features/queue/ui/RecentSection.tsx:64 \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":"invokeai/frontend/webv2/src/features/queue/ui/NowNextSection.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ec65c4cd927b7f8744e7f7f22291dca2c7d1dfdec24e4ad1f90fc39c40e982f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/upscale/core/settings.ts:897 \u00B7 invokeai/frontend/webv2/src/features/video/core/widgetValues.ts: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":"invokeai/frontend/webv2/src/features/upscale/core/settings.ts"},"region":{"startLine":897}}}],"partialFingerprints":{"codehealthFindingId/v1":"700c621f82aa8c742e26279a04499ffbc8d4a207edef4a6256ac4a53d9b2ced6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/video/core/dimensions.ts:77 \u00B7 invokeai/frontend/webv2/src/features/video/core/dimensions.ts:203 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/dimensions.ts"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"b700188e0a39835c75428bd58226a02198de965bb504ed0e64d0efe9fc4a4c27"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/data/templates.ts:91 \u00B7 invokeai/frontend/webv2/src/features/workflow/data/templates.ts:184 \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":"invokeai/frontend/webv2/src/features/workflow/data/templates.ts"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebeefe7cd7958eb532a59241b4b3ecb18cef9ab8f2c603ec7c6ca288fe54d17a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (9 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/editor/CallSavedWorkflowSyncRuntime.tsx:290 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/editor/CallSavedWorkflowSyncRuntime.tsx:310 \u2014 the two spans are one implementation copied and then locally edited \u2014 77 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/CallSavedWorkflowSyncRuntime.tsx"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"460f5ace29156a35671575722a52fadc96cb17841976f0e95e7b0c93c485987a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.tsx:590 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.tsx:618 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.tsx"},"region":{"startLine":590}}}],"partialFingerprints":{"codehealthFindingId/v1":"fef5cbcee4df035e652a71d80f48daa3d6bdc0e1b41abb922fe2f637eec6bbd4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/copyLayerController.ts:62 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/cropLayerController.ts:87 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/copyLayerController.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccf2d33a0445593e2267a4e75fef203f57f371d1320416bf37a328957c950daa"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/extractMaskedAreaController.ts:207 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/maskLayerController.ts:128 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/extractMaskedAreaController.ts"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"d33959e4cda0fac0647c168084e160ca54eb67fefb7750fa7edca9e6bc0ce8e3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts:75 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/rasterizeLayerController.ts: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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f809ddac1151f780547f719e60cc20f05e46bdb3c9aa73bbaff91a28e0d60e5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts:1194 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts:1220 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts"},"region":{"startLine":1194}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbc41d7ce1e4a19b80d350fca1c5bcb03d1143a83f3ce4fba0be884e27892fbc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts:512 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts:544 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts"},"region":{"startLine":512}}}],"partialFingerprints":{"codehealthFindingId/v1":"22a7f7c49428144a6ce3c4c122aa5c3f4923d47cb598389111deeceae1f6cd64"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/render/raster.testStub.ts:77 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/render/raster.testStub.ts:88 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/raster.testStub.ts"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4a74d1b22372aab143cb9cf556f82cc174fa4ebb6ff767eb1a9cbc36cd8c26e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionState.ts:232 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionState.ts:330 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionState.ts"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbd5f4286eda8c1253e8f0be064d2435dd3999691ca9fbc2bb3c14267b0327f0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/tools/bboxHitTest.ts:199 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/bboxHitTest.ts:213 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/bboxHitTest.ts"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"95f64f11ae93e4eb270ac743c503c1060abd2777e5e9207ac1120aa0efc8f44e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/tools/strokeSession.ts:474 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/strokeSession.ts:491 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/strokeSession.ts"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f7c16a99563b2e2fbd75cfdbb9553dcb127f9c47b769a164b9675bbec607944"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-operations/samGraph.ts:46 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/samGraph.ts:56 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/samGraph.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"264058ffc1b0512dc77ad348787676a4ca1ed95d2a41488be4f129e1b2c1a539"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/hotkeys/firstPartyCommands.ts:388 \u00B7 invokeai/frontend/webv2/src/workbench/hotkeys/firstPartyCommands.ts:406 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/hotkeys/firstPartyCommands.ts"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b7982a71ea1f503249ed7730a3425458a1800d7d6262d8990b89bf0d078f104"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts:1247 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts:534 \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":"invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts"},"region":{"startLine":1247}}}],"partialFingerprints":{"codehealthFindingId/v1":"225f822eba7f00e334da163c3ed48eaf15f5d2508b4884a9408060942e44cb35"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/launchpad/projects/ProjectCard.tsx:94 \u00B7 invokeai/frontend/webv2/src/workbench/launchpad/projects/ProjectRow.tsx:74 \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":"invokeai/frontend/webv2/src/workbench/launchpad/projects/ProjectCard.tsx"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dbbf7844be2f65779f57c16f5c9f22f8a3571f9430367262c2098003645a1fb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/components/OpenProjectDialog.tsx:82 \u00B7 invokeai/frontend/webv2/src/workbench/projects/useProjectActions.ts:118 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/components/OpenProjectDialog.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a12a588380743a769be1621f5caef8a0a1dc5e5a825538690125c4cabadd7aa"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/projects/components/OpenProjectDialog.tsx:151 \u00B7 invokeai/frontend/webv2/src/workbench/shell/AlphaNoticeDialog.tsx:37 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/MissingFontsDialog.tsx:105 \u2014 the 3 copies are spread across 3 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/components/OpenProjectDialog.tsx"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"e838b89a7ec350a6ecc9115ff3c787056228016e5768a799ead7af2cf28fd3eb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:82 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:173 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:223 \u2014 all 3 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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"f91e36337c866f6c73a052b0da8b63560080a3870c44c1bb2423c44575bf1dac"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:102 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:413 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:434 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:465 \u2014 all 4 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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"e13918f09de3a885cc548d8079e41dc3b7bd5c10cdb54f97a49f93284357c8fa"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:641 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:675 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts"},"region":{"startLine":641}}}],"partialFingerprints":{"codehealthFindingId/v1":"e94f2d1db19f497a74a38c017e4e0c47e7997240f74d7e965dcbdf7f71e1998a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.ts:1132 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.ts:1180 \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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":1132}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d2df493ad9b4978e1106dc77677ef6f6ffe3620f541a31194be76da8a478d6c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (9 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/invk/board.ts:147 \u00B7 invokeai/frontend/webv2/src/workbench/projects/invk/board.ts:165 \u2014 the two spans are one implementation copied and then locally edited \u2014 71 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":"invokeai/frontend/webv2/src/workbench/projects/invk/board.ts"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"871adb4ab9660099e2bdfd47e2f2d3bda572b3d472dd4e1629d270f037c0c6a4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/queue-integration/QueueRecoveryNotice.tsx:80 \u00B7 invokeai/frontend/webv2/src/workbench/queue-integration/QueueRecoveryNotice.tsx:126 \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":"invokeai/frontend/webv2/src/workbench/queue-integration/QueueRecoveryNotice.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"e16a08db519f09592dc6625f2090c0970a9ca308c2876ebcdfbd58d7079a709e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/shell/PasteMediaDialog.tsx:319 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/MissingFontsDialog.tsx:125 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/shell/PasteMediaDialog.tsx"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"d594005c733932b4abdf89929dd827dbbbb562ec516ef6bcfce0e73224f6f5d3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/shell/StatusBar.tsx:154 \u00B7 invokeai/frontend/webv2/src/workbench/widget-frame/WidgetBar.tsx:77 \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":"invokeai/frontend/webv2/src/workbench/shell/StatusBar.tsx"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"2901ec0da32ad8cb6f96924844566a45d42d7e320af2b4678ca109730a419fea"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasHeaderActions.tsx:283 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasHeaderActions.tsx:311 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasHeaderActions.tsx"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c4c2208989abc552bc0d7567e5e9afdd66808d5bf1c6de102197d8657235f31"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageIndexProgress.tsx:95 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageIndexProgress.tsx:137 \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":"invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageIndexProgress.tsx"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"f238d65f6e7d0e50f9e32ab880cf076da7754a8d9d23d943cdfbf3efc02c1f79"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/image-map/MapHoverCard.tsx:40 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewDetailsPopover.tsx:63 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/image-map/MapHoverCard.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a52c30646e498e75b6fe4340e5f84f19905a2453f773d6a7f19b1ebbc838c44"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/AdjustmentSettings.tsx:474 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx:273 \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/AdjustmentSettings.tsx"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b58f5d49468a8855bd2f8a6b0c2386a48690822d5ac185fad61171777cc0169"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx:422 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx:432 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccaaee3be0757b3d05181ba7b3b4b76363ae20be9a9732a71cbf9706018c936e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/ReferenceImageSettings.tsx:177 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/ReferenceImageSettings.tsx:186 \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/ReferenceImageSettings.tsx"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"0594c9eb6ea0c9cafb1510604350d5523f1fb1e27a4e6c2fba77bb2c15c06234"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/preview/useCompareLoupe.ts:228 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewLoupe.ts:494 \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":"invokeai/frontend/webv2/src/workbench/widgets/preview/useCompareLoupe.ts"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd8703f10fe1a4e98cebc7ad40baed353ae8c4c9dbd8491794cf76502980edd1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewLoupe.ts:436 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewSwipe.ts:322 \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":"invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewLoupe.ts"},"region":{"startLine":436}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc9d33fc9e0a9c5a331dec532f4e0a403ae5d021f97eb5d1fabeff5bc64134f9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/workbenchState.ts:2379 \u00B7 invokeai/frontend/webv2/src/workbench/workbenchState.ts:2394 \u00B7 invokeai/frontend/webv2/src/workbench/workbenchState.ts:2419 \u2014 all 3 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":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":2379}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9e6a0ec407a0dd9ee6ffdc3f6d634b9276b045311a106cfb6b1b3fdba82a2cc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/workbenchState.ts:4720 \u00B7 invokeai/frontend/webv2/src/workbench/workbenchState.ts:4733 \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":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":4720}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a37a97a6c500716112c2fb1e7808ed4182c31e1b0e495bb3c50b799d6f58848"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 17 locations): invokeai/frontend/webv1/src/common/components/SessionMenuItems.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarSaveToAssetsButton.tsx:8 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/CanvasWorkflowIntegrationModal.tsx:27 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/CanvasWorkflowIntegrationWorkflowSelector.tsx:9 \u00B7 \u002B13 more site(s) not listed \u2014 the 17 copies are spread across 17 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":"invokeai/frontend/webv1/src/common/components/SessionMenuItems.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab330956d958c4a186c9a03a4c9ffdea602e283ae4a989ca668d4ed5d2f095e4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx:21 \u00B7 invokeai/frontend/webv1/src/features/auth/components/LoginPage.tsx:20 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsTransform.tsx:3 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ec65e2e6eacd393009c3d6cbb050c2a4cce6233f3834f7ab5498311275ed872"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/auth/util/passwordUtils.ts:7 \u00B7 invokeai/frontend/webv2/src/features/identity/core/schemas.ts:5 \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":"invokeai/frontend/webv1/src/features/auth/util/passwordUtils.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"1689f56325588f670e3dcb9dc9477efe943ff3ddae30f17991c0d2e980ff42ad"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 19 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAddEntityButtons.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsBboxVisibility.tsx:2 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsTextSessionActive.tsx:2 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListGlobalActionBarAddLayerMenu.tsx:10 \u00B7 \u002B15 more site(s) not listed \u2014 the 19 copies are spread across 19 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAddEntityButtons.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"94d7e3ba3c3b2e8ae37bc0e8f1c5c9915ff21bf177c57b7e07012ce0fd8b4f02"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAddEntityButtons.tsx:16 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasContextMenu/CanvasContextMenuGlobalMenuItems.tsx:30 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListGlobalActionBarAddLayerMenu.tsx:17 \u2014 the 3 copies are spread across 3 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAddEntityButtons.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"03605642d9f007f8e8440d24a6f7521b5f23f13a927f6ff11d70ea43c11a5b6b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 33 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAddEntityButtons.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasContextMenu/CanvasContextMenuItemsCropCanvasToBbox.tsx:4 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListGlobalActionBarAddLayerMenu.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarDuplicateButton.tsx:6 \u00B7 \u002B29 more site(s) not listed \u2014 the 33 copies are spread across 33 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAddEntityButtons.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fada0afb3c450507f63ae7db1b542dacd9281311cdbf030591b460ce8f84bb6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 16 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAutoProcessSwitch.tsx:3 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFill.tsx:17 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasOperationIsolatedLayerPreviewSwitch.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsBboxOverlaySwitch.tsx:3 \u00B7 \u002B12 more site(s) not listed \u2014 the 16 copies are spread across 16 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAutoProcessSwitch.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"547ad04c9684c1a92ea7acb6df3f2f26b57c96ed13c0f058ccd4cee946cca99c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFilterButton.tsx:5 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarInvertMaskButton.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarSelectObjectButton.tsx:5 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarTransformButton.tsx:5 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 5 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFilterButton.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"bae4af7ed511a44b4e55b9138baffd6cbc2ef210a9de2f2be6a9d0ef8b4aa390"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx:88 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx:113 \u2014 the two spans are one implementation copied and then locally edited \u2014 61 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d151ab5fd38b2f59cf374df7726bd804070b2d1909cd72db78dc36f5d332eb4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx:24 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImagePreview.tsx:80 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemMetadataRecallActionsCanvasGenerateTabs.tsx:22 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/AutoLayoutPopover.tsx:47 \u00B7 \u002B2 more site(s) not listed \u2014 the 6 copies are spread across 5 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 6 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"03cbaa5eccf68a8934984acc8a04e7478368a04e994231377e6a4b9aca301719"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapter.tsx:35 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsTransparencyEffect.tsx:13 \u2014 the two spans are one implementation copied and then locally edited \u2014 57 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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapter.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"91ea1b76d1394e6a1c120ed884a8c0e2465f4fdb40e1a685a0ae4b6dc4726886"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 18 locations): invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterControlMode.tsx:8 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/IPAdapterMethod.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/FLUXReduxImageInfluence.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/IPAdapterCLIPVisionModel.tsx:18 \u00B7 \u002B14 more site(s) not listed \u2014 the 18 copies are spread across 18 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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterControlMode.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"8303fb8e6741223fcb5becf4c87e5ecd35746afcce0e7ba3940e1e9c7c8ec11b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx:66 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectInputTypeButtons.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectSaveAsMenu.tsx:26 \u2014 the 3 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d2f1af4d2237a71f96536e33b1699873170e91d9be17b4cc8bffeaecf8c24a7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsAddModifiers.tsx:5 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceMenuItemsAddPromptsAndIPAdapter.tsx:11 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsAddModifiers.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a76edd580cbc6498d741ae9b92a8ea7ead9cac009b227030905016fd8ab51e2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx:297 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx:372 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"d43d35a40f36b4e98648f10934d2e0b83c8accf0f4e97005d27cc0a3e4f73530"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx:137 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx:19 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"639e3f86d1d96e9b8e8370bf9c1e34db00be80eb21c2589a54c78f40195e2c83"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/SaveCanvasProjectDialog.tsx:76 \u00B7 invokeai/frontend/webv1/src/features/workflowLibrary/components/SaveWorkflowAsDialog.tsx:159 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/SaveCanvasProjectDialog.tsx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e90c2b0bbb259f6556fa9b9286d817dc231a9d04313a5f3c29f0da4e1e776d9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 8 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolBboxButton.tsx:2 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolBrushButton.tsx:3 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolEraserButton.tsx:3 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolLassoButton.tsx:3 \u00B7 \u002B4 more site(s) not listed \u2014 the 8 copies are spread across 8 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolBboxButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"212385a9708c3d1180c211eabf73cf8dddc7fda1774ab7288702b0a08e1df5bd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarScale.tsx:184 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarScale.tsx:210 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarScale.tsx"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbb2dd98e0567fcf7284647e80d0ae0ceb707a70a3bfd86911ef0f50e9fdcc00"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityDeleteButton.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsDelete.tsx:15 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsDuplicate.tsx:10 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityDeleteButton.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"627b66d99d4d09083d39326c222d9cba22afd8ee26c4989707756db95c193e89"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasFilterHotkey.tsx:2 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasInvertMaskHotkey.tsx:5 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasTransformHotkey.tsx:2 \u2014 the 3 copies are spread across 3 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasFilterHotkey.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e692dd3b315bf121efe1fafbd1f71101b9e7cfc614a9f52c22c1352f1e635494"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCacheModule.ts:98 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStateApiModule.ts:81 \u2014 the two spans are one implementation copied and then locally edited \u2014 54 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCacheModule.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfb8e3d69a606c81eccb060f1b7712cce6ceeb7be1f8ca35c22ed78ebb5f0779"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositionGuideModule.ts:36 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStageModule.ts:90 \u2014 the two spans are one implementation copied and then locally edited \u2014 61 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositionGuideModule.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"171c321b5915b1933ee772b1de4a0c77240f23c88c5737727dd708a39ed686db"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts:522 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts:382 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts"},"region":{"startLine":522}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9a29a7ed38aedad539e236dc7c0856ccc298bbae956bd8ec9777cc9c10c3378"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts:78 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStateApiModule.ts:81 \u2014 the two spans are one implementation copied and then locally edited \u2014 61 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3d36814730bb504d406dbb98054fe0054207e0c955b7baabd0496a5fd9b5bc7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts:258 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:1151 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ac16bff05f6867d100ca4f1b2f4d01cdc8679a632f072867b8e7a1928edda8f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 10 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts:355 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts:365 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts:375 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts:385 \u00B7 \u002B6 more site(s) not listed \u2014 all 10 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"91b46b5592437d4edc98adc6b951a8fd564d530a7f3c25d76eaaa161f2bb3e3c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts:199 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectImage.ts:64 \u2014 the two spans are one implementation copied and then locally edited \u2014 57 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"865a5bb1379ba2bf91529faa89d5a16c348ea5a44d6d19e7bb701c7123175b2b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntityRendererModule.ts:69 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntityRendererModule.ts:78 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntityRendererModule.ts:87 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntityRendererModule.ts:96 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntityRendererModule.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"255839beae5b1275a2a0456dff5499578eb0369d24cd098c8d9bfdee18002ebb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectImage.ts:112 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectImage.ts:142 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectImage.ts"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"b947e12907e08056c91cedf0dcc5517dbfbe0d2e0ea51080fc6c3f230a3f903a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStageModule.ts:90 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStateApiModule.ts:81 \u2014 the two spans are one implementation copied and then locally edited \u2014 62 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStageModule.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"acd613d4437b91341129678d8a4f2897efd13acbe4f4142940bb7036ee3e2f0c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStageModule.ts:90 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts:136 \u2014 the two spans are one implementation copied and then locally edited \u2014 61 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStageModule.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"2618fb04eaa3030dde8842ce6a4e4cda220a22f00fbacbda69c6a17dfeff842f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts:146 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts:124 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a743040eee7c42a8e16355cbc32a8497bcc7afa09b56733f398b0a27b2e3055"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts:208 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts:218 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"9836b47f6fb039c7d8d05810610f5f33b61c0e87940ad3405f4e6763b0f96393"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/pressure.ts:246 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/pressure.ts:674 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/pressure.ts"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"02b5f7ca1da8c7ea2c93ccfb1d0750d386df377f2b48c98a313b6756ac67a949"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts:292 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx:477 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"d16f38809b966960d4c31e04fa1a36d1e2307760601e1aa29c3b0c7d83c36f83"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts:546 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts:569 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts"},"region":{"startLine":546}}}],"partialFingerprints":{"codehealthFindingId/v1":"2aab68ac6a571253ee15c0d73c72aaf92a4513ec74e8510cfbbd76604ffa883c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:135 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:185 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:196 \u2014 all 3 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":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6cf509a40f48beefc211ac7d735b29c1e71306a9cd9dcdf65c415d3057e48ff"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1456 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1471 \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":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1456}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a8e53586dbb297815f9a410420a24d109488beb90551795fb811792e0f66684"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1655 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1663 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1671 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1679 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Check what actually differs between the copies before collapsing them: every one of them is an argument to a \u0060createSlice(\u2026)\u0060 call, so where these calls are a MATRIX of cases \u2014 one per input, differing precisely in the case each one pins \u2014 the repetition is the enumeration and extracting the shared part would delete cases rather than de-duplicate anything."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1655}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f2717432736b7a562d5df316b5cc1fb7b634d2c6937244fbafe2143d705bd4f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:317 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:368 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:378 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:414 \u00B7 \u002B2 more site(s) not listed \u2014 all 6 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":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd0a12ebb408acc075d0c6efee4bbad7378cf7eb07acdc10f18e840e892019f7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:688 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:707 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":688}}}],"partialFingerprints":{"codehealthFindingId/v1":"d976c3285edcacdd76bcac84162ad1ab78798ebddf9c2ac030256c9d65e43023"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:267 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:291 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"d15204ffb90f587cf0e874fe5305db81e3c3070077c8b0db9583574ccc1cc0be"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:1119 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:1128 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":1119}}}],"partialFingerprints":{"codehealthFindingId/v1":"183a13c74f01fcc4b3e8326ac9dd34fce44882a4bcd38db0fc17788761cb97e4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/customNodes/CustomNodesList.tsx:69 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManager.tsx:31 \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":"invokeai/frontend/webv1/src/features/customNodes/CustomNodesList.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4b2ad1683d2bb6724863a358cddd8cb951178e749270f4ac2aa7c593687074d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemOpenInNewTab.tsx:4 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemOpenInNewTabVideo.tsx:4 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEditButton.tsx:4 \u00B7 invokeai/frontend/webv1/src/features/queue/components/CancelCurrentQueueItemIconButton.tsx:3 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 5 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":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemOpenInNewTab.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"17e9f63ae536aadaeebc1ebc6b10e4beb8538ad4e91ce5c46b1bc3ac7658867b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemOpenInViewer.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowButton.tsx:3 \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":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemOpenInViewer.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"cece6db5fec3c6973cede7fc69b15cf2fd4c5856ef22f9b02a60ea2c331bb667"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AlwaysShowImageSizeCheckbox.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AutoSwitchCheckbox.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowArchivedBoardsCheckbox.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowStarredFirstCheckbox.tsx:6 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 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. There is one copy in each of 5 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AlwaysShowImageSizeCheckbox.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"34a09e8d1761bb325f8b7a0edc80a0632b850a6c3f8bb9dc36074ac4dafd2a92"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemDeleteIconButton.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemOpenInViewerIconButton.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeNotesTextarea.tsx:7 \u2014 the 3 copies are spread across 3 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemDeleteIconButton.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"672630b2602122be71a39ca2ae58b39425482892008d7b0a0730fe5df1f2d871"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:613 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:636 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":613}}}],"partialFingerprints":{"codehealthFindingId/v1":"2067ee3cf21a175691813e6521268213e36ea33b470b80433d7809dce1e0e511"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1448 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1585 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1627 \u00B7 invokeai/frontend/webv1/src/features/metadata/parsing.tsx:1737 \u00B7 \u002B1 more site(s) not listed \u2014 all 5 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":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1448}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e62d9090d1eba106e62d906336e455fb37fe20808bd3758074b93966f451c82"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HFToken.tsx:88 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/TriggerPhrases.tsx:23 \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HFToken.tsx"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"389fa7c46c0c5085b4f541d9efe490d0bb3e5e5b771304b1d2694ee71c51fc51"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterBundleTooltipContent.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterBundleTooltipContentCompact.tsx:7 \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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterBundleTooltipContent.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbd989b1f5a396e4c0a7deb219c7cc0d8857518dd2f757f651194b3902018e72"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelFilterMenu.tsx:109 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelFilterMenu.tsx:162 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelFilterMenu.tsx"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"da1a4381c406577616f06627c896ab07ad7e45336e7787638aff4f6f3f6caabd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx:187 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx:195 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx:206 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"74ba60314c9ea92d292d01bec2543539d21924fe33ae3a9b76874a1de29fe9bc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNode.tsx:64 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNode.tsx:108 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNode.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5a1f75ac5995cde272e9bcd9ee74ae9cbf5f81b8d275782c1a494bb707f1891"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/SaveToGalleryCheckbox.tsx:26 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/UseCacheCheckbox.tsx:28 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/SaveToGalleryCheckbox.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f850f8da8c77d997994f6746a7b85d4e620834b81003ed4f1e479bce0bb0138"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElement.tsx:182 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElement.tsx:261 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElement.tsx"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad6ae33e559c624a014ebee61b352a9928ed47933c6c2bacf1d76e6b1b0ef0c6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElement.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElement.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/TextElement.tsx:9 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElement.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"95a4222e8ae380afead48bcf73e147b899217a51746cca7be04f4dc483baada7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowGeneralTab.tsx:111 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowGeneralTab.tsx:119 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowGeneralTab.tsx"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0a43b9285fce5f67d0638e3f8cf2f63666696462f3779c616d70b717acc7b3b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldInstanceExists.ts:1 \u00B7 invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldTemplateExists.ts:1 \u00B7 invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldTemplateTitleOrThrow.ts:1 \u00B7 invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldUserTitleSafe.ts:1 \u2014 the 4 copies are spread across 4 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldInstanceExists.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6789d6197b5da17f4e5c64a75ee00b5e437b8860d20eb66d19a125c58a1964e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldUserDescriptionSafe.ts:13 \u00B7 invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldUserTitleSafe.ts:13 \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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldUserDescriptionSafe.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"d03369ba29994d6adfd23253828d405f6f9aad801a154a1aff20a7c4185c8f43"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/invocation.ts:145 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/v2/invocation.ts:19 \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":"invokeai/frontend/webv1/src/features/nodes/types/invocation.ts"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"d245748fac471e08e58d643267e1c070ab4a1c0b4dfd702356485774e310e50d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/v2/workflow.ts:41 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/workflow.ts:50 \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":"invokeai/frontend/webv1/src/features/nodes/types/v2/workflow.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"e222aaf2b0bef2744879616fb83d82c4f8b54462516f64316d72d05e9260ebc7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:228 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:240 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:323 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:414 \u2014 all 4 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"27d5fab111adb06a4d8bb820c9f9e66d86d9a6b5e30954518e9ec628aa59c779"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts:30 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts:21 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts:27 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts:26 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d6c03e0a763f628fb27fb10bf3f901e97cc45d788f1529ff7a18df178f1d10b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:208 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:265 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:316 \u2014 all 3 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"98f6d6fefc3db9720b93188a472cb8aa1d7710c4d63e04da70e301458d511e11"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx:15 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamOptimizedDenoisingToggle.tsx:7 \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":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"e91abd71d45658aacf56f6106b3c2946b31df9ca1d82af100ca2f0cb00bbf7c7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxPreview.tsx:3 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsPreview.tsx:3 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Prompts/Prompts.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedNumberInput.tsx:10 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxPreview.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c16c722300e54f6cf262f22528ccc225d1c5a7550387ecb594d633934b8271ff"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/queue/store/readiness.ts:318 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:500 \u00B7 invokeai/frontend/webv1/src/features/queue/store/readiness.ts:1288 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":318}}}],"partialFingerprints":{"codehealthFindingId/v1":"abb5d1a9f58f8e3740f5c0e05f80e8ba1ec009a48614801cf53a23cbc7240c56"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsMenu.tsx:28 \u00B7 invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/WorkflowLibraryMenu.tsx:21 \u2014 the two spans are one implementation copied and then locally edited \u2014 58 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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsMenu.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"57103480c7e80a85a915a10518e24d7fcf5c2f190a1be4010bfce6fbd760126b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx:39 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx:34 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadGenerateFromTextButton.tsx:29 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadUseALayoutImageButton.tsx:35 \u2014 the 4 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. There is one copy in each of 4 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"18869f9974fba7d5604f4c1452989f7890d3fc45f6dd5704be6862e46516c33c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx:78 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx:90 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebcd56348d9fc574accaf28765bf26a21e515cb5979d08b1593be98ea2018ffc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/ui/layouts/use-collapsible-gridview-panel.ts:28 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/use-collapsible-gridview-panel.ts:47 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/use-collapsible-gridview-panel.ts:70 \u2014 all 3 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":"invokeai/frontend/webv1/src/features/ui/layouts/use-collapsible-gridview-panel.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e60804f86855d083cdae640121402389dbab51df84797b42677857c455681cf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/images.ts:334 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/images.ts:351 \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":"invokeai/frontend/webv1/src/services/api/endpoints/images.ts"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d2eb30aef3141dea33b3b897aafc4db708788ce8e18eb03b0448b859050831f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/stylePresets.ts:45 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/stylePresets.ts:68 \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":"invokeai/frontend/webv1/src/services/api/endpoints/stylePresets.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"aef3acbeaf9cc2abd329f5f443b8d26aa5619b28f85c8644680d82ca67a2e3c1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/run-graph.ts:424 \u00B7 invokeai/frontend/webv1/src/services/api/run-graph.ts:434 \u2014 all 2 copies are in the same file, and each CITED SPAN is a SPECIALISATION DECLARATION \u2014 a type whose \u0060extends\u0060 clause names a base and whose body hands that base its own values through \u0060super(\u2026)\u0060. The shared module this dimension usually asks you to extract already exists: it is that base, every one of these sites already reaches it, and the \u0060super(\u2026)\u0060 call this row matched on is where each site passes its differences in. So do not read this as an extract-a-helper row \u2014 there is no missing helper, and what is left at each site is the declaration of one distinct specialisation, which cannot be deleted without deleting the thing it declares. Read what actually differs between the spans, because two different answers follow. Where the sites differ only in the values they hand the base \u2014 a type argument, a service, an alias, a cache \u2014 the repetition is a TEMPLATE, and the only moves that collapse it are to generate these declarations from the set they enumerate or to replace the repeated construction with one factory each site calls with its own values; where that set is the point, each site pinning one distinct thing, the repetition IS the enumeration and there is nothing to remove. Where instead a span carries logic OUTSIDE the delegation that is the same at every site, that logic is the part to move, and its home is the base type rather than a new module. Reported because the copies still drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/run-graph.ts"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6bb737e5bc8f55a256ee33e7fe9885d0de2fda87f18efef997fa189c6ae0127"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx:113 \u00B7 invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx:394 \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":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"51ff2bd65c071bdd4faf104d8bd2be9267aa9a80f0a1faa1c49674a230ccc978"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs:304 \u00B7 invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs:462 \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":"invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9af85fc5d7a109894846c9116f80f369f17f40a0def57413d7434dd55a0780b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/mock-backend.mjs:374 \u00B7 invokeai/frontend/webv2/scripts/mock-backend.mjs:383 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/mock-backend.mjs"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"64432ff201ddb91610dbfde344357a963fa156100be15ae90430d6e7a0468467"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/mock-backend.mjs:1263 \u00B7 invokeai/frontend/webv2/scripts/mock-backend.mjs:1501 \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":"invokeai/frontend/webv2/scripts/mock-backend.mjs"},"region":{"startLine":1263}}}],"partialFingerprints":{"codehealthFindingId/v1":"30f2ed276f95be1f91f5296d0fd7a9470bb87af23d741161a6650079f4fdf1a6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/mock-backend.mjs:1427 \u00B7 invokeai/frontend/webv2/scripts/mock-backend.mjs:1457 \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":"invokeai/frontend/webv2/scripts/mock-backend.mjs"},"region":{"startLine":1427}}}],"partialFingerprints":{"codehealthFindingId/v1":"c81560f126d5dea587bfc088bbf1d7a8211e08b5e19807050754bf1678d29a65"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/mock-backend.mjs:2555 \u00B7 invokeai/frontend/webv2/scripts/mock-backend.mjs:2626 \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":"invokeai/frontend/webv2/scripts/mock-backend.mjs"},"region":{"startLine":2555}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b17c36ad929f83ec8d2c5edc35f03238c4689b4fcbc2931beac4ce8a63a70ee"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/performance-budgets.mjs:827 \u00B7 invokeai/frontend/webv2/scripts/performance-budgets.mjs:835 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/performance-budgets.mjs"},"region":{"startLine":827}}}],"partialFingerprints":{"codehealthFindingId/v1":"240fe0f543da8363a6d7012f42c79978846f6064b60222b57e9c2cc828e8d7ef"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4 locations): invokeai/frontend/webv2/src/features/gallery/core/recentImages.ts:31 \u00B7 invokeai/frontend/webv2/src/features/generation/core/conditioningRebalance.ts:192 \u00B7 invokeai/frontend/webv2/src/workbench/settings/store.ts:188 \u00B7 invokeai/frontend/webv2/src/workbench/settings/store.ts:224 \u2014 the 4 copies are spread across 3 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":"invokeai/frontend/webv2/src/features/gallery/core/recentImages.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bd81f9f43e6ab82223502fc704fa76d1a75dc59298fe8626750c05a321df984"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/core/semanticImageQuery.ts:73 \u00B7 invokeai/frontend/webv2/src/features/gallery/core/semanticImageQuery.ts:97 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/core/semanticImageQuery.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"10edc1ceb0a9ad3c2fdcee9470af1808e4552314c366d06278a183f34f3c8ce6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/data/queries.ts:490 \u00B7 invokeai/frontend/webv2/src/features/gallery/data/queries.ts:1085 \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":"invokeai/frontend/webv2/src/features/gallery/data/queries.ts"},"region":{"startLine":490}}}],"partialFingerprints":{"codehealthFindingId/v1":"7aacebcb631cd8ac8a8cf37e6ca349065f05dcf544b6ffe505b895519e1a0793"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/ui/GallerySearchHelp.tsx:15 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayersHeaderActions.tsx:74 \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":"invokeai/frontend/webv2/src/features/gallery/ui/GallerySearchHelp.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fbd85fa59af6bf56e3c57bddd8ca28028a679de7f44944014b473eb874bd1ec"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/ui/GallerySelectionBar.tsx:108 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/GalleryBoardDestinationGroups.tsx:39 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GallerySelectionBar.tsx"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"2eb80171d4966571a0e4d934e0628f97ff86eb90eef0a339aa667580a3af9db1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/ui/GalleryWidgetChrome.tsx:80 \u00B7 invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerView.tsx:488 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryWidgetChrome.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1f701a9de062ef6d452d875dd35d652d03dcafbb7fc04aee8fcfef456f6956c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryMediaSlot.tsx:252 \u00B7 invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryMediaSlot.tsx:268 \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":"invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryMediaSlot.tsx"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcb8ac43c3f7b3f2e7bcba8370f5c11abe980635dc119356c1589ee68bae8868"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/ui/useGalleryData.ts:130 \u00B7 invokeai/frontend/webv2/src/features/gallery/ui/useGalleryStarredStrip.ts:30 \u2014 the two spans are one implementation copied and then locally edited \u2014 61 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":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryData.ts"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"afc886918437eb09fb1e04da75d09aef244c0b2889d3000a2b3e7422e96e9e68"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts:1785 \u00B7 invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts:2551 \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":"invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts"},"region":{"startLine":1785}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbc1c42c68ec3c05039011d29671039da12786d54bccaa2e98d267b1a514c943"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/generation/core/conditioningRebalance.ts:172 \u00B7 invokeai/frontend/webv2/src/features/queue/core/promptBatch.ts:60 \u00B7 invokeai/frontend/webv2/src/features/queue/core/promptBatch.ts:91 \u2014 the 3 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":"invokeai/frontend/webv2/src/features/generation/core/conditioningRebalance.ts"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"1da7be690e7bcea670f6d753f0407305e227157a428720c1126834c100850415"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:471 \u00B7 invokeai/frontend/webv2/src/features/video/core/graph.ts:137 \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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":471}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fba21fc293cdee02a76f0e2135934609a6d44d8cc31940850bfdd5a480676da"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/referenceImage.ts:3 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/videoRecallRuntime.ts:55 \u2014 the two spans are one implementation copied and then locally edited \u2014 74 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":"invokeai/frontend/webv2/src/features/generation/core/referenceImage.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"f28702c17b8742caa17e60070b88570a69a15d870c5afbe823b0c01d3a7541c9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/generation/data/architectureCapabilitiesStore.ts:83 \u00B7 invokeai/frontend/webv2/src/features/models/data/modelsStore.ts:104 \u00B7 invokeai/frontend/webv2/src/features/nodes/data/nodesStore.ts:72 \u2014 the 3 copies are spread across 3 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/data/architectureCapabilitiesStore.ts"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"d20f6b15d2460e7120dbf484631e4edf3be9c59bcb0ec01002c5ac4bf63ec726"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/GeneratePresetsPopover.tsx:175 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx:332 \u2014 the two spans are one implementation copied and then locally edited \u2014 55 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":"invokeai/frontend/webv2/src/features/generation/ui/GeneratePresetsPopover.tsx"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d2653d2473067cd505c57bb146c175c719283a3f205aa81d73108068f790c44"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/promptFields/SystemPromptsField.tsx:325 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardsPanel.tsx:201 \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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/SystemPromptsField.tsx"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"328cc8dc4fd2a65430e5c933252dcbbdfa7d3e657302c0eaa062b6c897b4c344"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/promptFields/promptFocus.ts:121 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/promptFields/promptFocus.ts:154 \u2014 the two spans are one implementation copied and then locally edited \u2014 72 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":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/promptFocus.ts"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"b372826d97097dbbf69d74993719b0e6923b2961a89cc285727ee8bc7ccd1646"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx:332 \u00B7 invokeai/frontend/webv2/src/platform/react/useModifierHeld.ts:19 \u00B7 invokeai/frontend/webv2/src/workbench/shell/topbar/QueueCluster.tsx:180 \u2014 the 3 copies are spread across 3 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"a582988b61b071835e7f4375016115bb2ae52f901b894646b874ee0a0d3f240a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/data/api.ts:183 \u00B7 invokeai/frontend/webv2/src/features/nodes/data/api.ts:26 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/data/api.ts"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"19aa9b8d6eea7c0e29a1069cd1a160397111b706fe7d3b9707e68d95e637ff94"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/ui/credentials/ApiKeysSection.tsx:100 \u00B7 invokeai/frontend/webv2/src/features/models/ui/credentials/ExternalProviderKeyCards.tsx:252 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/credentials/ApiKeysSection.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"623b67a49e65c001459a423b6b1cd28e88db7437545c1e3ff365601619a8d9f6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/models/ui/library/MaintenanceMenu.tsx:74 \u00B7 invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetStrip.tsx:621 \u00B7 invokeai/frontend/webv2/src/workbench/shell/topbar/ProjectSwitcher.tsx:279 \u2014 the 3 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/library/MaintenanceMenu.tsx"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"573dac2e17861b7c6d300a46ee29811866ca9d779195b1498a7d5389c27be60b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/nodes/ui/activity/NodeActivityBar.tsx:77 \u00B7 invokeai/frontend/webv2/src/features/queue/ui/ModelCacheFooter.tsx:133 \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":"invokeai/frontend/webv2/src/features/nodes/ui/activity/NodeActivityBar.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0d769259e825b39ba11cc3cd71d4c1809d573f9961693fa6951b52c33f74ed6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/core/promptBatch.ts:267 \u00B7 invokeai/frontend/webv2/src/features/queue/core/promptBatch.ts:322 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/core/promptBatch.ts"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"a566ffec651fec1b901eacd3f6ddaf82ac07dba9c58476163d32111a9fa6dd74"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/data/submissionApi.ts:248 \u00B7 invokeai/frontend/webv2/src/features/queue/data/submissionApi.ts:369 \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":"invokeai/frontend/webv2/src/features/queue/data/submissionApi.ts"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3534c7cb313c2a4deaa5860955dbf3aae0c1f73ddb7a87feb61084f89e148c9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/runtime.ts:2319 \u00B7 invokeai/frontend/webv2/src/features/queue/runtime.ts:2388 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":2319}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2bdf2d821b07bf2e5c297f556c2d199906453450cc220f7e6f4fcfa8815da4d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/upscale/core/graph.ts:731 \u00B7 invokeai/frontend/webv2/src/features/upscale/core/graph.ts:810 \u00B7 invokeai/frontend/webv2/src/features/upscale/core/graph.ts:888 \u2014 all 3 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":"invokeai/frontend/webv2/src/features/upscale/core/graph.ts"},"region":{"startLine":731}}}],"partialFingerprints":{"codehealthFindingId/v1":"22ce634985397aed0009bac445984a542ae42cdef52f8fa4a6c65c22d48b2b26"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx:382 \u00B7 invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx:133 \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":"invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"d97a6e9e2062da5e3e94ff5faa9e142ce7175caa1000a018d4f392179ef85322"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/video/core/dimensions.ts:56 \u00B7 invokeai/frontend/webv2/src/features/video/core/dimensions.ts:84 \u00B7 invokeai/frontend/webv2/src/features/video/core/dimensions.ts:212 \u2014 all 3 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":"invokeai/frontend/webv2/src/features/video/core/dimensions.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1e556da532a74abbeebab8a557a4887f8155fad0dfb863aa6bd289e816061f5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/editor/NotesFlowNode.tsx:49 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/linear/NodeInspector.tsx:106 \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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/NotesFlowNode.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dfe8cb0ae1bbd6ed78c1e9764f507755c366f6645a4f0009f82ea1fd55ef793"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx:612 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx:630 \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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx"},"region":{"startLine":612}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6edfb6f556ce44235fd8d07cb7ce18ab93a9f17d74c3136f2fc8695f7f3ea3a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.tsx:291 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.tsx:374 \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":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.tsx"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb75f33648524739946ca4d57202ea1452484f905b51e4835d3733a6d3e7ec35"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowPublicationHost.tsx:723 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/RunLayerWorkflowDialog.tsx:476 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowPublicationHost.tsx"},"region":{"startLine":723}}}],"partialFingerprints":{"codehealthFindingId/v1":"080ed88079bdfbc899752095d4218e944d2d9edcd58b8c1f21e637cc9d9e9c31"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/platform/ui/HsvBoxPicker.tsx:11 \u00B7 invokeai/frontend/webv2/src/platform/ui/HsvWheelPicker.tsx:21 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/HsvBoxPicker.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"47d6fbb7acb0b76f2e785b4c8255881e2de6628076264ccfc78a8df0ffc703e2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/platform/ui/settings/SettingControl.tsx:79 \u00B7 invokeai/frontend/webv2/src/platform/ui/settings/SettingControl.tsx:109 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/settings/SettingControl.tsx"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e3fa47527bda13f75a48c76895bc0ad6461d5d57efc7b575898eda04184fb30"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/editingController.ts:77 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts:2014 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/editingController.ts"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2403622034261b965b072d39f13b548b1b9d7759163ba56c92c914d3ca020dd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/rasterMemoryBudgetController.ts:74 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/rasterMemoryBudgetController.ts:91 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/rasterMemoryBudgetController.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"316c1b71523893c55bcd12cfc034124f5bf65e12c32171db97a2692eee2f450d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts:895 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts:977 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts"},"region":{"startLine":895}}}],"partialFingerprints":{"codehealthFindingId/v1":"378c4bcca90bb0f59c964329eca30a7546d9ee11c56c9f229eca4e71748d2925"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerDisplayEffect.ts:28 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/selection/floatingSelection.ts:156 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerDisplayEffect.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"721825e78c18495d0a5a4a7ea6ba59365aa1a1b2c13a47be464a4fba3cda44ba"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterComposite.ts:112 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/generationCompositePlan.ts:114 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/generationCompositePlan.ts:246 \u2014 the 3 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterComposite.ts"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fb8436f744ef61a5c4eb141dd1662eba999cc1877ea000b707e38567a6eeeb9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterizers/gradientRasterizer.ts:51 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterizers/shapeRasterizer.ts:118 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterizers/gradientRasterizer.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"01b1ec36606b12c158329e4fd055c42f027f766a0207be0de750b08c0414db56"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterizers/shapeRasterizer.ts:120 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterizers/textRasterizer.ts:85 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterizers/shapeRasterizer.ts"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"6968f4439e2edeafbe9adfceebf98c06ad1f124bdb11a704f6f178c3c865b572"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/samCoordinates.ts:3 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/samGraph.ts:26 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/samCoordinates.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cfe223564418ac4daaa7d81eb34e35be6ffc43cba6a217bd7d22616742ecdb2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/tools/gradientTool.ts:65 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/marqueeTool.ts:78 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/gradientTool.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"c546c438944c6f9f1aad8b078d67ae47addfbc2eb32e052ed12443dbd10ea9f7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/tools/samTool.ts:41 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/samTool.ts:128 \u2014 the two spans are one implementation copied and then locally edited \u2014 59 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/samTool.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1f0b0981ff4ea3b4127112e2e4b54f3754cd267fd3d8bdcf25b8bd7217679ec"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/canvas-operations/SelectObjectCoordinator.ts:178 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/SelectObjectCoordinator.ts:314 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/SelectObjectCoordinator.ts:382 \u2014 all 3 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":"invokeai/frontend/webv2/src/workbench/canvas-operations/SelectObjectCoordinator.ts"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b3b1eca1fcea115a2e2c798f05cfe4b5dcf5065d82356036e5970f477393c51"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/executeImageRecall.ts:77 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts:47 \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":"invokeai/frontend/webv2/src/workbench/image-actions/executeImageRecall.ts"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"5372df359344a39d6c7eb69d4ce8b3cf690d513b512379dca50dc2a84538c077"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/recallParameters.ts:491 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/recallParameters.ts:543 \u2014 the two spans are one implementation copied and then locally edited \u2014 66 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":"invokeai/frontend/webv2/src/workbench/image-actions/recallParameters.ts"},"region":{"startLine":491}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e6fcffe4e8080d8c37516ffced4fe285fd0abdd6563c100ff817946e670b331"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts:854 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts:878 \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":"invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts"},"region":{"startLine":854}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c0a6cba38514f825626087c8b184d2052cea01e878ae2eb011cb6bdf17b7556"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/components/ProjectFileOptionsDialog.tsx:80 \u00B7 invokeai/frontend/webv2/src/workbench/projects/components/ProjectFileOptionsDialog.tsx:92 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/components/ProjectFileOptionsDialog.tsx"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"75047b161516a09b4f8b2dacedcf06dc29611c8308f2db162199bd34bebc3af6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:116 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:138 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:160 \u2014 all 3 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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fd02d3b9f9e965a0ba48e41c12810ba71a45e6a8194155451a3988797a9ee86"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:620 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:802 \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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts"},"region":{"startLine":620}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b81d9ef0a095647aabe6fb5f1b40a4a99a11a71d7d5ba0837a24fec322129ae"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.ts:986 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.ts:1027 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.ts:1606 \u2014 all 3 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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":986}}}],"partialFingerprints":{"codehealthFindingId/v1":"feba8daa9543c835d9b114f2c96a7e6a1f4d7ac03f71eb47606a1ff1e0554167"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:2077 \u00B7 invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:3625 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":2077}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1947a89435ae84a944351b7c86c3c18ae8f7d8544b537d736ee8d4d2e5d8526"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4 locations): invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:1283 \u00B7 invokeai/frontend/webv2/src/workbench/queue-integration/queueRunJournal.ts:209 \u00B7 invokeai/frontend/webv2/src/workbench/queue-integration/queueRunJournal.ts:331 \u00B7 invokeai/frontend/webv2/src/workbench/queue-integration/queueRunJournal.ts:470 \u2014 the 4 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":1283}}}],"partialFingerprints":{"codehealthFindingId/v1":"20640975d51547c0f0bd081d4d99f47b266d5f01f70a94d8b3e078076a99153a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/invk/assetTransport.ts:321 \u00B7 invokeai/frontend/webv2/src/workbench/projects/invk/assetTransport.ts:331 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/assetTransport.ts"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"a03a0a4712b87476c8a7fec781857466d3ab743dcb4dbc326f06b2919981b1e8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasSaveToGallerySubmenu.tsx:39 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasSaveToGallerySubmenu.tsx:47 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasSaveToGallerySubmenu.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6e78773382eade551d4000194bf883f282a87dba8880b78d09009fd68855d2a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (8 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/fitBbox.ts:55 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/fitBbox.ts:65 \u2014 the two spans are one implementation copied and then locally edited \u2014 53 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/fitBbox.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d6c6e2c848ce9fb42db993df99dfc60ee701788393b27d3d418ff7868d511ac"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/GradientOptions.tsx:117 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/TextOptions.tsx:276 \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/GradientOptions.tsx"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b96d32d3bdc92a88a2c73beb1ecbeee1e618a5bd6d0bf451030b102de40a38d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/useBboxEditor.ts:36 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/useBboxEditor.ts:48 \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/useBboxEditor.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fa3896dd0d13d391ad468b0a06335314f88fc5da105efd33e8b56a5c23f7469"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx:82 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/RegionalGuidanceSettings.tsx:98 \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"acc60f566a37fe659011c75f79ef59b9fefda20a00aecb805492e8b04f81781b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx:676 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx:709 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx"},"region":{"startLine":676}}}],"partialFingerprints":{"codehealthFindingId/v1":"e807ba34ec0ae241807ed4be205ea4766190e41b1a152e811c82a2e2cbf8c783"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRow.tsx:132 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerStackHeader.tsx:74 \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRow.tsx"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dafb0f7eb95c68b3f74693b2cc861e3483b01191bb67e50f28b9c870ac17d82"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:324 \u00B7 invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts:833 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd6419380f1f55a73b700ecd823f5af5ce662deec9c7d70fd728f6a9768d08bf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 45 locations): invokeai/frontend/webv1/src/common/components/SessionMenuItems.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasContextMenu/CanvasContextMenuItemsCropCanvasToBbox.tsx:4 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarDuplicateButton.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarSaveToAssetsButton.tsx:8 \u00B7 \u002B41 more site(s) not listed \u2014 the 45 copies are spread across 45 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":"invokeai/frontend/webv1/src/common/components/SessionMenuItems.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"89cb364840feec600da41cc1ee1f9c15e9c95b9f5ce44696205af1548aaa1bf8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/common/util/uploadMediaAccept.ts:37 \u00B7 invokeai/frontend/webv1/src/common/util/uploadMediaAccept.ts:46 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/util/uploadMediaAccept.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"755610e5129c4a7963e2da912103941a3aec8abe9d803b9bb1ccd9548fdbb9c6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 10 locations): invokeai/frontend/webv1/src/features/auth/components/UserMenu.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFilterButton.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarInvertMaskButton.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarSelectObjectButton.tsx:6 \u00B7 \u002B6 more site(s) not listed \u2014 the 10 copies are spread across 10 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":"invokeai/frontend/webv1/src/features/auth/components/UserMenu.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"7689652e7eb6ad2fe5d45cf4a40b5f8bc26c5bd792752a4de73b9049e21df686"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/auth/components/UserMenu.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarInvertMaskButton.tsx:8 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolGradientClipToggle.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolGradientModeToggle.tsx:5 \u00B7 \u002B2 more site(s) not listed \u2014 the 6 copies are spread across 6 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":"invokeai/frontend/webv1/src/features/auth/components/UserMenu.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bfd90dc4673ad910ea9bcd02f2e0c057913dc7a3e4fa1a882d097e3adab9d21"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts:23 \u00B7 invokeai/frontend/webv1/src/features/customNodes/useIsCustomNodesEnabled.ts:46 \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":"invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ea58df48dd9baced0ab11b61673d0f9481ec6d4089f07ded787290bdc1e4a5c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 8 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsPreserveMask.tsx:2 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsSaveAllImagesToGallery.tsx:2 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFilterButton.tsx:5 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarInvertMaskButton.tsx:6 \u00B7 \u002B4 more site(s) not listed \u2014 the 8 copies are spread across 8 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsPreserveMask.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"fae3edbec8e000377b6b4c6c7cbd464cc93a1ef364956e0e703e534d1b3e8f10"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 14 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAutoProcessSwitch.tsx:3 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFill.tsx:17 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsBboxOverlaySwitch.tsx:3 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsClearCachesButton.tsx:2 \u00B7 \u002B10 more site(s) not listed \u2014 the 14 copies are spread across 14 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAutoProcessSwitch.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"315900697974dbefb7f0f549f84cda92ee9b4d402bc6df8846ae76ebe8223e6a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFill.tsx:19 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Transform/TransformSmoothingControls.tsx:12 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CompareToolbar.tsx:25 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsLockAspectRatioButton.tsx:10 \u00B7 \u002B2 more site(s) not listed \u2014 the 6 copies are spread across 6 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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFill.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"61abc3d29453fc18c1b004a3738a5c3d9657550a96f941dcb2b84c617e7b4aa8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterModel.tsx:21 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageModel.tsx:29 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterModel.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a02ab45bc02223e6925336cd9c06ecbe35d32bdb8c9110aa85f4dbb3d9cd3a1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsCopyToSubMenu.tsx:21 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerAdjustmentsPanel.tsx:55 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsCopyToSubMenu.tsx:24 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageHeader.tsx:43 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 5 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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsCopyToSubMenu.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc6b7bfa4387458db981cea2b78888d733372aeaa61c81e5bf9914159b4005db"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx:32 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx:147 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"4330056b8764a2921f254d1741dd8c94bd4d607dff83743b0169b3f169050fd8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/IPAdapterMenuItemPullBbox.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/PullBboxIntoRefImageIconButton.tsx:9 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/IPAdapterMenuItemPullBbox.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"698655136cd4851e370264a6901062894188990bc8eff5101815624c3c448884"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectModel.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectPointType.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectPrompt.tsx:7 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectModel.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"006421fc86a7208568766df838328aceadc0db6759afe89f0b6cb16ab1dd8e60"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsClipToBboxCheckbox.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsInvertScrollCheckbox.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsShowHUDSwitch.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolFillColorPicker.tsx:34 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 5 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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsClipToBboxCheckbox.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcefdb26a20e175e83e0349877df1d887487754554958988d0c296ad92b28697"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaAutoSwitchButtons.tsx:9 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarProjectMenuButton.tsx:5 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemMetadataRecallActionsUpscaleTab.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/WorkflowBuilderMenu.tsx:5 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaAutoSwitchButtons.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd0f7955eab5d1f468182247e37aff1b3bbe34e68d24865447b3c59454799b37"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 8 locations): invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityEnabledToggle.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityIsBookmarkedForQuickSwitchToggle.tsx:6 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityIsLockedToggle.tsx:7 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsTransform.tsx:4 \u00B7 \u002B4 more site(s) not listed \u2014 the 8 copies are spread across 8 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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityEnabledToggle.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdc3d828197ad64784640bb692d94b4821cb4ff5d3e0436439ffa28dfaad320c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/common/FLUXReduxImageInfluence.tsx:46 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/common/MaskFillStyle.tsx:51 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/FLUXReduxImageInfluence.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"14368c61d872f57c3b66ea8b5bdc636e3d74926d63ea558fe9355725f6ee0415"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts:220 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts:545 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"860241742ecf575719e76b35f2a617f99f70587021c7bb1eaceeac3ece5d4813"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts:329 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts:340 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8ba4cf984ad25587fad3e2d291c5545f0b8fd732e3708b607b34887d02df523"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterControlLayer.ts:24 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRasterLayer.ts:45 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasManager.ts:99 \u2014 the 3 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterControlLayer.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b8048c2f5666520e4611eb5a095b2364638400d9db5a18e6699db5bd51c6eb7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 10 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityBufferObjectRenderer.ts:130 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityBufferObjectRenderer.ts:139 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityBufferObjectRenderer.ts:148 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityBufferObjectRenderer.ts:157 \u00B7 \u002B6 more site(s) not listed \u2014 all 10 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityBufferObjectRenderer.ts"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"084bad0afecf5f4b0166a08f13e7a43af5465e04c4f73c420b62f92f630fcddf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts:114 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts:128 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"bab539cd0593eb079541ce9998a0ebee01fdb274d590109b8a3ff11732676439"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/pressure.ts:360 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/workflowImageExport.ts:161 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/editor/workflowImageExport.ts:222 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/pressure.ts"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"094f29fbc7481b071c72bb90069bbd3ac43bd5f9eb93d8e5e21a253aa552fa30"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:256 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:434 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:777 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1086 \u2014 all 4 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":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"803b8205752f1f43add3f5ab0b46515d49e955f58a2477f85c2e8873af066ff7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:394 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:401 \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":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"83929d111eea01a03c7566fd60f2c037df0cad9579894f1aa3474224478e071f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:483 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:493 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":483}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb5d0525de2e988410388e066983192b39610a846ae89475e68a5e0a49205fce"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:501 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:519 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"458b59add1577ddd335c2901d78c61b1362e3dd9220c8ab187df320d9ad6598d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsListSortControls.tsx:10 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowSortControl.tsx:15 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsListSortControls.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee108e54be5e15637afea36f286ea65b1310217a9a386271d29c4719ece8afcf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemChangeBoard.tsx:11 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemDeleteImage.tsx:10 \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":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemChangeBoard.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"453e58884699f447551a0d8aff1f0f2f94b1f65096a3df0ff0d233c904172895"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemFiltersSubMenu.tsx:26 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemMetadataRecallActionsCanvasGenerateTabs.tsx:32 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemMetadataRecallActionsUpscaleTab.tsx:17 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx:93 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 5 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":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemFiltersSubMenu.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"78615c0452fcf43197ea7ab6201067d761acce4e352fdf8578e7ce05819c7ee4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/DefaultPreprocessor.tsx:27 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultScheduler.tsx:14 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVaePrecision.tsx:16 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/DefaultPreprocessor.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"3da560e8e63c10c9210ddefb1b43a402a6ba40e06496ceb84b87e91f13b8e5a4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx:202 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx:210 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"64691fa6a54f4a121d7663076eae7ff74bfc35503f9fbd077418d5f74b278e31"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/modelSettingsIO.ts:25 \u00B7 invokeai/frontend/webv2/src/features/models/core/modelSettingsIO.ts:25 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/previewPublisher.ts:69 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/modelSettingsIO.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"efc5a6c99a2235072aff7399e9b56aed790f946c54c5de88ff3eaf4bf494a00b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/savedWorkflowFieldUtils.ts:107 \u00B7 invokeai/frontend/webv2/src/features/workflow/data/savedWorkflowFieldUtils.ts:93 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/savedWorkflowFieldUtils.ts"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"2adf12da53ad34c517fe2489e2de4a29b5110b51f539be9e4921f5d57aea2cf8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (7 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementViewMode.tsx:37 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementViewMode.tsx:70 \u2014 the two spans are one implementation copied and then locally edited \u2014 58 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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementViewMode.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"494d991ea885d0ea54823bd616ba905965115d63788f386e2136658cdd79fe5d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (7 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/form-manipulation.ts:194 \u00B7 invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts:1069 \u2014 the two spans are one implementation copied and then locally edited \u2014 54 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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/form-manipulation.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"73101f9f219ddbc8a1c05576514ac2cb9add077483fd4662c8abaa2bef2e9736"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldIsInvalid.ts:3 \u00B7 invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldUserDescriptionSafe.ts:2 \u00B7 invokeai/frontend/webv1/src/features/nodes/hooks/useOutputFieldTemplateExists.ts:2 \u2014 the 3 copies are spread across 3 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldIsInvalid.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"95612998a0233f98aa50bfd65da4cc322918fc6bd9c5f55745e9fcd9172b137f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/common.ts:268 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/common.ts:278 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/common.ts"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ef4065e394214da73d227ae996453aed7b07473e5c7722619d37ad7d00b6446"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/nodes/types/common.ts:289 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/common.ts:313 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts:256 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts:308 \u2014 the 4 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":"invokeai/frontend/webv1/src/features/nodes/types/common.ts"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"a01986bd611e5c632d7747b45dbdf4d41f1c18509fa56fd30dbad017e2b49599"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/field.ts:92 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/v2/field.ts:56 \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":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"d37f9906ead92a12dfdf5bb82bce49d3cd5d7df83a3387fdcf2338469d94f234"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts:131 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts:144 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebf437f3ab218e1cedd9f7bbab509e404acd427805af16db3d11e41cb0b4f2c3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts:41 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts:89 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts:81 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"c31a6df49813b5090a1e17aee103d6ffdaa049cf26e4b5475d1fa07ed5211753"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts:214 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts:305 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSDXLRefiner.ts:80 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts:111 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"47e3fb7e7b28005e4e49e6c81370b24c0340a7628c6b48b327b868658ef3f92a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:591 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:599 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dd8d858720f1ad3d5ac69f3e32b1d81da97f61e79beb73df6bf6382ad76f357"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:613 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts:253 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts:119 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts:254 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":613}}}],"partialFingerprints":{"codehealthFindingId/v1":"81e8a7f0db1bb6f89c3130ee3aa1080f6a5b8a59c4debcf157b8146597d03aab"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/node/resolveBatchValue.ts:140 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/node/resolveBatchValue.ts:149 \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":"invokeai/frontend/webv1/src/features/nodes/util/node/resolveBatchValue.ts"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"716a905761ee590db5290aab9a4c7912220fc2209d6c7bf23d5c6d4df806de15"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/workflow/migrations.ts:41 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/workflow/migrations.ts:48 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/workflow/migrations.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"95bc3caf81a9df86e5b9f2dba02046992e91fb1f15165ac2391107737ec6182e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileControlNetModel.tsx:68 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamFLUXVAEModelSelect.tsx:32 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEModelSelect.tsx:38 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileControlNetModel.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"17c99137c087a8a0c23af6cb2b7c15b2c97c5853f6a9286e0ebd5df10f9b8a74"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueListHeader.tsx:25 \u00B7 invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueListHeader.tsx:40 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueListHeader.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fd1858aebed7964abd1bd3a116a6b8e4734e522285129da2ed0e4116cfefe7f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/hooks/useRangeBasedQueueItemFetching.ts:25 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/images.ts:203 \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":"invokeai/frontend/webv1/src/features/queue/hooks/useRangeBasedQueueItemFetching.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3422290d4acbaae211150c7e594e4badd45101d67f0cd7b13810196bcbb6e73"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/stylePresets/components/ActiveStylePreset.tsx:20 \u00B7 invokeai/frontend/webv1/src/features/stylePresets/hooks/usePresetModifiedPrompts.ts:16 \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":"invokeai/frontend/webv1/src/features/stylePresets/components/ActiveStylePreset.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"00bad9322ced836deac5287b654094afd9a1eb2190a38d55f2ae251ff67e08cf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/system/components/HotkeysModal/HotkeyListItem.tsx:261 \u00B7 invokeai/frontend/webv1/src/features/system/components/HotkeysModal/HotkeyListItem.tsx:294 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/HotkeyListItem.tsx"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"85b4c9ea1644418ea6588d13c8d68463cfc43d980c673b8fd7f2e003b772c254"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/ui/layouts/WorkflowsLaunchpadPanel.tsx:81 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/WorkflowsLaunchpadPanel.tsx:90 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/WorkflowsLaunchpadPanel.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"95d3d4528aa73f98eed0e356def962b8835097b1557c73ae3471e1c6823395fa"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs:474 \u00B7 invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs:565 \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":"invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0a9807eaf232ada63a0be1c1fb92c502840cb2bfc1c371437ebfd4c8c72cb09"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:12 \u00B7 invokeai/frontend/webv2/scripts/run-project-file-journey.mjs:22 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is a run of MODULE-LEVEL DECLARATIONS \u2014 bindings the module declares and exports \u2014 rather than statements with a call site. Do not read this as an extract-a-helper row: a call expression cannot stand where a declaration was, and putting one there would delete the names themselves, which are what the rest of the codebase imports. What actually repeats here is the INITIALISER \u2014 the same expression shape written once per binding. So give that expression one name (a small helper the initialisers call, or a shared base value they are each derived from) and keep every binding under the name it already has. Where the run is an enumeration \u2014 one binding per distinct thing, differing precisely in the thing each one names \u2014 the repetition IS the enumeration and collapsing it would delete entries; consider instead whether the set belongs in one exported table the individual names are read out of. Reported because the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"549b34689f5027175dbb2c946787d8a387ef0c5a7f60edbd770fdf4c5cbff2a9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/run-project-file-journey.mjs:422 \u00B7 invokeai/frontend/webv2/scripts/run-project-file-journey.mjs:542 \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":"invokeai/frontend/webv2/scripts/run-project-file-journey.mjs"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"92f8d3798336d4a9f0f9aec80f3b94764d0346e3ffa8ce93107bebb754548b94"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/run-project-file-journey.mjs:503 \u00B7 invokeai/frontend/webv2/scripts/run-project-file-journey.mjs:599 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/run-project-file-journey.mjs"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a3ad6d40f23f4f4534588f490145faa9c6ad57f1a002d509e4d7739dc8511ee"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (7 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/app/WorkflowUiAdapter.tsx:121 \u00B7 invokeai/frontend/webv2/src/workbench/shell/topbar/useInvocationState.ts:107 \u2014 the two spans are one implementation copied and then locally edited \u2014 59 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":"invokeai/frontend/webv2/src/app/WorkflowUiAdapter.tsx"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"d31623e03c84d27194361181f73347988006788fde07f196ee1c46027e6df365"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (7 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/ui/useGalleryActions.ts:85 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts:264 \u2014 the two spans are one implementation copied and then locally edited \u2014 64 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":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryActions.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"412a443ad4494150d5beae9ae62e02163615e7536504688909541df1067687a6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 5 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:422 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graph.ts:943 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graph.ts:1026 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graph.ts:1428 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbda25edd138b5e89865cf26ab29b59470c863822a27e39fe9f19353e263c6b0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:1253 \u00B7 invokeai/frontend/webv2/src/features/video/core/graph.ts:766 \u00B7 invokeai/frontend/webv2/src/features/video/core/graph.ts:980 \u2014 the 3 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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":1253}}}],"partialFingerprints":{"codehealthFindingId/v1":"084d7aaed133b9d1e9c397377f7029156d5901166a81a177d4b9dce8f8ade882"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:1351 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graph.ts:1432 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":1351}}}],"partialFingerprints":{"codehealthFindingId/v1":"11e9922e5c685c4f733cb1cbda0be3260a253a05ff6637cfa0970108eb172e49"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/generation/data/architectureCapabilitiesStore.ts:49 \u00B7 invokeai/frontend/webv2/src/features/models/data/externalProvidersStore.ts:36 \u00B7 invokeai/frontend/webv2/src/features/models/data/startersStore.ts:31 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv2/src/features/generation/data/architectureCapabilitiesStore.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee9e63b3790329073ccb84e3654fd4daa4a89a6a2eca5d54a3e14729f41d2c13"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageControls.tsx:181 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageControls.tsx:191 \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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageControls.tsx"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"21bc69f7ae64c5560df59b86c8489b4379f4d80da1814a7bd6a39aab2fd3dc22"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (7 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx:120 \u00B7 invokeai/frontend/webv2/src/features/models/ui/install-queue/InstallJobRow.tsx:74 \u2014 the two spans are one implementation copied and then locally edited \u2014 59 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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"21db22333b7138fffaa90a98c2b9f7b26146ce35c81bf0e8d2a440ab421a45da"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (7 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx:120 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewActionStrip.tsx:168 \u2014 the two spans are one implementation copied and then locally edited \u2014 56 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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"366606bcde985488e7b465b140b3c5979c8e390d44d86294279a4962dee32c71"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/generation/ui/shared/ConditioningRebalanceBars.tsx:151 \u00B7 invokeai/frontend/webv2/src/platform/ui/HsvBoxPicker.tsx:77 \u00B7 invokeai/frontend/webv2/src/platform/ui/HsvWheelPicker.tsx:133 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv2/src/features/generation/ui/shared/ConditioningRebalanceBars.tsx"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"605933b963eee1e4a18a7e9cf497673d9eeb0077987b0ef593492defca67075c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/ui/library/ModelFilterBar.tsx:62 \u00B7 invokeai/frontend/webv2/src/features/nodes/ui/library/NodePackList.tsx:88 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/library/ModelFilterBar.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"363e6ed5eb76ee0a4cca1bc252bc4f2d4d360f35a11cd7a5da071f29c8105b04"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/data/submissionApi.ts:153 \u00B7 invokeai/frontend/webv2/src/features/queue/data/submissionApi.ts:260 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/data/submissionApi.ts"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ac00b500a9bf79909bd375df5befd0d2f744d140bf28d8369e9e48cd59ae442"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/queue/ui/CancelQueueItemButton.tsx:9 \u00B7 invokeai/frontend/webv2/src/features/queue/ui/QueueItemDetailActions.tsx:10 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/linear/WorkflowDetailsTab.tsx:5 \u2014 the 3 copies are spread across 3 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/ui/CancelQueueItemButton.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"39d60892c35f5264a51060944699835989d38edf2587d2930fe4faca30ffca05"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (7 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/core/batch.ts:369 \u00B7 invokeai/frontend/webv2/src/features/workflow/data/publication.ts:83 \u2014 the two spans are one implementation copied and then locally edited \u2014 59 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":"invokeai/frontend/webv2/src/features/workflow/core/batch.ts"},"region":{"startLine":369}}}],"partialFingerprints":{"codehealthFindingId/v1":"14caae34bd346508ad2561f920cf810e72ddd7af50f04fc79a2ad989a8b6bb8f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/core/callSavedWorkflow.ts:86 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/linear/FormBuilderTab.tsx:579 \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":"invokeai/frontend/webv2/src/features/workflow/core/callSavedWorkflow.ts"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2f5069b23ef4de91b8953499845f7aed320807da10128b6eb6efe98646c17ae"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/core/callSavedWorkflow.ts:224 \u00B7 invokeai/frontend/webv2/src/features/workflow/core/callSavedWorkflow.ts:312 \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":"invokeai/frontend/webv2/src/features/workflow/core/callSavedWorkflow.ts"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce014278f9d9dfc2a9f699b28e30e773c2e96cce720f7c7acafced4c252d3a96"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx:1182 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx:1190 \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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx"},"region":{"startLine":1182}}}],"partialFingerprints":{"codehealthFindingId/v1":"e41bb888b0ba8acc4727c73fd3dba417569bd302cdbf96b356e45c6741297438"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx:181 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/ReferenceImageSettings.tsx:246 \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":"invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e4a220ed397df5a2bf5cd636c87ef0faac1af6216c4168029c13f6f5b5f444c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/floatingSelectionController.ts:309 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/selection/floatingSelection.ts:135 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/floatingSelectionController.ts"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"60688903d88add68ba70f1faefdd93062c69b10704f4a90802170f6a0cea4cab"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/structuralLayerController.ts:83 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/useStructuralCommit.ts:208 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/structuralLayerController.ts"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e65f4436cd8832a774c39bdefbc44cdf4925ddedb2b57303c580c3ba114f2e6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/exportRasterComposite.ts:39 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/compositeForGeneration.ts:105 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is inside a TYPE DECLARATION, not executable code. There is no function to extract and no call site to call one from, so do not read this as an extract-a-helper row: the collapse a type offers is a generic \u2014 name the shape once, parameterised over the part that varies, and have each copy instantiate it. First check what actually differs between the copies: where they are a MATRIX of cases (one entry per input, differing precisely in the case each one pins), the repetition IS the enumeration and collapsing it would delete cases rather than de-duplicate anything \u2014 leave those alone. Reported because the copies that are not a matrix drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/exportRasterComposite.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"0115dd5c26d302485f6acd866adf3d5659eb895bbec89ddad2e6a1b7cab38d1c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (7 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/render/adjustedSurfaceCache.ts:78 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/render/groupSurfaceCache.ts:270 \u2014 the two spans are one implementation copied and then locally edited \u2014 58 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/adjustedSurfaceCache.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"42f05987d2caaed111e18febd5abe45a0f2140ab87a20b7af7beff12b5c3f0ef"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerCache.ts:307 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerCache.ts:373 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerCache.ts"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"05ac31562295963efa218c2f132131dc16f48a7af42cb794175c2e6e7ab11592"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionState.ts:347 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionState.ts:380 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionState.ts"},"region":{"startLine":347}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c7d9da16d60f8b41b6df14b6ff421d9c76c188fa3d0d44da783da38c9e4840c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/hotkeys/catalog.ts:133 \u00B7 invokeai/frontend/webv2/src/workbench/settings/HotkeysSettingsSection.tsx:52 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/hotkeys/catalog.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"f285566ab175bc83ff3dd2285619a1b6e8560d8d9e70a54ed3c5ebf80a8dcad4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx:1111 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerSaveToBoardSubmenu.tsx:49 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx"},"region":{"startLine":1111}}}],"partialFingerprints":{"codehealthFindingId/v1":"79e8ab3837e9fa68bd21e6befda3d284878bf341d3978a91c8b84f2e6dae69ae"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts:115 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/recallParameters.ts:95 \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":"invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"f859516f60aaaa81ab84ce665eeb9be318e7e3d38f40e84ca7624edc90ce6d06"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts:172 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts:147 \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":"invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e6b544b7a916c3dd35e6428546b622eed8cb5b30d734eeab85ac1f63d4e93e5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/image-actions/useDeletionConfirmation.tsx:148 \u00B7 invokeai/frontend/webv2/src/workbench/projects/components/ProjectFileOptionsDialog.tsx:83 \u00B7 invokeai/frontend/webv2/src/workbench/projects/components/ProjectFileOptionsDialog.tsx:95 \u2014 the 3 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":"invokeai/frontend/webv2/src/workbench/image-actions/useDeletionConfirmation.tsx"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"46105ba7df89f04e5b6d870e5c6024cf476003f8d58546cab40e8993192dba21"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (7 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/layoutPresetSnapshots.ts:188 \u00B7 invokeai/frontend/webv2/src/workbench/layoutPresetSnapshots.ts:202 \u2014 the two spans are one implementation copied and then locally edited \u2014 51 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":"invokeai/frontend/webv2/src/workbench/layoutPresetSnapshots.ts"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"a97aa74d93dfb7be8f5377df38a2f9ac2eb4b024c6cad3765b9e42e901eb7eac"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:430 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:461 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:580 \u2014 all 3 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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts"},"region":{"startLine":430}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4feb37b1c525a85c9b56b9618a74464d05c5a7b33dc021fbc872d423ba0e768"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:664 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:703 \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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts"},"region":{"startLine":664}}}],"partialFingerprints":{"codehealthFindingId/v1":"040b1c0c7ec6490b8315b62a2e29e4584d445cdde7717b0f6bd7049b8f2ffc08"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:267 \u00B7 invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:1203 \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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"b57e2849f3566c3aa13bd25e1a8904d4a002faaea4bb047ab64323d92651453c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:449 \u00B7 invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:512 \u00B7 invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:557 \u2014 all 3 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":449}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b66bf277d8aad534f509482a849368b6e6e91b25d3ce3244f9f657f8d7b0027"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/projectAssets.ts:95 \u00B7 invokeai/frontend/webv2/src/workbench/projects/projectHalves.ts:116 \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":"invokeai/frontend/webv2/src/workbench/projects/projectAssets.ts"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d18a3687cc30c6f9d7660c2494c1a989472267ff04bfe8532569d5b468df2cf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:382 \u00B7 invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:506 \u00B7 invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:616 \u2014 all 3 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":"invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1bfa5b5e82a09e8e52a3af6f4df343d891e23219d52f4d97eb88b90134f80c5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/useProjectFileActions.ts:115 \u00B7 invokeai/frontend/webv2/src/workbench/projects/useProjectFileActions.ts:167 \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":"invokeai/frontend/webv2/src/workbench/projects/useProjectFileActions.ts"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a18dea9f07c050e0318b19d1b8832656888c7fef9b30c27dc032a85b90e64dd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/queue-integration/queueRunJournal.ts:406 \u00B7 invokeai/frontend/webv2/src/workbench/queue-integration/queueRunJournal.ts:471 \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":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRunJournal.ts"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"6582c711a9aeb9b2b6fae7154730def25fd00212a5af830ffe0c63fd0f2f3e5b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/settings/store.ts:155 \u00B7 invokeai/frontend/webv2/src/workbench/settings/store.ts:172 \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":"invokeai/frontend/webv2/src/workbench/settings/store.ts"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f17c13f3efafb3af87d137a88facd27e21747d164059f6a3dc3629423c16a20"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/shell/CenterArea.tsx:315 \u00B7 invokeai/frontend/webv2/src/workbench/shell/CenterArea.tsx:332 \u00B7 invokeai/frontend/webv2/src/workbench/shell/topbar/ProjectSwitcher.tsx:262 \u2014 the 3 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":"invokeai/frontend/webv2/src/workbench/shell/CenterArea.tsx"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"9368d81897343c47a99a6ec838f524fd23baefb0925424a92a1fa2ecf0444d3d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/shell/topbar/AppMenu.tsx:243 \u00B7 invokeai/frontend/webv2/src/workbench/shell/topbar/AppMenu.tsx:265 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/shell/topbar/AppMenu.tsx"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e0c4c5f8aed8e09722432aabc4510c058b7028c2136621b7503dc6239bbca60"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/engineStoreHooks.ts:48 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/engineStoreHooks.ts:89 \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/engineStoreHooks.ts"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"7685f04f86e50de69cd4a7b2f3e53e5bb5bc3bc374bbd18bbcefcb40dd953422"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/selectionForm.tsx:38 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/selectionForm.tsx:49 \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/selectionForm.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7a44ebe564e600adcb7acf6210df0fb7494676adb18942547960950a92d7c53"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/auth/components/LoginPage.tsx:116 \u00B7 invokeai/frontend/webv1/src/features/auth/components/LoginPage.tsx:159 \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":"invokeai/frontend/webv1/src/features/auth/components/LoginPage.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6dbeafdd239ed69899c143f249f6400b2658827bb8de127f931c873c8a92807"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx:197 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElement.tsx:219 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"a24b59f6830d766bfff039f3a2fb280cdffa8b65183c122a189d7ded4eebe2fd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsEditor.tsx:44 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsEditor.tsx:50 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsEditor.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf2c3194c26155860d09d52ccd0798f013ed0e4f20f4c378749ea679445dabe0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsBooleanSubMenu.tsx:57 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsBooleanSubMenu.tsx:63 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsBooleanSubMenu.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e71259064ae15d5921fdc137ee19c0920067ad784d4f2404cd639c3fac69b03"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 7 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts:112 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBboxToolModule.ts:76 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts:74 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasColorPickerToolModule.ts:159 \u00B7 \u002B3 more site(s) not listed \u2014 the 7 copies are spread across 7 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8cf9e197c313b3cb6a6afbaf36c56a603c10de0117c47b9a2971084b673c739"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts:855 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts:872 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":855}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bca908f05b2b8b8b0f7fa77ebefa44a05e4ed085cb7ab37ddf0cd6b20362fff"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntityRendererModule.ts:128 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntityRendererModule.ts:136 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntityRendererModule.ts"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"546e1cd8098fbea75d40324ea51f3345c3be7ae246b40e0070c0ff3f402b9fbb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts:569 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts:642 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts"},"region":{"startLine":569}}}],"partialFingerprints":{"codehealthFindingId/v1":"060368e81a1257dd7552bfce140e161a4906d0bb2b7fa835b1a7ad47164136e9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:43 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:137 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c0b78293265c8b11df6e79c3154f963cb47d43a3d316e8e0991794221d7b687"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:122 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/common.ts:35 \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":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"5eed9940a37a4dfee57ad61ff9211a98803fe9a57bcc65df6e831cd6d2d575ee"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:329 \u00B7 invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:337 \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":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"237aa3e1325f4e0c61bc3532de793234169bd6173e16372065f04ba73a9e072f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/dynamicPrompts/components/DynamicPromptsPreviewModal.tsx:27 \u00B7 invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowFromGraphModal/LoadWorkflowFromGraphModal.tsx:68 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dynamicPrompts/components/DynamicPromptsPreviewModal.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"502913c1cafc29a59b2227bd8dccff7c5686db639e6562e3cff9029a1abe5c32"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardAutoAddSelect.tsx:43 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorImagesFromBoardSettings.tsx:121 \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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardAutoAddSelect.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"0759320b7315fedf18f9ad667f078f44da6baba5512bd780339e53c3880aefc7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/gallery/components/use-gallery-image-names.ts:24 \u00B7 invokeai/frontend/webv1/src/features/queue/components/QueueList/useQueueItemIds.ts:14 \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":"invokeai/frontend/webv1/src/features/gallery/components/use-gallery-image-names.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bb049891a5838617f45693b0ec4b31a558e255edd0946b61f01ffcd7ea165ac"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 5 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/BaseModelSelect.tsx:16 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelFormatSelect.tsx:16 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelTypeSelect.tsx:16 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelVariantSelect.tsx:13 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 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. There is one copy in each of 5 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/BaseModelSelect.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"6466133983ed9185bc76297b58d6e4a239635700890683f63b4654f280be73e2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx:548 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx:622 \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":"invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx"},"region":{"startLine":548}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a2092e66335754fa4bb02e81ce59a809ea2243f1216411beb8659cfd8e26607"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeClassificationIcon.tsx:57 \u00B7 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeClassificationIcon.tsx:65 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeClassificationIcon.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"88abb647df7e41ba18158d336cb31e5f4368a79db2bb5112286e9bddb365198c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (6 matched lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/UpdateNodesButton.tsx:28 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/workflow/validateWorkflow.ts:253 \u2014 the two spans are one implementation copied and then locally edited \u2014 55 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/UpdateNodesButton.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"5264178dcdca7aac03415ac0ee0c93ee17684e49f088f491e4492b32e5c269ba"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/hooks/useNodeUserTitleSafe.ts:2 \u00B7 invokeai/frontend/webv1/src/features/nodes/hooks/useNodeVersion.ts:2 \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":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeUserTitleSafe.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"6238800791bee06b0ff3e0638e52c7660e3e4a7faea7dc1bb521bdc4142fc162"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/field.ts:410 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:441 \u2014 all 2 copies are in the same file, and what repeats is a LIST OF ENTRIES rather than behaviour \u2014 the same entries written out more than once. Extract them into one shared, exported constant and spread that constant into each site, rather than into a function the sites call: a list like this often lives in declarative metadata (a decorator\u0027s options object, a static configuration table) that a build step must be able to read statically, where a function call is not allowed. Adding an entry to one copy and not the other is the failure this prevents."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b9ef411a20b09c0005d483f17a7e59b732f6f5b9a957dae46036a34837865c7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/field.ts:1067 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/field.ts:1239 \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":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":1067}}}],"partialFingerprints":{"codehealthFindingId/v1":"17c854c654b11f358619f26e96fee30aaedc28a40430a616131c252f342f7393"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/semver.ts:7 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/v2/semver.ts:7 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/semver.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d6e9eb06202ac006b9ec659b7574e1fdeff7c5d23cb42e5ee1cee0d6773031e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts:670 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/v2/workflow.ts:34 \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":"invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts"},"region":{"startLine":670}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd8aa6e9775afa0b52cc2c727149455f7b765b0afeedaad647e6ab223fbc0ed8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/v2/field.ts:43 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/v2/field.ts:60 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/v2/field.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e2ee52dcb98f5b016a32755328a5449e25b990c4844a101754244f4cefd1073"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 16 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts:157 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addAnimaLoRAs.ts:32 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXLoRAs.ts:31 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFlux2DevLoRAs.ts:46 \u00B7 \u002B12 more site(s) not listed \u2014 the 16 copies are spread across 16 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb23f619b0b888ff121ee3a86187e100e6f61d72b03acd945419b117d40be84f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.ts:185 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.ts:198 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.ts"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a304735dab090d10235f41d308351359e6a21adae6ed53beec561dae835d0bf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSDXLRefiner.ts:89 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts:144 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts:103 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts:159 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSDXLRefiner.ts"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"70a2cadc2393e965b24517713cbbd13c4475abf73c7dbf3639c4b39723c54f55"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts:225 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts:245 \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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"eacfe56e7a11ecb228fe5a5506c52501f5279ae30e11beda884809625ca4a72a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/nodes/util/workflowImageExport.ts:190 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/editor/LoopBodyBoundaryOverlay.tsx:40 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/editor/workflowImageExport.ts:249 \u2014 the 3 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/workflowImageExport.ts"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fb5a66d720ca5a51b34d90e51d0dbc641fc3f5d7d788e2ad9736a701f1a9a4e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx:140 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEPrecision.tsx:34 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"19f76453c6abe247c5a77474d190550b1319ed25c0f73e6ec2222315e437130c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx:132 \u00B7 invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx:176 \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":"invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"a43ba2d6b14b5c96d3943dd5c8ceb522406857c1fda7df2afa69aa89de8a229a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogNamespaces.tsx:16 \u00B7 invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsGenerationDevices.tsx:152 \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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogNamespaces.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bc957c5de91125225507d68fa7dea1b733f583bcac01356c0004122a42bc9a8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsMenu.tsx:45 \u00B7 invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsMenu.tsx:51 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsMenu.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"f33f089c0cb97ec114c32963757554dd2eff99e752ccf231666710a682bcba99"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts:352 \u00B7 invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts:366 \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":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"20468992eb78395d89595be7725b1faf9b0e0bcd207cd5d9e45eb93f8f8ffdf5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 4 locations): invokeai/frontend/webv1/src/services/api/types.ts:297 \u00B7 invokeai/frontend/webv1/src/services/api/types.ts:304 \u00B7 invokeai/frontend/webv1/src/services/api/types.ts:311 \u00B7 invokeai/frontend/webv1/src/services/api/types.ts:318 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/types.ts"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"26c43d399d9390a5edf5426a94b417cebd693617cf1282bfdb2eb7f3c41e70b5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 7 locations): invokeai/frontend/webv1/src/services/events/onModelInstallError.tsx:144 \u00B7 invokeai/frontend/webv1/src/services/events/setEventListeners.tsx:330 \u00B7 invokeai/frontend/webv1/src/services/events/setEventListeners.tsx:351 \u00B7 invokeai/frontend/webv1/src/services/events/setEventListeners.tsx:372 \u00B7 \u002B3 more site(s) not listed \u2014 the 7 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":"invokeai/frontend/webv1/src/services/events/onModelInstallError.tsx"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"3800200822f5f569404f24398e392a9c15d044dde4289877ec0a6d2ad39f12d1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/check-architecture-performance.mjs:28 \u00B7 invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs:30 \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":"invokeai/frontend/webv2/scripts/check-architecture-performance.mjs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"da3f1b4a55d8fdd09f8954f28d4d29c68c9f41dd95a6c10a58a0d7e6e8fdcc9a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3 locations): invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs:62 \u00B7 invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:12 \u00B7 invokeai/frontend/webv2/scripts/run-project-file-journey.mjs:22 \u2014 the 3 copies are spread across 3 files, and the CITED SPAN is a run of MODULE-LEVEL DECLARATIONS \u2014 bindings the module declares and exports \u2014 rather than statements with a call site. Do not read this as an extract-a-helper row: a call expression cannot stand where a declaration was, and putting one there would delete the names themselves, which are what the rest of the codebase imports. What actually repeats here is the INITIALISER \u2014 the same expression shape written once per binding. So give that expression one name (a small helper the initialisers call, or a shared base value they are each derived from) and keep every binding under the name it already has. Where the run is an enumeration \u2014 one binding per distinct thing, differing precisely in the thing each one names \u2014 the repetition IS the enumeration and collapsing it would delete entries; consider instead whether the set belongs in one exported table the individual names are read out of. Reported because the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ab2c976a590dd97b7af8b8e665fcf6949d30296581838533eae02bef0830569"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/mock-backend.mjs:565 \u00B7 invokeai/frontend/webv2/scripts/mock-backend.mjs:802 \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":"invokeai/frontend/webv2/scripts/mock-backend.mjs"},"region":{"startLine":565}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea3725ea2231bc52ea033e33e25dd6238a7e052a226c2201eccf3605cea1de80"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3 locations): invokeai/frontend/webv2/scripts/mock-backend.mjs:2412 \u00B7 invokeai/frontend/webv2/scripts/mock-backend.mjs:2564 \u00B7 invokeai/frontend/webv2/scripts/mock-backend.mjs:2573 \u2014 all 3 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":"invokeai/frontend/webv2/scripts/mock-backend.mjs"},"region":{"startLine":2412}}}],"partialFingerprints":{"codehealthFindingId/v1":"b022e50da6cf73578268247011ee0445cc7ba3d04c999fe77f0f036fe25c87a0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:1064 \u00B7 invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:1071 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs"},"region":{"startLine":1064}}}],"partialFingerprints":{"codehealthFindingId/v1":"171c3d7c2fc27bff5f96ce12122e0a456adecdf27b565c8b93d04e1f4e15122b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/run-project-file-journey.mjs:667 \u00B7 invokeai/frontend/webv2/scripts/run-project-file-journey.mjs:682 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/run-project-file-journey.mjs"},"region":{"startLine":667}}}],"partialFingerprints":{"codehealthFindingId/v1":"e46a16aec0d5666ae8bee64cf05524f8d6c88dd8168a147d56a6826162d48d39"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/write-contract-caller-matrix.mjs:17 \u00B7 invokeai/frontend/webv2/scripts/write-workbench-ownership-inventory.mjs:19 \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":"invokeai/frontend/webv2/scripts/write-contract-caller-matrix.mjs"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"f650f951679e1a9728b1e20fc8f9f7bd0107475bb3d8940b505ce6d84073803c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/write-workbench-ownership-inventory.mjs:89 \u00B7 invokeai/frontend/webv2/src/architecture/workbenchOwnership.ts:76 \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":"invokeai/frontend/webv2/scripts/write-workbench-ownership-inventory.mjs"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"853e9c0c808e255b5028f1d2b2b4fd2af246998b60a1d448515473d3aa48bafa"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (6 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/app/GenerationUiAdapter.tsx:46 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx:127 \u2014 the two spans are one implementation copied and then locally edited \u2014 75 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":"invokeai/frontend/webv2/src/app/GenerationUiAdapter.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"3caa764ddedebe307f3dcee427bf49e94dda059909b5afba3b529c839aa0a03b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/gallery/data/backend.ts:1192 \u00B7 invokeai/frontend/webv2/src/features/gallery/data/backend.ts:1209 \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":"invokeai/frontend/webv2/src/features/gallery/data/backend.ts"},"region":{"startLine":1192}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ebed88b80592bde5bbb6c56e32cd1131db43614e49acdd7fbd7d19580793ea5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts:904 \u00B7 invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts:1461 \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":"invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts"},"region":{"startLine":904}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbdb01fafd26619db6a11facf0b6d305b5d142e0262d365eea1a34bf86e3afd0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 4 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:620 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graph.ts:886 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graph.ts:1574 \u00B7 invokeai/frontend/webv2/src/features/video/core/graph.ts:331 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":620}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad3c1c9591b32347749110b7ea5695d0c565fb7b2c1316f46298b1d0678985ea"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:924 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graph.ts:1412 \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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":924}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d829f7e7b29551a530fc69a04b0b4ba7c00ced2a29acf6bdd4d26093f5a86b7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:973 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graph.ts:1106 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graph.ts:1533 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":973}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0cf1bc272062d0bec0e166eebc4af798ec7bff0190b7029b15484f8cff5ec10"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:1182 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graph.ts:1271 \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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":1182}}}],"partialFingerprints":{"codehealthFindingId/v1":"340366d21599db41e5dd10a477eff4e329ea90bc95013fe73b31ca0f0c395369"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/referenceImage.ts:306 \u00B7 invokeai/frontend/webv2/src/features/generation/core/referenceImage.ts:312 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/referenceImage.ts"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"550b67f9fb7e5a62f8613b3c228e85f61eff7ac1d0891ca183bd52b77cbcd31c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/models/ui/detail/ModelSettingsMenuItems.tsx:144 \u00B7 invokeai/frontend/webv2/src/features/models/ui/shared/ModelActionsMenu.tsx: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":"invokeai/frontend/webv2/src/features/models/ui/detail/ModelSettingsMenuItems.tsx"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f6d6979482d16d42c18d0fb0698c29c44ec099317e9518f0234edde7da83aa6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (6 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/nodes/data/nodeExecutionStore.ts:145 \u00B7 invokeai/frontend/webv2/src/features/queue/runtime/coordinator.ts:66 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is inside a TYPE DECLARATION, not executable code. There is no function to extract and no call site to call one from, so do not read this as an extract-a-helper row: the collapse a type offers is a generic \u2014 name the shape once, parameterised over the part that varies, and have each copy instantiate it. First check what actually differs between the copies: where they are a MATRIX of cases (one entry per input, differing precisely in the case each one pins), the repetition IS the enumeration and collapsing it would delete cases rather than de-duplicate anything \u2014 leave those alone. Reported because the copies that are not a matrix drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/nodes/data/nodeExecutionStore.ts"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"610505a056c76f51d3e0d2fb2470591d9f7b628f25007f39e166f3b35ffb6d2f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/core/historySummary.ts:67 \u00B7 invokeai/frontend/webv2/src/features/queue/ui/queueViewModel.ts:51 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/core/historySummary.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7eea1f6465a9f72662fd92a80ea30c94cbc049d02caf434b5111eb39acfae3b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/ui/QueueHeaderMenu.tsx:95 \u00B7 invokeai/frontend/webv2/src/features/queue/ui/QueueHeaderMenu.tsx:101 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/ui/QueueHeaderMenu.tsx"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"746e6a7ce6af2fcb09360ee8be1146fdf4be137803f9dc364bf4bda40c28e34b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (6 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/upscale/core/settings.ts:864 \u00B7 invokeai/frontend/webv2/src/features/video/core/widgetValues.ts:64 \u2014 the two spans are one implementation copied and then locally edited \u2014 74 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":"invokeai/frontend/webv2/src/features/upscale/core/settings.ts"},"region":{"startLine":864}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b4e027bcebe0917b04c8f7d602a47f7914250eb150d42e7544b4666fccf1a2e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (6 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/core/fields.ts:151 \u00B7 invokeai/frontend/webv2/src/features/workflow/core/formFieldSettings.ts:283 \u2014 the two spans are one implementation copied and then locally edited \u2014 63 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":"invokeai/frontend/webv2/src/features/workflow/core/fields.ts"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"217c1b3d447a3214c67e36741b9beaaf98005d2d995dda2f40c2645b200f32fa"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/core/workflowJson.ts:163 \u00B7 invokeai/frontend/webv2/src/features/workflow/core/workflowJson.ts:169 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/workflowJson.ts"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae7bbc22506e25bc9a57e6d59b74ac82808863ee41072ae1a84f3b19b4244711"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/WorkflowWidgetChrome.tsx:473 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/WorkflowWidgetChrome.tsx:510 \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":"invokeai/frontend/webv2/src/features/workflow/ui/WorkflowWidgetChrome.tsx"},"region":{"startLine":473}}}],"partialFingerprints":{"codehealthFindingId/v1":"537745e510d8b873020b91876dd1c4aec87fefa589098ceac7deb29a2a2399c6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (6 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/platform/browser/randomUuid.ts:14 \u00B7 invokeai/frontend/webv2/src/workbench/projects/ids.ts:8 \u2014 the two spans are one implementation copied and then locally edited \u2014 92 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":"invokeai/frontend/webv2/src/platform/browser/randomUuid.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb719c880637613528384e4398c4ffe035e79744fca2b84960f7568640ea1f16"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts:335 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterComposite.ts:319 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1816bde443661795011af076aca341fe0d0ccdea0cf5400ff676dd4e82a5a24"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/newRasterLayerController.ts:106 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionOps.ts:42 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/newRasterLayerController.ts"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"e924b247825b461dd7d65ace9f3522df428d3c2efff2325e80034f621c2f2b2a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (6 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/export/psdExport.ts:307 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/compositeForGeneration.ts:20 \u2014 the two spans are one implementation copied and then locally edited \u2014 83 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/export/psdExport.ts"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"7667a9dcb62466d397061bc0c62e439ce07ddc9d559ea7b4a5def090b6faa04e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterComposite.ts:122 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/generationCompositePlan.ts:121 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/generationCompositePlan.ts:253 \u2014 the 3 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterComposite.ts"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d7f3ada8c1d9b9cf84639ddfebc3cb780ad54734984b49c9f21a2638c5ec90b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/selection/floatingSelection.ts:93 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/selection/floatingSelection.ts:159 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/selection/floatingSelection.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"23468ee9ab626c922de22dd09cff172b90936fb69221880ace11b64e76bdd935"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (6 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/tools/marqueeTool.ts:42 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/shapeTool.ts:56 \u2014 the two spans are one implementation copied and then locally edited \u2014 83 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/marqueeTool.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"27b450c1c711fef3f6d3f2d02ccb2e1078f59a635377be661e13a799a6614330"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/tools/samHitTest.ts:96 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/samHitTest.ts:102 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/samHitTest.ts"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"e658f6b569bf6da00a200a83574df1563d38fa8cdd22b8e2bd783c34c1249c93"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-operations/contracts.ts:372 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/selectObjectSession.ts:51 \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":"invokeai/frontend/webv2/src/workbench/canvas-operations/contracts.ts"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"2875f4514b66325ee0fc01254469f827c3dcf81f99bb90df9f93478c49bbc452"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvasDimsSync.ts:145 \u00B7 invokeai/frontend/webv2/src/workbench/canvasDimsSync.ts:153 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvasDimsSync.ts"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec3c0ad6862c2bd78d15e46c18403e9ac387ee04238cd7fd9d01607941d06a95"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/covers.ts:58 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-presentation/propertyGroupStore.ts:15 \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":"invokeai/frontend/webv2/src/workbench/projects/covers.ts"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe00b0deb899c3105b7fca4a6ea2abb730fbce6ff7a1bc2ffaa69cc958a3ca5c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:368 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:422 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"f00ab16f6149635c1c9565f0a2c34c6fc5223bb9ac2f7d54cbad83bc66eefb4b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.ts:1148 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.ts:1172 \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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":1148}}}],"partialFingerprints":{"codehealthFindingId/v1":"420ccbc14273cf829573f5eeaab4887380cade1031ee2cd21af2c4f1850668eb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:936 \u00B7 invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:1030 \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":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":936}}}],"partialFingerprints":{"codehealthFindingId/v1":"d068f51736d819aa62a232a155103de1e68e62707100ce79fe8f0a3861aa618b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:342 \u00B7 invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:1387 \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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"027d681b57d8cf13cf5bcaefe61a8366a681aa8fae0ec803ee67db8a042ee943"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 8 locations): invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:370 \u00B7 invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:451 \u00B7 invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:514 \u00B7 invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:559 \u00B7 \u002B4 more site(s) not listed \u2014 all 8 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"d52f82271b543307c12b3a97b5ac1fc173a4143d5ae32d4baa53d8cfddd311aa"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:664 \u00B7 invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:687 \u00B7 invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts:711 \u2014 all 3 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":664}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba721e5edd57f1836d7b616c1c39352d7db768c597a08e90377b5445bf5c669c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/invk/board.ts:105 \u00B7 invokeai/frontend/webv2/src/workbench/projects/invk/manifest.ts: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":"invokeai/frontend/webv2/src/workbench/projects/invk/board.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"9aaf6d43509f6499427a039efbfd241e08917370aa0d23a5d474aea0a05b7f53"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 4 locations): invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:370 \u00B7 invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:654 \u00B7 invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:678 \u00B7 invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:752 \u2014 all 4 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":"invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ec3d92488c5994043b4fbce230fa4da08b524ca9b20fa6b7f6d30a3a12d147b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:694 \u00B7 invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:762 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts"},"region":{"startLine":694}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3cf68af46ca03fd8a82c87524eacc398fe644824530410195c39ddf7666db12"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:719 \u00B7 invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:735 \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":"invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts"},"region":{"startLine":719}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a919dffa340f3913aac30ce89d0a8d4e262bdbbd154dc24370fbaebb7c066bd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/queue-integration/queueRecallCache.ts:66 \u00B7 invokeai/frontend/webv2/src/workbench/queue-integration/queueRunJournal.ts:111 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRecallCache.ts"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"db36574f2da23961cdedc8d42057c2db657f1bc2a2bde611cc8c71eaeefcb6e1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/GenerateCanvasCompositingSection.tsx:69 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/GenerateCanvasRenderSize.tsx:123 \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/GenerateCanvasCompositingSection.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0631b3b8086f9ec9e717499b369c968306979fdf281dc91a85d0fa639f98d06"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx:829 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerGroupContextMenu.tsx:214 \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":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx"},"region":{"startLine":829}}}],"partialFingerprints":{"codehealthFindingId/v1":"76baf10aff4078222fca876225d1b5dc541657d3396f6d60c09b44ece1361b32"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx:1291 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayerSaveToBoardSubmenu.tsx:48 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx"},"region":{"startLine":1291}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c06eeaecf1a6dff9a9e4ca5c4aa8e8d31edf03bac5077b6ea89c399b5da3f78"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (6 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/layers/layerGroupCommands.ts:20 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/layerGroupCommands.ts:71 \u2014 the two spans are one implementation copied and then locally edited \u2014 60 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":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerGroupCommands.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"be6696d0f57ab6de46d3508375d31ca6d2d88d25b902c6b9751b9102537679fb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewMetadataPanel.tsx:112 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewMetadataPanel.tsx:121 \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":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewMetadataPanel.tsx"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"e148362e229c48f04d06974286ccf4fba55e62ff2beb21b49fd9f278f3be147e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx:110 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx:117 \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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1a40bbc4b40ad7f57f2514f7904012433fae88789945207953fdf938d1b7f42"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaItemsList.tsx:139 \u00B7 invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx:395 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaItemsList.tsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"087c0fa8eefa8d9643b4b5ec2f67f298766a2be07d8e63644924f07c51d57b1d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/state.ts:520 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/state.ts:606 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/state.ts"},"region":{"startLine":520}}}],"partialFingerprints":{"codehealthFindingId/v1":"065175bc15be9e1dfefe22644eec5cec1481a144126c6cb5482ebcf3dbc74b56"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/controlLayers/components/common/BeginEndStepPct.tsx:21 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx:140 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamFLUXVAEModelSelect.tsx:35 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEPrecision.tsx:34 \u2014 the 4 copies are spread across 3 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 4 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/BeginEndStepPct.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"2826c8e0397b9a73f1d5f7629c3091f8531dc05a2802d87cbb777bb1345462b1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts:424 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts:482 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts:527 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:407 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f39f837ef8cc567de43b01e3d2772c8d5e38febba8768bdee25f340ab11d022"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectImage.ts:103 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStagingAreaModule.ts:114 \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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectImage.ts"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"18384f7b00d0c56eb93449cbabc2876921e6f2591905c6de14eaa9b54432774e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3 locations): invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStageModule.ts:133 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts:416 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts:433 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStageModule.ts"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"abc280e9a02000311bba763f155301a9a480cbbe7846b809bc0253c30bae4f3f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSettingsSlice.ts:308 \u00B7 invokeai/frontend/webv2/src/workbench/canvasSchemaVersion.ts:13 \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":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSettingsSlice.ts"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"871c9b71fc1d8be9e70f0fae5e1be2cc63d9c285d07cabbc91bacba008a38eba"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1269 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:1289 \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":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1269}}}],"partialFingerprints":{"codehealthFindingId/v1":"82a66945bb773bc34bfb7115c12653a6c89d51406cd68f4fb89a1a963f1b48ea"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/filters.ts:129 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/filters.ts:139 \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":"invokeai/frontend/webv1/src/features/controlLayers/store/filters.ts"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8306aa480ed79900d3f656605f398da5981ba83d3907984b8f9ed88ecb31ba8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:970 \u00B7 invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:978 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":970}}}],"partialFingerprints":{"codehealthFindingId/v1":"abf1464f905cc0a75e776bdd46569c31afacd9973608b4ee4d037693dee7a8c9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/cropper/lib/editor.ts:710 \u00B7 invokeai/frontend/webv1/src/features/cropper/lib/editor.ts:752 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/cropper/lib/editor.ts"},"region":{"startLine":710}}}],"partialFingerprints":{"codehealthFindingId/v1":"9aacc58623e3dee4c8c3f48c809ac7eb46f78d53be1c25c9d44e48cf1555fd6b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx:168 \u00B7 invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx:174 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"46f9259b7f05935d17cef6018f16cd31768ab7944f7a8247397d9d7a3126a138"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/common.ts:9 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/common.ts:16 \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":"invokeai/frontend/webv1/src/features/nodes/types/common.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf028a3bbd7a36d163cb6f1d0c6830096b8e865d1c30ca95a8f773d32efe6fdb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/types/common.ts:318 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts:313 \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":"invokeai/frontend/webv1/src/features/nodes/types/common.ts"},"region":{"startLine":318}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8025c637e56ec702a59c80e3753a67df0e6022626fa708349c1122d24e8a58c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts:603 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts:656 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts:665 \u00B7 invokeai/frontend/webv1/src/features/nodes/types/v2/workflow.ts:36 \u2014 the 4 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":"invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts"},"region":{"startLine":603}}}],"partialFingerprints":{"codehealthFindingId/v1":"39fee5467d77c20f66baf906ebf092dd08f5eb28c85c81c7da8c958502d73ee3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts:214 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts:82 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts:109 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts:147 \u2014 the 4 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 4 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"61cac4a6d8efaadb891cdb55aa6f029f16add0159ace957b41276834edd127c6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 6 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addPidDecode.ts:157 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts:122 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts:189 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts:151 \u00B7 \u002B2 more site(s) not listed \u2014 the 6 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. There is one copy in each of 6 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addPidDecode.ts"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"5aad2b3a22a85b55a27a3b149d5c1f513f13ce4bd43cb460eb3d1f8434530d1d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:398 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:632 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e922cbab4401bea5f8480d91789c402ba6aebb509459ba6af95e68980608f84"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts:129 \u00B7 invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts:152 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c4e88553dffc52686f4d2725ccc42e577d7eec1791dea872371954ea2e8f9be"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv1/src/features/parameters/components/External/OpenAIProviderOptions.tsx:42 \u00B7 invokeai/frontend/webv1/src/features/parameters/components/External/OpenAIProviderOptions.tsx:51 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/OpenAIProviderOptions.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"49b88050eeacf17c6e78df97748ced7499bb90f800581bb4b094e85362c502b8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3 locations): invokeai/frontend/webv1/src/services/api/endpoints/appInfo.ts:19 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/gallery.ts:18 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/videos.ts:30 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv1/src/services/api/endpoints/appInfo.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e5acbbb5d7f02e4012fde992bd4ebd93afe9aa0e4d0d802ee815120de75e107"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv1/src/services/api/endpoints/stylePresets.ts:9 \u00B7 invokeai/frontend/webv1/src/services/api/endpoints/systemPrompts.ts:7 \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":"invokeai/frontend/webv1/src/services/api/endpoints/stylePresets.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6bdfabe09d2953068aaaf148f589cdc270badd6487746095281e249c91e574d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs:458 \u00B7 invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs:561 \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":"invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs"},"region":{"startLine":458}}}],"partialFingerprints":{"codehealthFindingId/v1":"1101af5f400c3b416a68e892f0abf1a92b83fc3bdbddb266967bb14fe0e54e28"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:1032 \u00B7 invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:1140 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs"},"region":{"startLine":1032}}}],"partialFingerprints":{"codehealthFindingId/v1":"139e72b7e603c43a6ce617ba06c4ce7d75ec38d566de353daa33734402bbef2f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:1079 \u00B7 invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs:1085 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs"},"region":{"startLine":1079}}}],"partialFingerprints":{"codehealthFindingId/v1":"37230975b645b15e87b70bb37753547ea5c7aaa635d2695b17bd09fbbbabd6e2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/scripts/write-canvas-import-matrix.mjs:6 \u00B7 invokeai/frontend/webv2/scripts/write-contract-caller-matrix.mjs:6 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/write-canvas-import-matrix.mjs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"be7a6bb6653886b490c1f5068435802cab70d5024d41066030749ee1bdcbd154"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/fonts/data/api.ts:228 \u00B7 invokeai/frontend/webv2/src/features/models/data/api.ts:62 \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":"invokeai/frontend/webv2/src/features/fonts/data/api.ts"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"37c154999cc5e5019feb17bba7e80d280b93b9c6d6704f53d8868bfd91125874"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3 locations): invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx:46 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/promptFields/WildcardsPanel.tsx:63 \u00B7 invokeai/frontend/webv2/src/workbench/shell/ProjectConflictBanner.tsx:37 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"5745d048ec801bb8df75e9d1aa88d1a2250f57442dc9cb795c4f93060fb9f9fa"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts:1661 \u00B7 invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts:1667 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts"},"region":{"startLine":1661}}}],"partialFingerprints":{"codehealthFindingId/v1":"72de7fdb5f046314010b31f65cb3f104be20ead30d9c251527e963755dfc228f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:719 \u00B7 invokeai/frontend/webv2/src/features/generation/core/graph.ts:843 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":719}}}],"partialFingerprints":{"codehealthFindingId/v1":"07d4e406c45c774ed482ade87fbf6d14023937e67f8fe8ebbf4ed4d437dff88f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4 locations): invokeai/frontend/webv2/src/features/generation/core/graph.ts:1336 \u00B7 invokeai/frontend/webv2/src/features/upscale/core/graph.ts:346 \u00B7 invokeai/frontend/webv2/src/features/upscale/core/graph.ts:448 \u00B7 invokeai/frontend/webv2/src/features/upscale/core/graph.ts:550 \u2014 the 4 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":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":1336}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1d9dd8365d23889e052a09ce2dace7c033d9f5e8f168e17229e865275619e05"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (5 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/referenceImage.ts:144 \u00B7 invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts:900 \u2014 the two spans are one implementation copied and then locally edited \u2014 50 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":"invokeai/frontend/webv2/src/features/generation/core/referenceImage.ts"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d5ba68b97d214da7d82f3a3311d350a87916d52dd6feeded086a339785b8f06"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (5 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/core/referenceImage.ts:3 \u00B7 invokeai/frontend/webv2/src/workbench/queue-integration/queueRunRestoration.ts:5 \u2014 the two spans are one implementation copied and then locally edited \u2014 60 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":"invokeai/frontend/webv2/src/features/generation/core/referenceImage.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"120103636d01e973703445752fa352ab16511d5ef19048ee009cd73887145d0f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (5 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/GenerationUiContext.tsx:188 \u00B7 invokeai/frontend/webv2/src/workbench/WorkbenchContext.tsx:295 \u2014 the two spans are one implementation copied and then locally edited \u2014 50 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":"invokeai/frontend/webv2/src/features/generation/ui/GenerationUiContext.tsx"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb66295b5253a5a4e8bd1c28599b9a87911710e955d3b15279b4261e9a09e535"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx:364 \u00B7 invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx:421 \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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"146abf44c2c72199ad8b93ddd0781d571a7ec9a980babd8e007b66249d3a2325"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageControls.tsx:211 \u00B7 invokeai/frontend/webv2/src/workbench/shell/topbar/RoutingDestinationSegments.tsx:30 \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":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageControls.tsx"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8a806efab4204d6af85f7c38b71ec8a8a98516e7ef1b3b169d4a775d71faa3b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4 locations): invokeai/frontend/webv2/src/features/generation/ui/shared/ConditioningRebalanceBars.tsx:154 \u00B7 invokeai/frontend/webv2/src/platform/ui/HsvBoxPicker.tsx:79 \u00B7 invokeai/frontend/webv2/src/platform/ui/HsvWheelPicker.tsx:135 \u00B7 invokeai/frontend/webv2/src/platform/ui/ScrubberField.tsx:527 \u2014 the 4 copies are spread across 4 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":"invokeai/frontend/webv2/src/features/generation/ui/shared/ConditioningRebalanceBars.tsx"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"11d0d0226f6a15f270bcb897911baa46a0176db3038f49664e69b846be8a2a7e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/queue/core/promptBatch.ts:246 \u00B7 invokeai/frontend/webv2/src/features/queue/core/promptBatch.ts:300 \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":"invokeai/frontend/webv2/src/features/queue/core/promptBatch.ts"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"957958e459f9f39cf3126fffe34658a9111b1b1665d9c56d11d8f4534ba0a53b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts:185 \u00B7 invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts:288 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb695993e7565f7f0775a64ab16ded1ba330f8fae8b4f5fc799f3ce037791216"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx:783 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx:801 \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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx"},"region":{"startLine":783}}}],"partialFingerprints":{"codehealthFindingId/v1":"c749da680d05989c08f2af50f293e49d203b75b9d916365dbabab08c85bdaa90"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (5 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx:171 \u00B7 invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowSelectionRequestRuntime.tsx:74 \u2014 the two spans are one implementation copied and then locally edited \u2014 72 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbf1f82cc7548580e873c09686f34f166844fc8e6d5505bf00e960ab069004e3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (5 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx:171 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/strokeSession.ts:164 \u2014 the two spans are one implementation copied and then locally edited \u2014 66 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"d15e56e10c86f4e7dbce3fa590655c70fb686d71eba02f2cfa8fac5c388d9f58"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (5 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/features/workflow/ui/editor/useEraser.tsx:35 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/samHitTest.ts:67 \u2014 the two spans are one implementation copied and then locally edited \u2014 61 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":"invokeai/frontend/webv2/src/features/workflow/ui/editor/useEraser.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"5491564cbec2b41d719faba2d6aa8de2db1c29071404aeeb9945d085f15c6338"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4 locations): invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDialog.tsx:101 \u00B7 invokeai/frontend/webv2/src/workbench/queue-integration/QueueRecoveryNotice.tsx:43 \u00B7 invokeai/frontend/webv2/src/workbench/settings/PreferencesPage.tsx:36 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/layers/LayersTree.tsx:185 \u2014 the 4 copies are spread across 4 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 4 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDialog.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"8192e23dbd5e44dcd839b4d1ec6aae73373eb8bed6ed3d178ee3856754546ac1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (5 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/platform/ui/hints/FeatureHint.tsx:43 \u00B7 invokeai/frontend/webv2/src/workbench/shell/WhatsNewDialog.tsx:58 \u2014 the two spans are one implementation copied and then locally edited \u2014 55 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":"invokeai/frontend/webv2/src/platform/ui/hints/FeatureHint.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9f24dfd77e71227da71108a2b3d0cf1acdd244f2e4dd435a671cbbb59a61f55"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/booleanMergeController.ts:93 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/extractMaskedAreaController.ts:149 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts:260 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts:417 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/booleanMergeController.ts"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4b373ecc330f4122309534fcfb15b9cb2ed55f2aa22d084cc47fd4566f870a1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts:147 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts:498 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/transformEditingController.ts:183 \u2014 the 3 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e2edadbd57c494ebfc9cb0ecf638c39c95ca1b15cb5bcc709f763ff9e7bf65c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 5 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/rasterExportController.ts:245 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/transformEditingController.ts:184 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/editing/controlPixelEdit.ts:104 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/render/maskFill.ts:56 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 4 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another. There is one copy in each of 5 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/rasterExportController.ts"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"89065ec7e75575b8a638457ed1bcac7fb5590c0dbecdb0df694c97aaec186b7b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (5 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/structuralLayerController.ts:173 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/structuralLayerController.ts:263 \u2014 the two spans are one implementation copied and then locally edited \u2014 53 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/structuralLayerController.ts"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"7312d2f8f4d368c6cefb88c0bd5c4dcb463adc4aa4172aa7e347877f6563debb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/math/rect.ts:11 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/math/rect.ts:36 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/math/rect.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"a61d89e8267bb03ccd4ebcc3959ebc6d3eadd21fcbdf52e09532e19b9821e2bd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (5 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/math/rect.ts:58 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/tools/strokeSession.ts:119 \u2014 the two spans are one implementation copied and then locally edited \u2014 58 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/math/rect.ts"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"1538f326e590df6c5e26ba32310282ed59338e6cf2fc90b9b88e235c2844cf5c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositor.ts:348 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositor.ts:447 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositor.ts"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fe891f46c0f9f3cf8a9734ae28d8ddd4833756a6e302ac772b90e8c4ff6e551"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/render/groupSurfaceCache.ts:146 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/render/groupSurfaceCache.ts:173 \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":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/groupSurfaceCache.ts"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdeee13329d995ec7def02a8a3bb77fd0d7748f11aefebaa5ea27e5aa0af01c7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterComposite.ts:266 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterComposite.ts:334 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterComposite.ts"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"1384a6e70d8e3073f515885d3a3eddb5f7580a1e9170d8f85aa6735580849155"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterizers/textRasterizer.ts:29 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/textFontStyle.tsx:8 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/rasterizers/textRasterizer.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"da71f9b3ca2e46c1c5c39d3e87cfacb3cb32e895d9cd3b0f91e27a7b58ae51b7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionOps.ts:73 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionOps.ts:80 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionOps.ts"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"5936bc978e479fe1a7b056f5d457d76aa25a9674e3f451003b85d2e523d64b54"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvas-operations/SelectObjectCoordinator.ts:261 \u00B7 invokeai/frontend/webv2/src/workbench/canvas-operations/selectObjectSession.ts:545 \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":"invokeai/frontend/webv2/src/workbench/canvas-operations/SelectObjectCoordinator.ts"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd25e3db81f195cfd9ee46610ddd9b4370e7e73b4dfee80cb3d29f7548fde78e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/canvasStagingView.ts:128 \u00B7 invokeai/frontend/webv2/src/workbench/canvasStagingView.ts:180 \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":"invokeai/frontend/webv2/src/workbench/canvasStagingView.ts"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"9740703b5d8f91957aba6fbb0a0269b40479e2ee9df273e1084210faa65a6af4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (5 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/floatingWindows.ts:259 \u00B7 invokeai/frontend/webv2/src/workbench/floatingWindows.ts:420 \u2014 the two spans are one implementation copied and then locally edited \u2014 58 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":"invokeai/frontend/webv2/src/workbench/floatingWindows.ts"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"841a97d662b8d85dda092cb22bff4b372dcdbe40c3a9e4a1f6c8d92f4f0e50c5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx:906 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx:918 \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":"invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx"},"region":{"startLine":906}}}],"partialFingerprints":{"codehealthFindingId/v1":"d423d07c1e593663801ae77f4a9f167f7efd5d2ffcaa57dfa2e03731d09f3f13"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts:247 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts:357 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ab29e01918b3ec65fc6f47277ff1e184202815a50dfef79075c374af5a135a6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts:729 \u00B7 invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts:210 \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":"invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts"},"region":{"startLine":729}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fe237cd1abcf83cd4aa1e5b72844ae3a530af1ddf55e8c1cb1e8c06ad3ccce1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (5 matched lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/image-actions/videoRecallRuntime.ts:55 \u00B7 invokeai/frontend/webv2/src/workbench/queue-integration/queueRunRestoration.ts:5 \u2014 the two spans are one implementation copied and then locally edited \u2014 68 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":"invokeai/frontend/webv2/src/workbench/image-actions/videoRecallRuntime.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e583c19a2974e10cbcab9177314667cdc987000f53446e5fcd2fcb5068e6c33"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/launchpad/projects/projectLibraryView.ts:11 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/invoke/canvasCompositing.ts:66 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/launchpad/projects/projectLibraryView.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d3ba11c836c04f0004dd7bd6fd1d198c7e88c4670850001dd8a0c0501e5b7c2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/palette/entries.ts:428 \u00B7 invokeai/frontend/webv2/src/workbench/settings/catalog.ts:114 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/palette/entries.ts"},"region":{"startLine":428}}}],"partialFingerprints":{"codehealthFindingId/v1":"99581a1e2171b88cfe584f0c349eade7d75478f7c608508c125ee1d5c10526e5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:70 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:77 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:408 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts:426 \u2014 all 4 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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"febd742d6ab7ff99e4805dd4c7668e985dfc15a4ddd590c08faa1a3171b52e23"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 6 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.ts:874 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.ts:879 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.ts:884 \u00B7 invokeai/frontend/webv2/src/workbench/projects/draftStore.ts:889 \u00B7 \u002B2 more site(s) not listed \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":874}}}],"partialFingerprints":{"codehealthFindingId/v1":"52c7447de2e46ffd8bb5f77ab234efd57a839a14b9aac927b225b1f0afbfc055"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/draftStore.ts:895 \u00B7 invokeai/frontend/webv2/src/workbench/queue-integration/queueRunJournal.ts:530 \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":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":895}}}],"partialFingerprints":{"codehealthFindingId/v1":"80335052f691980bfd3c57d870e303a027811fd66e1add4dbf218ee9a6aa10e6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:1215 \u00B7 invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts:1416 \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":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":1215}}}],"partialFingerprints":{"codehealthFindingId/v1":"cac2596b2b1149cf89e6eb51c92634dd698d5d27e03d7a6a4a5b8d910cf60b42"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/invk/duplicateProject.ts:213 \u00B7 invokeai/frontend/webv2/src/workbench/projects/projectFile.ts:419 \u2014 the 2 copies are spread across 2 directories, so the shared home is a decision rather than an obvious spot: check first whether one of them already owns this behaviour, and otherwise put the extracted module somewhere all of the sites already reach rather than making one of them depend on another."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/duplicateProject.ts"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd492331499db3dfe5d97860a1d8cc6f72014eb426b3f4b683583d7a99374868"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:648 \u00B7 invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:714 \u00B7 invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:731 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts"},"region":{"startLine":648}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8a401e62a0680a1fe1ca23377a6055f995653fcfff6fc3996eb724e5cbfca1b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:810 \u00B7 invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts:826 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts"},"region":{"startLine":810}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7ed5055017f10686d847d5a492ef06c4f6337d6e551fda8acb13ba2474eddb9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/queue-integration/queueRecallCache.ts:178 \u00B7 invokeai/frontend/webv2/src/workbench/queue-integration/queueRecallCache.ts:234 \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":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRecallCache.ts"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9733e7d7ec8f66cdb197f8a52235beb1257d2d66c76d0b2b96c5af382aac6c8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): invokeai/frontend/webv2/src/workbench/settings/ImageMapVocabularySettings.tsx:53 \u00B7 invokeai/frontend/webv2/src/workbench/settings/PreferencesPage.tsx:36 \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":"invokeai/frontend/webv2/src/workbench/settings/ImageMapVocabularySettings.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"e76c099e6e660a83635229bba8cbdf6a0272a3cf8dc2f16fb7857e9f873527f9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasCreateFromBboxSubmenu.tsx:33 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasSaveToGallerySubmenu.tsx:38 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasSaveToGallerySubmenu.tsx:46 \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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasCreateFromBboxSubmenu.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"178c386be3ae81859b4818048aa0d4de2621f54316a1240a15b31f2d274ee7d6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3 locations): invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasHeaderActions.tsx:148 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasWidgetView.tsx:491 \u00B7 invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewWidgetView.tsx:620 \u2014 the 3 copies are spread across 3 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasHeaderActions.tsx"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"44216c90b4176a131e6cc934fd6d5317ff81ce769e22005ba867f8eed5fc57df"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/auth/components/LoginPage.tsx:16 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/LoginPage.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc921c2b0312ceeb9cfb6356b006d350978ab80755687044c62ce51a4f8ab879"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/auth/components/ProtectedRoute.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/ProtectedRoute.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a3ea0e2dce0956d5dbc022bc49da52cd57562a84f2ec525d8679c0b54460541"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/auth/components/UserManagement.tsx:38 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/UserManagement.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"01b1dee19d5511867e3b37af3ea68e2a703c645377b4c22dd8eff2715f77537a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/auth/components/UserMenu.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/UserMenu.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8b4c2c5f325acc46b6eac2b1b09a3d8307fd8b1b6751b4d750c1c043654f45d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/auth/components/UserMenu.tsx:6 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/UserMenu.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"af9328fae0c82abfa2d05043e76720e3a21342406fbd9b228bf385a91f34d159"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/auth/components/UserProfile.tsx:22 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/UserProfile.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"60f9c8a742ed4d885dd941455eb833459bf6bf54ab3ed04fe139719b7a4b717d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"55e6f6c46b4edf02c2164ed74ad0c51d94c04dbd2f399440a343255705d6529c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/auth/hooks/useMediaCookieRefresh.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/hooks/useMediaCookieRefresh.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0fcf05de5364ab21464383ab50cbaa0c0dabafb960ce38192a5e918f926eecc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"34854edb5222e3d3d3d56c5a2a704b6cec58154a53c6b617755dd2ec8ff3acee"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx:6 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a49a6fbeded14b4a8f10234c1efe1714fcfdff1f7b1fc7fdbb8c28bafaef77d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx:7 imports invokeai/frontend/webv1/src/features/auth/store/authTokenRefresh.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9aab6fd208560a2505971a7901af066a23f379507016a9952e4c2ca4d4d9ffe"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx:16 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac240954c1136574f9dea91cf4e297e88e799dccd4e11b37e1ab474cb1b611aa"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx:17 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"5683791d54f751dbc7e21bf280d3d24be6bbaf6a4cef07e73f70ea9f5b05f584"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsInvocationProgress.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsInvocationProgress.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1526d6e625069163524e483768c2c5aa411f2994921f66eca0041c7baf68402"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsInvocationProgress.tsx:5 imports invokeai/frontend/webv1/src/features/system/store/systemSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsInvocationProgress.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b5113b533b84ee504302b975968d33b3423870be85e15fde6d3731a8b23e079"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsPreserveMask.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsPreserveMask.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"67a4cb25f20627b1a9360115c06f6e9d8c9436b5813f9fa7a228ba7ac0560464"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsSaveAllImagesToGallery.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsSaveAllImagesToGallery.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d028a82a1dc041483109a0f1911f97d1e411003e1b2b182ad74248dbf40f2514"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsSelectedEntityStatus.tsx:5 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsSelectedEntityStatus.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"04ff679d7ff7086367abd56d9db62793b8ea55d755859bb75519724564e4334d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAutoProcessSwitch.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAutoProcessSwitch.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a82215ac8fd1082ae0bd8968a0c6a103506de69d1fb39ced85b9c5a757cbb89d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasContextMenu/CanvasContextMenuSelectedEntityMenuItems.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasContextMenu/CanvasContextMenuSelectedEntityMenuItems.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"47e911f4069afb5c5d34a6e7230c9f47a17e543eb16169e925da21e45ce15791"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasDropArea.tsx:4 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasDropArea.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"86534803fb12900476d5fcf232152d73e2a2eb9210ed15abf98d58fcd55e4485"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasDropArea.tsx:5 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasDropArea.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"678d744005c0e5896c57748e9b3cdc01fbcf02f4b19c8cc494f4ccde58bc43a2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityContainer.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityContainer.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c035341bb72312eed4e54656ccbd3dce04ad868cd3c5c087474d42bfe5798484"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityContainer.tsx:8 imports invokeai/frontend/webv1/src/features/dnd/DndListDropIndicator.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityContainer.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee622e615e24716f8f7c9f4fc16f159ca9bbee80817108e7814691c1a11c31d2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityGroupList.tsx:5 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityGroupList.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"16f8362376e2576e88d48b593a83482bda4a0df0c2687081c5f68673de82f802"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityGroupList.tsx:18 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityGroupList.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8fbb685459ec81cb531b73d40aac5d71405c752033289071de88d4e0313e7cc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityGroupList.tsx:19 imports invokeai/frontend/webv1/src/features/dnd/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityGroupList.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"aebe7e42810c013dd4139387bc3fed81bc88e1c073ff178c5f7b6377ee60d332"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarCompositeOperation.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarCompositeOperation.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a5790fa3b1a9c232d825ced0520a112e109891077aa7ec799e9f71c3588e1c7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarDuplicateButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarDuplicateButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"788ed4f99f1666b45246b4ce145a4911c2fe4717d1b6ea0b0bf392656d7ec880"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFill.tsx:11 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFill.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6d80024db25aedbfd425801343f9dee0d15610f5165971ed91c5e340b6e4aa8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFilterButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFilterButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1e52d87e179da5c3bf3278a9aa3e45752a667c4eb67c66bb8411fd78b29256a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarInvertMaskButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarInvertMaskButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"76ec05e61407bb324e6edf12b3074889f3a5618a1fbe8f8519d063683e5ae3ff"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarOpacity.tsx:18 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarOpacity.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"eefda4cb944051f80e083d7cdfc7e38640d3189f365378b6bab7ece1256aa2dc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarSaveToAssetsButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarSaveToAssetsButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cbb291b726feeaac6e5e4e4cb3d26bb25f9b3712fe0c4b9e18b06ff4d0a1bee"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarSelectObjectButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarSelectObjectButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"2931b19750e687e5df32e8139d92080ff1c5ef4b44d52d6a580024b2149cb82a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarTransformButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarTransformButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f758a42de26c12dce33db615926a65f9be41fff84f773b970f159921d8af430e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/useCanvasEntityListDnd.ts:5 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/useCanvasEntityListDnd.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"3760bdced7a68e7637e7c5b2228ae3f1316ec9f7f0967d4c44d4a827b749fa7f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/useCanvasEntityListDnd.ts:6 imports invokeai/frontend/webv1/src/features/dnd/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/useCanvasEntityListDnd.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f4a308ddd71ab97e1722b1b11be1a99e36802ad22666951b91f2c2be69deb0e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/useCanvasEntityListDnd.ts:7 imports invokeai/frontend/webv1/src/features/dnd/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/useCanvasEntityListDnd.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"7612275227f93828bed684480bde8a03c4d53c30020afd94b3452e77050002eb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasLayersPanelContent.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasLayersPanelContent.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3420704a34c17ed53d8f16b05bfa74139687321dda91f2ec7db8136f3c48e71"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasOperationIsolatedLayerPreviewSwitch.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasOperationIsolatedLayerPreviewSwitch.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"af9d27d2147e243079e2015d5c7268506585a588a8c73d72ab081dcbb81381e0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasPasteModal.tsx:13 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasPasteModal.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"be1027f6c4d01683df730b6635d224e2d2218af350b595399858ebf0c8341308"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasPasteModal.tsx:16 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasPasteModal.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"80e10fa3f183f7711fe90887d98d89bfe38f15ddd4518907d387d3ebc78e8dd7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasPasteModal.tsx:17 imports invokeai/frontend/webv1/src/features/imageActions/actions.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasPasteModal.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcc6d416febc5e70dcd4b19de2feec9a130e81b3d20fe802c89a268de7443e0b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasPasteModal.tsx:18 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasPasteModal.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"78ea0b4ac6a886cc8f6418bc81fa9a807b5cede52c6473bed24a56821e616d26"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/CanvasWorkflowIntegrationModal.tsx:17 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/CanvasWorkflowIntegrationModal.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"fea850b2b21fb3f10fcf716cc4b1812b3ab02df817a115cd31ea2eb29a6aba77"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/CanvasWorkflowIntegrationWorkflowSelector.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/CanvasWorkflowIntegrationWorkflowSelector.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"742aba49be0b4e201920f4264435c864b0d8b4b5dd489a01ff8f18349d0610ad"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx:17 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"02c88eef3cff453ac9db880931f99ca214899884a054244f6d4b8a8e0e7e88f9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx:18 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ee7e4c3c6b37e640af91dccc44cf44bf73eba170032c0dbe5693cef4c205b9d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx:19 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"1effddf1c55f703b69c1d4d69fcfacf6eaea41e80a166626710b8aac014371dd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx:28 imports invokeai/frontend/webv1/src/features/dnd/DndImage.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"65cac4f41bfd0d3857990d17c3015dcb628a2a8db54d20e5f780c3a7e8b02030"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx:29 imports invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"48292cfab75eff4b2a3bf0b95ede9e07ccf5ff9f6634661d4d9a53fe4949633e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx:30 imports invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"80252247160f05791f35936f09f0ec958620a676a7c793b1110c090d25f517bc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx:32 imports invokeai/frontend/webv1/src/features/parameters/types/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"12c9000f94650fc2784a1301adfd2ea0b18c65eaa664b408b678b136b3d3b465"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx:33 imports invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"57d9b353aee90910ab1783b027de44f30cca1f118957f17208e40b18d251a2e6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx:4 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"043ae0176ae85dedab392e00d57e11132e4cd8a987afe4c1df4495a20e7c4e1a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx:5 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e1b3724305a1287c5a8d7e8331ec11ab95b6cd00a56abe45a50109cda85eb91"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx:13 imports invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/contexts.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5f5111ddd9b4c91c79ad1e2e152aa2107e8cdd85891d022962f752419452405"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx:19 imports invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/DividerElement.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"07d515989b753b3960754f47e4cd1c44b6f810cb6cd2703edf6bfc62fc72d3e7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx:20 imports invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElement.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e8df23685e7100d4ff3b557ef9b7f1d74edddb2626515289ae34bfbe151cd91"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx:21 imports invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/TextElement.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"41ebe4fa5b1a651730ec0b00ba6d83be2e660eaba48d666e4f36603ed133622f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx:22 imports invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"09e0ba432409803f4b0aced067b299f6db78866d7aa6f4eeda630816bf6e71cd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx:24 imports invokeai/frontend/webv1/src/features/nodes/types/workflow.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fb2b385b29f5607a43df9e4b0d39d3f6d392868e76af7843ab3c669e815f7b7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a55933c854468ad7b1ef039701ce870de01fde94d675d2061ef6faf8c7eb545f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"712908599bcff607993ac36e1bbd154d4996e060095f65855382caea4b84b083"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx:14 imports invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"30bb4336e16e5e3c7e890d4bd0922b65a1cda65f93f1e615dd14fff40b683a32"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx:15 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"88322d74bb2cef8795e2302d8b515a8dacfd230b597c72206c090cc1dae077db"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useFilteredWorkflows.tsx:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useFilteredWorkflows.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"34f0ba70781a8cbb6fa9d5a999aa9a79e21005dd51194057faecfc4d568c438b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useFilteredWorkflows.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useFilteredWorkflows.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"7173c1c8b789ed38a7fd70f269a50244b8741c5ab5bf39ed0eef22aaa50cfe18"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/workflowHasImageField.tsx:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/workflowHasImageField.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf5522a2fe5437bfa5163001db9d450f19331da6b4d10ab97ae6a858a3cd992b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/workflowHasImageField.tsx:2 imports invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/workflowHasImageField.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f8ee47bb1ae16e90b36bdcd6a64d1bed789583a1b1d2d8ef872b05bdd3b1e6e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/workflowHasImageField.tsx:3 imports invokeai/frontend/webv1/src/features/nodes/types/workflow.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/workflowHasImageField.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f0109d9104c1c50f5cc80e44acde5d32c9145f804dc59a220e1b6f0bdbb2fda"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx:16 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e307c4bb77dddff3e3730201c367e883a182b00613d10117d77b28627a27d0a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx:17 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"395a2672e1075b6fcd0ff9d355afd0df5dc70303d40568c1192bb6062ccdd6a7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerBadges.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerBadges.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"f205362419c463a8318835ea2d2255c83610dc22c89d25846008f56434b92852"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapter.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapter.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"3faa648da085c7832da236b92f2bee6b09a27f127014cb663a338e31b01cc0d7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapter.tsx:24 imports invokeai/frontend/webv1/src/features/imageActions/actions.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapter.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"d47c0e06a83e7097ec763548b09fea39016c61126a14f16751a93e8899eccc68"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterModel.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterModel.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a90b954569d91eeb951617ae1c08e6f9c11f7816d29e23b077d2a9252d9c9a18"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerEntityList.tsx:2 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerEntityList.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e7dc0d16672bce7eb571255de1de2e15bedf64af09c316f5a4374d076c75446"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerEntityList.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerEntityList.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"5adcdd0571ee8a58374c460b3734ea10f44acb6614fd54e01a255c35f7921fed"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsConvertToSubMenu.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsConvertToSubMenu.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc33a4429948e8a1f816ce9c5edb984800d4ef582d0f93654ee61eac584e3322"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsCopyToSubMenu.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsCopyToSubMenu.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff3ebeec2788927e62d56c3c8b62bf4752cee2f98e9fa9293e8d666199c4b5ae"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsTransparencyEffect.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsTransparencyEffect.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"85c4fa9d0c1b511e4695a15320f9d06b583b118c6d1bb544848ca1a564bf8315"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerSettingsEmptyState.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerSettingsEmptyState.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a14209e4b7d34eabf0a56c0cf323bbca1e7554de8d1077bdc315882456f18c8a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerSettingsEmptyState.tsx:7 imports invokeai/frontend/webv1/src/features/imageActions/actions.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerSettingsEmptyState.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"0410b2a1b8d4a483d34fc67faa1c3513ab265b7c99b02b6b3790b5e00eb3bd2e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx:15 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"659cbfeffe2af8d052f9659449a7184ccef6524bc6f8a48d29133272a5be9084"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx:27 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a585fcf3244d8dd7a921ad11fc687dea21a52217158f11c2be35d0d07607c12"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/HUD/CanvasHUDItemBbox.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/HUD/CanvasHUDItemBbox.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2dc0f552a82f7240904b150b266a42345d0211870f43328688e85f1e4d02c80"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/HUD/CanvasHUDItemScaledBbox.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/HUD/CanvasHUDItemScaledBbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"991ce4a63d0b72d6f40347b320e0d004ef021041b69c2a9e0a34acf42a178798"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskDenoiseLimitSlider.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskDenoiseLimitSlider.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"231b83562212d10aebb7de3fda22736160660d5f6971123f5182da39396a2b9f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskList.tsx:2 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskList.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"890c940112a6323b86fc90e7cff8a6baa925ed2bb018e5fb18cf3bdf9d7a5997"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskList.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskList.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"9162c894db9f975a845b3d222147ff97a0203c821cd27e10aefaab8b750c1d90"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsConvertToSubMenu.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsConvertToSubMenu.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"b497deb8f65a38cd45bcebc063b13df7b2291404b5017cb239fcc7391e79784f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsCopyToSubMenu.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsCopyToSubMenu.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f417807459c506bf400a5159b28eee8e829a678dcb2c8a8769cad7c8f824a8b8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsExtractMaskedArea.tsx:2 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsExtractMaskedArea.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"5735375ee2f72429a905cf084021addb1120f2f69653c54cfff4760235a566e3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsExtractMaskedArea.tsx:9 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsExtractMaskedArea.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"89c79325ece7302a5f7243db82acaa4a279b941c2793b663c1ef58e3336862d2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskNoiseSlider.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskNoiseSlider.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"e70a1b62b3245f9aa8c1ea1714a829df4c9a4f07e4d5a8588ec1cf3c500f1f81"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskSettings.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskSettings.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e16cf9da280472dd6c1bea394abde39da97ab1d5accb17186f484fe7c84ea8dc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/ParamDenoisingStrength.tsx:11 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/ParamDenoisingStrength.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3c83adf6d17106ff602e5233c62816800747ac0c887a0fc7df4979939e09497"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayer.tsx:15 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayer.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfef73e20cb7a5313ba9dfe6e4854ceed3f9e34239a736c0a0656e7c59494d20"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayer.tsx:16 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayer.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"c82517108ef42a283f90ae901318f9d9aed46a21580f5b700bb478acbe71553d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerAdjustmentsPanel.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerAdjustmentsPanel.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"a010e3adb053dbd923a9af774cd2ddb54b34606ff3467b3a549aaa85be65cb51"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsEditor.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsEditor.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb31c66b2da6ae8caafda3b66f75c2bc408bf93cb1f868081db31af4746ccf8f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerEntityList.tsx:2 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerEntityList.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"64e7447f307c909fe7a0d8b103e8b4235339da1a3f09c58a9fa8bb9139302825"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerEntityList.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerEntityList.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8a4e356a40f85abf4988336dd71b635b270a828723ac97d2fa819d1c721c2e7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerIsTransparencyLockedToggle.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerIsTransparencyLockedToggle.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"0270df5811ca7909440aaeb0f035709e019cb915097df58041d3197143c20071"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsAdjustments.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsAdjustments.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"6009f924f0d7cf8c89a9631efc4cbd611c61dba2a9be06fd61c7ae4df88b9e9b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsBooleanSubMenu.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsBooleanSubMenu.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3d6c316c567809e8b1f608672054a6257de1065bd653a424f81858c511b0d14"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsConvertToSubMenu.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsConvertToSubMenu.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"da3737837adda476da1afb3c8cb935b6372ce6b05b020fecc72861256239496c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsCopyToSubMenu.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsCopyToSubMenu.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"47cebf454b634b88296062d90263860d5775f5d07e482822986170ebbdd21df9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerSimpleAdjustmentsEditor.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerSimpleAdjustmentsEditor.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"78da8ab9278b5e8039906ee832b6a8453795e9977a9424e7a51d77cc741f9652"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/IPAdapterMethod.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/IPAdapterMethod.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a2676317b3528b72199009240fd63ca9f275cf3c0fab90a61fc1c9ef78d93f1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/IPAdapterMethod.tsx:7 imports invokeai/frontend/webv1/src/features/system/store/systemSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/IPAdapterMethod.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"193fccd9ea836090b986e4098b8f1e64f4cd08567c67c8162a77f6020a297dbb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageHeader.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageHeader.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf55d7e7c95a536321093b6095becd0d6b87b0e7f1883f909ecded36ffd11e1a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx:5 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d802d60135510cc79da2f4d2c439fea6653236fb9c6b3a67f46c8645425dd6e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx:12 imports invokeai/frontend/webv1/src/features/cropper/lib/editor.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"d68b2ace9a695ff6b5b035b07f1645b2e57a6b520234758087ceecb9a3926e68"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx:13 imports invokeai/frontend/webv1/src/features/cropper/store/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"fff30d5a2e80418364c08acddafcf53c477c16100022c3e845b165bf00728898"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx:15 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce7d180cdd14611d002fb5f2710d8c9f0097d94c66837c085b2af43fc04130f7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx:16 imports invokeai/frontend/webv1/src/features/dnd/DndImage.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"e013a5b6a5a4df8839c89f688317859adc5ab354eac899c2669157170ccee89c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx:17 imports invokeai/frontend/webv1/src/features/dnd/DndImageIcon.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"15ffe4cb9c8d6012f056dc3daa749a8d4c444aa8fedffb316344936698ed4a21"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx:18 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"58be7e10d48c37e106dcb00efaa304fba45b60b8263d87730c6074ce0fa4e47d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f7ff10e708d208bc30f957c5e7d581f9a828766f31c5997334f69a6036f7a3d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx:21 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"432eb516e453e05861b56126a125334394403ed9d4fdc449d0576a5b3d1a9d4e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx:22 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdc14070286b7d02c4ffba0f88d2f0298c697da272b785c07b2eb4c3be77347e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx:23 imports invokeai/frontend/webv1/src/features/dnd/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"4920ad5a28a3326c7891caf25de2c47624d59d014fc2511b2bcf592e960db46e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx:24 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5b3345ebe499956503c8ee0a5867c466bcec9ffa8c3c0a06db8ee63dec7f587"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageModel.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageModel.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d20f6ead41543aabf784032904bd5b800ef78807013bb0ca750af6804938bbdd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageState.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageState.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"5789260cd6bcf80d41228abe0dded2301de7e530d70ec8ffd95e1cb13f40ebbb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageState.tsx:6 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageState.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"082c25db3d198b0066fbd86cbf524500feffa3123e9edacfaed96d9841829cf3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageState.tsx:7 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageState.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6061627497ae69907f091fcd417a98deccfd694989d6f7ae65c5b682ec6d2d7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageState.tsx:8 imports invokeai/frontend/webv1/src/features/imageActions/actions.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageState.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"510696eb6a9b3c5ddc0ff7b031bd5bef9862521c62f122f76e5c6b83f1b15815"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageStateWithCanvasOptions.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageStateWithCanvasOptions.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"c465f7f7b1900e19101beecc4959418cd12f27837d96c195225b38ccf0beefa1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageStateWithCanvasOptions.tsx:8 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageStateWithCanvasOptions.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"257af6adeeb3c7fce7b72414b2cdddf35f97e8faa17cd659a015440f16b229bf"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageStateWithCanvasOptions.tsx:9 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageStateWithCanvasOptions.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f8f6d72cfa01074f325690acf466d84eaaf17b6d84d9cb8b4d23a226b31e012"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageStateWithCanvasOptions.tsx:10 imports invokeai/frontend/webv1/src/features/imageActions/actions.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageNoImageStateWithCanvasOptions.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa40f808d03822ddc3b33d118113b8f796edea9bb39f00d4276d8d1e77fa79ad"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImagePreview.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImagePreview.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"9baf5c42adab7e8732df78aa688220df90ba8fd464ca5d8db9ffe743546cbf56"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImagePreview.tsx:5 imports invokeai/frontend/webv1/src/features/auth/store/mediaCookieRefresh.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImagePreview.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"36a76eb3f0962aa1a20419b7c54014bec52feba26678b84e3ac14b550765b219"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImagePreview.tsx:18 imports invokeai/frontend/webv1/src/features/dnd/DndListDropIndicator.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImagePreview.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"b165070c16afaa7092720b2f7df022bf18c903e806d44962d71c34fb8732a8ec"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"a22c36d1c012b3623cad70e6934409c9d0494db5e57fd14fca9db3d3c98fdc6c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx:49 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"376d3a5d50faed905adffcdde42ec38ebfdd8a04e6fd80f89c06298e818b0d91"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx:50 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e782d2b8c36fdbde1e5e2c8e196bbe6daaae0159b6cec72e2c7846a27108665"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/useRefImageDnd.ts:4 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/useRefImageDnd.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"17f8a310212694b4add0f11f0b29b8811644c85ae360967c4e17109d6ef29089"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/useRefImageDnd.ts:5 imports invokeai/frontend/webv1/src/features/dnd/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/useRefImageDnd.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"4aa71cded65ef878a8eab58c6246d764a6217d07fa1df54042ba237fd67dbcb2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/useRefImageDnd.ts:6 imports invokeai/frontend/webv1/src/features/dnd/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/useRefImageDnd.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"4255ffc2bdd00794bbdba5cc50144eb05c3dd54cb1e8dbc0998271d8648da794"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/useRefImageEntity.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/useRefImageEntity.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce36c50cef21575d5d724600e2efcac200a8386c7d2985c3e22a8e72081fb916"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceAddPromptsIPAdapterButtons.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceAddPromptsIPAdapterButtons.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"7050248ba223b39c0ed9325a6cf1af6fe46d16f576f6cdee05cdbb6b0cad4c91"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceBadges.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceBadges.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"0789b981b2a34df7b79f48b294a21b538a014fb4ee74c8980afd63fd35ef8366"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceEntityList.tsx:2 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceEntityList.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1614fc3b995af5d900835fb8ccc513061bbf069eef728fac35c2fbdc2d06ed8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceEntityList.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceEntityList.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ee84620f4592bad79dab57d54dc3db03df4eca52cb3008959d9d8b084c9f1e4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettings.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettings.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d6d2a435100f0be328e150aa9dd695f21a3ff2b42a84d88e74fee0e19228fbe"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettings.tsx:32 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettings.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"97668eb211ad2d78ebee95591ed1a85d2d389468306362955c7411cb09107767"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettingsEmptyState.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettingsEmptyState.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"48f00784f9fd18837d39f91fbf20a7a89dba2ba92833d5c1c00691f4b558dd89"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettingsEmptyState.tsx:9 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettingsEmptyState.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac70c693a10eece0b536e60c12c4f130dd599ceb57000825553c9a119613d979"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettingsEmptyState.tsx:10 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettingsEmptyState.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"08e3cac183affb72955e4d3ae48ab9fa719eb28b9f5b421afb0c4af53bda0c7b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettingsEmptyState.tsx:11 imports invokeai/frontend/webv1/src/features/imageActions/actions.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettingsEmptyState.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0ba2f9b8abf54e902842c7aea5231d317f96c5b1516cd8d42878b823620cafd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapters.tsx:2 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapters.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed37595786304af92fc66abebed5c7cdbca8f923fd43b0826b9c2985a238e722"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapters.tsx:3 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapters.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"197df623a2f79172bb21c901ddd57e2c5b40e0f74d9683a5c13f87cc165886b1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapters.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapters.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e9c817bd9bf349fb37494beec41f29f5d7149f399fd61c96040725930af6687"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceMenuItemsAddPromptsAndIPAdapter.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceMenuItemsAddPromptsAndIPAdapter.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"9433a7fed181503f83bef6ea8629c999bb83d53c6f5c9e14e1df070a7df6ba83"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceMenuItemsAutoNegative.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceMenuItemsAutoNegative.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3474dfb8e9fc8e3d1c96c9c1015d72f11dcf442934b60b6e2a24cf180a31728"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceMenuItemsConvertToSubMenu.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceMenuItemsConvertToSubMenu.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7d74909c4dd9bab0a4cf4c76de5d426f6deb74083689f9d94d4b38de2c5ad0e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceMenuItemsCopyToSubMenu.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceMenuItemsCopyToSubMenu.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"b924cffa0ba6bf3c3ce4555f5ab0000eaa6538a51ea1b677253b05346a98a6eb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceNegativePrompt.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceNegativePrompt.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"39eafb380915968d14f2827f4f1fdc009b8e571a7111bde25cce195e93f7c854"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceNegativePrompt.tsx:9 imports invokeai/frontend/webv1/src/features/prompt/AddPromptTriggerButton.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceNegativePrompt.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0164bc85ac1c1fd58a49e191397000252333a92f57e08f21befcf34464a604e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceNegativePrompt.tsx:10 imports invokeai/frontend/webv1/src/features/prompt/PromptPopover.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceNegativePrompt.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"8415c8482912507ef69210b7852c39f541d2e643774177c0555b1f22afa934b0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceNegativePrompt.tsx:11 imports invokeai/frontend/webv1/src/features/prompt/usePrompt.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceNegativePrompt.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6be42823a8037177fe4687462252adaae1350f852a64a5bee7a2420f5cb4029"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceNegativePrompt.tsx:12 imports invokeai/frontend/webv1/src/features/prompt/usePromptAttentionHotkeys.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceNegativePrompt.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d3f9f5d2b6f9850420ef152021aa52da4bec6afa55739cf4c674dde80be42c6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidancePositivePrompt.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidancePositivePrompt.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8256ec868f852b6d062640df8f7840ceab666c3367f7983672e5a913bce94bb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidancePositivePrompt.tsx:9 imports invokeai/frontend/webv1/src/features/prompt/AddPromptTriggerButton.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidancePositivePrompt.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2711540005f3d6a64659adc0a8df91828e7c81dc7c20f76ea4ab4133f559f3c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidancePositivePrompt.tsx:10 imports invokeai/frontend/webv1/src/features/prompt/PromptPopover.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidancePositivePrompt.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7b151109733e7f1042ac3bca0cdfb8665d4d0498a51ef670c459c3dc53d0867"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidancePositivePrompt.tsx:11 imports invokeai/frontend/webv1/src/features/prompt/usePrompt.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidancePositivePrompt.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"50dfbc587b9953bc0aae59e3012e7d2b8a3cf5556384c0111bb2d528505af3db"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidancePositivePrompt.tsx:12 imports invokeai/frontend/webv1/src/features/prompt/usePromptAttentionHotkeys.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidancePositivePrompt.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"35e8f494eec936697601a8c09cd5b13dc4487f9c42726a8164834acc50c410ed"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"113ddf00b86e249da29e46e8633e9ebd7ec13a1ce4a57b2ff5f63f965f7da442"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx:11 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2b09673748c5da498e2484f3296fb4fd6551cf49067fe4321f2a13a2d561315"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx:12 imports invokeai/frontend/webv1/src/features/dnd/DndImage.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"ede114e98ca5acaf1a80191db7ad9f84b8b91ac8fadaf29162b9c98a06c77ae5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx:13 imports invokeai/frontend/webv1/src/features/dnd/DndImageIcon.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"719c74f4463ebbf7df7a9d0048657e2215f46895aa49f266a1830d8b27ea3161"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx:14 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a12c00f80dafe26c3cbcda8cea4cf24ba0b3ab3415372e34d0a0d5352de0903"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceSettings.tsx:2 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceSettings.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"8141ceb5ef3adbf667d8b05d9fb11b25b92b66c7e314d0a0e1691c72c5524f4a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceSettings.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceSettings.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"2409b839b12bdee594c3a652b23bd8bcf1c023f3d52e3a51c86cd5d9cae2bb4f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalReferenceImageModel.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalReferenceImageModel.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ffaba311078a28fd50ef21828946cfedcd8e877ce334d1528708afd5726c16c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObject.tsx:14 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObject.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"a240ea1cf97dfd70badf4c3c80034749ab9c717294a320e723a09c4036518914"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectActionButtons.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectActionButtons.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"aad6db82a23bb7747030c9d0d6f981196bf46afcdd3ffe505a32da04fc92077a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsBboxOverlaySwitch.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsBboxOverlaySwitch.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5bf39f5f96d4e536519438da3ebcca4835d6579d09935ccc1d8cb66847d84a2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsClearHistoryButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsClearHistoryButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"aba934b2d37d1f59dcb71203262a5ebf8705096aa506cd5e1793fa04f5a9c74b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsClipToBboxCheckbox.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsClipToBboxCheckbox.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"a90dad2f91d85f07cefd792b3b737db05aa8bd9c9f51e373f5aa2267a3b7034c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsDynamicGridSwitch.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsDynamicGridSwitch.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a071f68d755c0097f469a415d7ae2547f8d5656461b3f55a70773d12183b3454"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsGridSize.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsGridSize.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"de979c4dc1a873336e9d37452e45fb36f724738312adb905cd931b22a4633d7b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsInvertScrollCheckbox.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsInvertScrollCheckbox.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0c4cd718bc20b1abea13faca8c68a1ab723d6b61f14cb0139fec629c5ba48ec"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedLayerPreviewSwitch.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedLayerPreviewSwitch.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"db51450d65ee9444827e6825991b1dbc9edebb367b749696ea1324988b6738c6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedStagingPreviewSwitch.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedStagingPreviewSwitch.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"365b8e779874d8c410c91b75c1ffef37f002158f18dc06b2505b299b950283fc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsOutputOnlyMaskedRegionsCheckbox.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsOutputOnlyMaskedRegionsCheckbox.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"123f08955c8cae434856cf149fc3eaced4c2c1f6de074fa5f2dd43be7f9f8ebf"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsPreserveMaskCheckbox.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsPreserveMaskCheckbox.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a834161536fc239f7a3d83f79df3dc077610d3a4b9fc725ee941aee3077dffa5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsPressureSensitivity.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsPressureSensitivity.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"beb4852758e456f4ab0af2e85a3a899b604b37e4dd6c1d6ee8710b64e063ff26"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsRuleOfThirdsGuideSwitch.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsRuleOfThirdsGuideSwitch.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5088c8953209835ae8ed8ef0467e09a3340c26d5808770e04f7589672627df3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsSaveAllImagesToGalleryCheckbox.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsSaveAllImagesToGalleryCheckbox.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"eed57ceeb54d945b33af93a096fe26b01be5184ee01446214e53a0d66ab38ff6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsShowHUDSwitch.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsShowHUDSwitch.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"55879623dd9c4851da6dc707cc66d26b37dbaa3f74f25e791732735f671ef883"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsShowProgressOnCanvasSwitch.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsShowProgressOnCanvasSwitch.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe293030c5471b9ffa6e91a2b17f96876c7b75dcb8a2a600cbe3ea26a76ca40d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/QueueItemPreviewMini.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/QueueItemPreviewMini.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"dacdef23b870b421cf1806c1b5cec53bac415f08ad5a7b65f98f02ea28a11bd3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/QueueItemPreviewMini.tsx:13 imports invokeai/frontend/webv1/src/features/dnd/DndImage.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/QueueItemPreviewMini.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a59a4e617f32b0f0244d9e2b67ba55323eccfeb75f3a20e0283737ae8fccdba"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/QueueItemPreviewMini.tsx:14 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/QueueItemPreviewMini.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"0de2067ec958286f54f99e399455dae62ac27d49fbaaf370a06b8a32fdb7d71a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaAutoSwitchButtons.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaAutoSwitchButtons.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"7034e42ffb2a481ff4e52717a0fb0ae23dbc60590bdb304d4c0f356a90237c4e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaItemsList.tsx:3 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaItemsList.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c66ccb22f5054c20dc671eb483a66d4412789dd7754cc57c6b9753dd3768c14d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarAcceptButton.tsx:6 imports invokeai/frontend/webv1/src/features/queue/hooks/useCancelQueueItemsByDestination.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarAcceptButton.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"09cef9182a1064730ea31bca2909402c873475c9233121833045f3a2461aba19"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarDiscardAllButton.tsx:5 imports invokeai/frontend/webv1/src/features/queue/hooks/useCancelQueueItemsByDestination.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarDiscardAllButton.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbd9141d9ae4c8fad222e6805abbb4c28f66c3aae92f282dc4df032426d94e45"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarDiscardSelectedButton.tsx:5 imports invokeai/frontend/webv1/src/features/queue/hooks/useCancelQueueItem.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarDiscardSelectedButton.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"a94cb888cc73b385cf3d7b4d213d6c01151627f55af19dd80da246cae60656b1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenuNewLayerFromImage.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenuNewLayerFromImage.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8e4f396896412d76cadb3e7ebda99d128e5630871d43f09a88e9a1281082ae3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenuNewLayerFromImage.tsx:7 imports invokeai/frontend/webv1/src/features/imageActions/actions.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenuNewLayerFromImage.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"8eb4ddd119222bb92d8c9716af067f91f8c48e562be7ea24f1fa705f54152224"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenuNewLayerFromImage.tsx:8 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenuNewLayerFromImage.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"29f07e44e7ae514d411f207d24b031b9661992d9af3fc6b0ad3a8234d344b738"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarSaveSelectedToGalleryButton.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarSaveSelectedToGalleryButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"02f1aa0ed3c5bb16b5b7da68772387579b63b130e3dae90a34972ec4678a2210"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarSaveSelectedToGalleryButton.tsx:7 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarSaveSelectedToGalleryButton.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"676bc0b4226918f1c55b3b48a0ac12030ea968e9424f74bcf4ee7afb4b418d8c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarSaveSelectedToGalleryButton.tsx:8 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarSaveSelectedToGalleryButton.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5d515cabeb08ce5c7db6f64016cc0ce62d126919c571f9ff399b98c123a6a20"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/context.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/context.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8d85283528a72ad9b843dcd84d54e19e7e0c27f63111962584e5655df85a0be"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/shared.ts:1 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/shared.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b38c3e1b242b6ff74c2f9d9f9139621ae07f3c59c1ddb7e293aa321af03c0f2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/shared.ts:2 imports invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/shared.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"257cca355a7b197a0cd4749eb8162dad8423a3ebe7198f703d22d403144e2ab3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"720509b3f105043a526bf63c67646a1289096fd4f46c4035cc3217ec57761bf9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx:22 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cdc8c11bdb57a1e3e36c0e543362474623765ab8be37863e239e9efb29beb5d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx:24 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"47776d208b8740c2bf300451ed6d0941685decf187957d3906402f1136ea4984"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx:58 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dded04040ee8172d0b5cf7e0ec5d907a9835d6097f41b8823b4de4f68d15008"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Tool/PinnedFillColorPickerOverlay.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/PinnedFillColorPickerOverlay.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"35bfedaa293961cfdd21aa9e6e571f43d4e9f119a62d0959dcd9c6e9ee66011e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolBrushButton.tsx:3 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolBrushButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1f3e054c2ab791ee4f421d482f0f90817fd4d6d611067ba8a5a7299bb1cfce6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolColorPickerButton.tsx:3 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolColorPickerButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf0ca6e7db4ca0c52708e1835cc8ec895d03ada46f332e029a26124c33dab2af"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolColorPickerButton.tsx:4 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useSharedInfoHotkeyTarget.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolColorPickerButton.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b410beffcd54517611a07696ca14d4b49853230c8db62d786a44598d1ceb28c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolEraserButton.tsx:3 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolEraserButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3bf66013af900a1b96c66e0b101825c86b4291743d63de6cd931365dfd0857b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolFillColorPicker.tsx:15 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolFillColorPicker.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"be60f7033f8fa721cfd99ebefb599eb292d1f66cd5956d458fe5ba2c0cade2cc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolFillColorPicker.tsx:28 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolFillColorPicker.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"95bbe6dc7d017e3626bd93208bba0cd90eeb93ebe5e271b8e706ed90b52a15a1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolGradientClipToggle.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolGradientClipToggle.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c8934f6ef9453d3891495f8fa0b4bb6102f07e42b49caf3367bbf5b590515ee"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolGradientModeToggle.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolGradientModeToggle.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"50597187d9a74c722af48a325f9b85857777ef90d9666febbb867bf9aa79089c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolLassoButton.tsx:3 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolLassoButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf511c5b41ae5917969954d74701bd75b5efee0e4f45447b7b64942599b586be"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolLassoModeToggle.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolLassoModeToggle.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a72670cefb3d385938062a5fe0086b623ea627c4186eacafeac67298a6fc7a0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolMoveButton.tsx:3 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolMoveButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd944275c61abd1d19ff2eb773bd54184e44403346a3d669b10d902315305079"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolShapeTypeToggle.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolShapeTypeToggle.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f75410e256a1aa8c905aed4d47eaadf6d3b5fcc6b03a4e0b9d776bd09101aa2f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolShapesButton.tsx:3 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolShapesButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"02fb300197c75495d2f9dc93627349c9f59e5a9f228aa36e2ef0ddef73045141"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolViewButton.tsx:3 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolViewButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"38fc9608e4194a82cc756653e87525897df0d65cee32b39d206ae0b56e2fb06c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolWidthPicker.tsx:18 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolWidthPicker.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"74683a99d2066544a77e0c75e403f1439a06aa20ce07d64a7aa67b4ba56322b1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolWidthPicker.tsx:25 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolWidthPicker.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"98ae43a45b94993572c040cd4660f5448f44ce130f458a1e158599cab98da601"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarFitBboxToLayersButton.tsx:5 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarFitBboxToLayersButton.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"29122525d402e8d20330c8cf9c9008665ff88f13c10fdcc5778c342d1d44f85f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarFitBboxToMasksButton.tsx:5 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarFitBboxToMasksButton.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e481fbbb5a44ea7ae06bb69bd1fd7c082308ac3c6e41cfae22956f64002b07b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarRedoButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarRedoButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a41b18bbd2ae8003a30bba0bb139f80bfd8caada33233ae6fea0d2b7fbd53994"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarResetViewButton.tsx:4 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarResetViewButton.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2d07b0b59cea923c97e4b5ecef7fc10b49fc1a3b4b3f6bb6fc2efcab133fabb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarSnapshotMenuButton.tsx:18 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarSnapshotMenuButton.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac7b45cc006bdedf89336bc9480cb73736976b0bf39e538a23d42320dd1c2c82"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarUndoButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarUndoButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"8626f4b3627e1b98aff39120bf15c3da023e0873db5eb7c229cdc25e634a1fbb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/components/Transform/Transform.tsx:9 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Transform/Transform.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"b740931fe78386a63254f24b4fd578fcaed179ae2e9a4c9c03519d79734c5e0e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/Transform/TransformSmoothingControls.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Transform/TransformSmoothingControls.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"79b4f8206f951f6f33cfd20ac79900f10221167960fb2dd2189466a7416e9c53"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityDeleteButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityDeleteButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4eceb9c648a11d7fcb61a3b28c1bdff2bef488c20e06bd2ad6cc027d852ddec"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityEnabledToggle.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityEnabledToggle.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"106f2f4d347c6acd3dbb5c29bf5021f7b3638163b95d62491ab3774e439c08fa"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityHeaderWarnings.tsx:3 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityHeaderWarnings.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f48a3a536d5ac3a75cca65396654ad78e19770fa1e169ffec878615c60c382b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityHeaderWarnings.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityHeaderWarnings.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d19cad5b04eef1a6625b8696d1fe1a071d02f18b710491b4233c83729834a57"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityIsBookmarkedForQuickSwitchToggle.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityIsBookmarkedForQuickSwitchToggle.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a91f89d50d74f77997c16fba448b79085b342cab7336f4406ebcd793d68df841"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityIsLockedToggle.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityIsLockedToggle.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4ca9dcf13f1ead6d5d9a696f4a063cdc3fa9c9ef0d8f41ef6ca52f889a1104e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsArrange.tsx:1 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsArrange.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"26c3f2937816e6bb8f744aba81b6257b95c59a3b90f5de69442e8cf8d1f6190e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsArrange.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsArrange.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1e9277af4592957a836af6e6404e1238f5161171f0210a749bf40c2ffa232ad"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsDelete.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsDelete.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"07f22198b205714bcdae1d1f88ec2ac0b8628b194b0f5ec83abb0779b004151e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsDuplicate.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsDuplicate.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aacabca6f0ed1c962ce1e3d895a345decd74403ebd387c5e775d5d8d0655ad8a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsRunWorkflow.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsRunWorkflow.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"404d92c9b703346bb48f3b2a769ab7ed6d3b8d6e6d0d4e55b7e717f1e90426b2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityTitleEdit.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityTitleEdit.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"eaedf19c3477925102931c736258e2271de851e79e96cbfeeddfdb3f63459571"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityTypeIsHiddenToggle.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityTypeIsHiddenToggle.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"c00fd5f641dbba605fdbdaf50c17cc9f515dbf76957d7e9fe2a36f46d8f0e9f6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasNonRasterLayersIsHiddenToggle.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasNonRasterLayersIsHiddenToggle.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"976af84f66d93e359a175b9108f52a47f6ce16d61932eb989fde950b8881828f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/components/common/IPAdapterCLIPVisionModel.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/common/IPAdapterCLIPVisionModel.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"7825d19ea4ab3f763810ddc668c120adbeecfb5acb0bed53e89a81475494d353"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/contexts/CanvasEntityStateGate.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/contexts/CanvasEntityStateGate.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"302abbce3a5728ac23422d815808de78c1df341d44d0b79d326cc9fc2c138fae"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/addLayerHooks.ts:2 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/addLayerHooks.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"20d738737695b822f1949f69e3c89bad992fc304108aa50e0bae514b2e00ef9a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/addLayerHooks.ts:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/addLayerHooks.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cb14382cfd43f8488e3e6687f5ba0efecf1877c1cc70df6bb0604263aad6d8e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/addLayerHooks.ts:51 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/addLayerHooks.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0837d57b6116cb22d729d3917c0f1530707583e91bfb97ac8369e2f0ac81fb3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/copyHooks.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/copyHooks.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad3dd912446949cf03b9f367be38d0496d4b9a9997ae486c809a886909d21eb5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/copyHooks.ts:10 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/copyHooks.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"db353aa9f3ae4b81be0b295989bb888e7f5ba8b85c358caa52b9ee4d0a8eaaea"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"74e3a05678c2f27ed8204efdb23d2c923a07336f0a8d80aa89fbdc4271329e9c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a881918b89693c11434847d178c7ea91a1a13c5b7d980be4c0d257170ae753d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts:41 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"f31416cd16cfc9aa381b30f1025d6e6db240271a2032116b188db475f1f95c41"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts:43 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"924573e7a0d16f7d6e56f5ec0e19b100b381dbf842cf102ab2390130e35b6d2a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts:44 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/saveCanvasHooks.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d3fff7ede756df16f18d8d5f5f2643385a636a6b95d8604f2463a0c360207be"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useAutoFitBBoxToMasks.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useAutoFitBBoxToMasks.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"06014debcb56b5dd0116e451004fc9e41d3201074022e4cdc8839e005fe7cbb5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasDeleteLayerHotkey.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasDeleteLayerHotkey.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"34103f081d454341459bea2ab6dc649661b0fcfb257d1a559406d17927e5e1b2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasDeleteLayerHotkey.ts:7 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasDeleteLayerHotkey.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ff12d8a93769850f9bc50a544cd9e9ffa0f8ddfc1ec4cd782a01ae462b65ffd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasEntityQuickSwitchHotkey.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasEntityQuickSwitchHotkey.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"11575c761024848877e95510abdd87590741c7c7303e4163b2d59ddb2ec91192"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasEntityQuickSwitchHotkey.ts:8 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasEntityQuickSwitchHotkey.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9ab5c53e89ea212e746471dac4ba9d9db80c937a1294328a5afda813de13137"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasFilterHotkey.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasFilterHotkey.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcf29faf1751cf3a3c054929da699c0ef8e1a5a0716b3be197c2b9e3c1e6be1d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasFilterHotkey.tsx:5 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasFilterHotkey.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"52c822faf10fe2e7490e37fbf628badb7ae4b039d7ddfbb45c234fa8332eea7e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasInvertMaskHotkey.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasInvertMaskHotkey.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"23c3f9326a7afdd71fa65e46bbbfc14715befd09c4c031c6f3bdcaba5d1ed36d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasInvertMaskHotkey.tsx:7 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasInvertMaskHotkey.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7202bf46e009d1c0f823918f388fc472826e08b51927e5f65096df717cb679c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasIsBusy.ts:2 imports invokeai/frontend/webv1/src/app/store/nanostores/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasIsBusy.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cace9cc5b77253574aa4847ecdfcc1571d43be766d42d70b1342d7ea2580c2f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasMergeDownHotkey.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasMergeDownHotkey.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b21e186aaab8da27c7286b05aea4cbb15cf5cdd7416bc2fa935f5711e12b464"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasMergeDownHotkey.ts:8 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasMergeDownHotkey.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"613249a08719bf975d188e9e6dc9a0a3d00702bc8e743d2b9447a0e76ab6b32e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasMergeVisibleHotkey.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasMergeVisibleHotkey.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"82ee1126b9474294a4028d018dd0806168e6ba1b7c987b886ca20a96c5cc316a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasMergeVisibleHotkey.ts:8 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasMergeVisibleHotkey.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6501e529bbcff8262da35bfb3a5239a9004f1d1d08a45866f978a86083e84a8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectLoad.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectLoad.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb022fbd437054fa18d2d61ff13d8bd9ba68cc8afac8b219864f2cf05b3fab6a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectLoad.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectLoad.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"74377f5395eda1f12af2452eb79aeb97d1e782a46b69c73dd452a08862eedf82"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectLoad.ts:18 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectLoad.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"344bda2ee6473fc44a516d83123727ddcd419b2a15dbdd2625a4a708716d7567"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectSave.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectSave.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4d1028e9abf3a39fa756e8090823367fd4690182a73e1902bea23230c22356e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectSave.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectSave.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"45dd7325a96c2800a7af5da3e7d8421d08d979940e92885eb0f7d688d3f9a9aa"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectSave.ts:16 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectSave.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"af915db805e1edd3d2149f1eba2a6550194ca836948ad4eb2752c91703244503"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasResetLayerHotkey.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasResetLayerHotkey.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b58970f13c104055f592a3e29150df98175819d11cace1479d2f971d60d97e7d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasResetLayerHotkey.ts:9 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasResetLayerHotkey.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c02f6a988ff82ce2d8068ddf238d6335a8d4e9fb285a909105a11c6f1488cb0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasSelectBboxToolHotkey.ts:3 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasSelectBboxToolHotkey.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"868e2d845d306bb0233cc3d98ffa92863a4dcc263393960e00ab39118139c0b2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasSnapshots.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasSnapshots.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e9bd5d3f384560de80b0ea8c8330c82fd11bbcba0068a37c9ca87e6203ea868"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasSnapshots.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasSnapshots.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d11758ee6b3f32db3cec0e8778eff5509af5ba6f23b934b7ee60d444aeb2c133"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasToggleBboxHotkey.ts:2 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasToggleBboxHotkey.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"59223ac32018aee15d58e236540fde0e3e217e924a051a6abab368e24da1ccdb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasToggleNonRasterLayersHotkey.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasToggleNonRasterLayersHotkey.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cd2fe079a7d0609008404375b1e1fe741325eab2484c52c2f18f53f35bf6a38"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasToggleNonRasterLayersHotkey.ts:3 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasToggleNonRasterLayersHotkey.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ff6078d7ddb0bbc08e6efccd544324320c863b276cfea3d594ac102a60eac99"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasTransformHotkey.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasTransformHotkey.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2401c8302c8d92dbce1fd51fa92da79116f1a89dfe38d1c8b5fcbbd153548e4b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasTransformHotkey.tsx:5 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasTransformHotkey.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"1addbdf4a4df4140e022caee2f200eec8a1922453eb119c2f557f4db4b14585f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasUndoRedoHotkeys.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasUndoRedoHotkeys.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bea10f1a0c057afd09b13454922ceb3d1e80d0e13edc2ef3599d77c25fcc04e8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasUndoRedoHotkeys.tsx:6 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasUndoRedoHotkeys.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"d84a928adffb677285c753180c257f9706ffd05fbded1c7a3422393f49aceb1c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityIsBookmarkedForQuickSwitch.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityIsBookmarkedForQuickSwitch.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9d3ecec6499523c3a73bc329edd711870ca52d17baf6e87b1f1ef64e901f216"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityIsEmpty.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityIsEmpty.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd6b926f40ffb3132f5bc090077c84b8edf567f9bf7ecb17c2c883fa948eff97"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityIsEnabled.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityIsEnabled.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"842530edec5ed68f9fea6e46c274fca528adb357088884ba1d5aaf85895e1a57"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityIsLocked.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityIsLocked.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"92b3906001f72d2c8524233e7950a992733204af3aeeaca88abe3b34628cdc37"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityIsSelected.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityIsSelected.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a029965a477567410a9a751d8a3f8a81278a9a99c5e61a73783d3f3b6d53959e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityTitle.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityTitle.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"5773cb2fa53469c832d5f7115a7f61c513a951cf5a9e49f8cdf075a061b7be80"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityTypeCount.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityTypeCount.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"3241431f037ead333bbc425b4050070d9e2590e043449151581fe88dde243f54"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityTypeIsHidden.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityTypeIsHidden.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e97e622ae0ba688342305dd5f24471f97b1ed6d7cc8a0f059c16ee44e0efa8f0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useExportCanvasToPSD.ts:2 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useExportCanvasToPSD.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"583f263a89639a39c91c1cbf08035e29338bb882fc96c37dcbfb582b06e2a4b0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useExportCanvasToPSD.ts:6 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useExportCanvasToPSD.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a21d3caeeb8483b5f406e974e04100c4cfc55f2f0bf4d0de17c605affeb3d73"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useInvertMask.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useInvertMask.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d588f0a1981d8e29d13b12c9ff4b0dd2f1c7c6a610d346654e6e4a36a246acf"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useInvertMask.ts:8 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useInvertMask.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd55f17aa4d11f81b2c51e70b6c74a837c21eb9534b2712e45810a79439e340e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useInvokeCanvas.ts:2 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useInvokeCanvas.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"78b6dc79d335c5152b57173725aa70af66f926655146a5d133db6e4b20617885"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useInvokeCanvas.ts:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useInvokeCanvas.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"439d7eeba3476d248c0280bd42093424f218c8617f941b81c64d0098c260b5b8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useIsEntityTypeEnabled.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useIsEntityTypeEnabled.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"585acb23830d201c57f6082676e2d527e31878efb5f016f4a9b3183ce6a66c6c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useNextPrevEntity.ts:1 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useNextPrevEntity.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1bf9672423ab580b230c1854af6edbbe64319c555ffca19e7f6da7278a8bc62"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useNextPrevEntity.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useNextPrevEntity.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"be8f4a2ef15985ef36c781e43dff305bae96a375feee1274742e6eeb1d547ec5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useNextPrevEntity.ts:9 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useNextPrevEntity.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0200810da573d68e05b3a31beed7f2b3bda751708513efa471a4c3030af57a1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useNextRenderableEntityIdentifier.ts:1 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useNextRenderableEntityIdentifier.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"98305f3671257d51c827cfe1edbd8da76dcd83a133dc55a72ea984029a19db4d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useNextRenderableEntityIdentifier.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useNextRenderableEntityIdentifier.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c6b86c804a2661ccc24a8e0770d19fc8928e65aab04c4004c93a1767dafdbd7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useSaveLayerToAssets.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useSaveLayerToAssets.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1faa4d9e67cdec5efea9b79c2369a4bef1d52e0da34d32cabc594fe84ff369f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useSaveLayerToAssets.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useSaveLayerToAssets.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce8e0a8f6e3bc034aae4db6f0fcb524f8ea878aa446f71d96b624aaffb7dbb5b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useSaveLayerToAssets.ts:8 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useSaveLayerToAssets.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cd2d946c47d8a56c99afde0cdac83b29a18f6e0b6329dfedc9a49bea7a4dd4e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useSaveLayerToAssets.ts:9 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useSaveLayerToAssets.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c296c1f9270c7c39d82d79d52822e451e2852a18da03d0610e6fc623a756bee"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/hooks/useVisibleEntityCountByType.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useVisibleEntityCountByType.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad33698da36c433927626d03a3172dd989208f5547a77707ca96785e4cb84042"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts:33 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"245a1d509b7f47b106a1d50a02aa3447e34e50f69bfe8d6e3e80f3c2c1a71d96"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts:33 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"050eb1ac9569da955276993ce4826d459c75597c79e99c9c226a7e316bf5501c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts:15 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f0dea87b05e6246e5f7674e2dd2a45202be4c864b0ee4d2536120f232ca2c01"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts:21 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"de5d8bc2134475333203b854286b717a1040b8e51a737389b0bac262fb3b8f14"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts:22 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2ca1866067063c75a10dc458e68bfc8f9d7d7b60379f368818e6c572a156f71"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasManager.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasManager.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9177047f6f4c0e71495227d4bcb29f38ce23beb0a623e54022fbd85418193548"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:31 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"29b6d871d988a837c26abb9bee8e5beefffd2688183f68beb9dbdc6daa1949c7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts:32 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"1903a8f0f2096fe1996fb6ea41d2cc1d10ca1c99212807f9e38c191a7728ebe0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStateApiModule.ts:4 imports invokeai/frontend/webv1/src/app/store/store.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStateApiModule.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bd0f60fe9b5678fc60092aa824e0c51021f1656ba0c3eb249fbd4c1a4a62a12"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStateApiModule.ts:56 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStateApiModule.ts"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"bda114fdb93d1a5f73ab00f0417bf7eb5f72bc20fcaae99fe8c5378a54d7b216"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasTextToolModule.ts:23 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasTextToolModule.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"a195950e8b76c56fb9d443a2bb1a756bc7dbf64abb7c1e1254f5888b34c14bbd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasTextToolModule.ts:24 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasTextToolModule.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"3caef3173397024e6f32aa2291c898c22f3f7ff7b2f3cbb2740bb4063c78237b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:8 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b23459fe7b77664841f7416ba6574b21b5bd13e0681d5c738780b7637cd0d91"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:41 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"67593a18a5b1099a4d39c0ee28c1825dffadc1c1af9cda6b53e9072b088c23db"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts:42 imports invokeai/frontend/webv1/src/features/parameters/util/optimalDimension.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddd805f8e2c70a600fd6a1ef1f20bd84ba3837b7e0fa212282b0c8982d8de7c6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts:2 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3a3fa3d481aebc61597a9357620c2fb5f38646b69ded960f49f74df8b19c059"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"65a6c44c0c5a316dfd5f809ca1f13ba7045781d0c9f60f6c50051891289e6468"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/store/filters.ts:3 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/filters.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2456d23f2660ce5cdbb6ff5e6be93c280d9b26e5dbe2cbfd3cbeb2da58d5256"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/store/filters.ts:4 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/filters.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"d417b718a5aef7322879ce3d05a5da819f5b6f823bd1719feb85517523644af9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts:6 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"e785a413ce40e589d6dc761e13a2f5c38ed907a3dad10bc9691dfb08c580b50d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:3 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"a251de0fcd9ef9b7b9e4d35947d25c51ac3438f598eebd690bea48aacb90e41c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:10 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"121cde70fa0033c8c36c949a951b1783f7daa2493deb61e8fc5689ebc32f14ef"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:27 imports invokeai/frontend/webv1/src/features/modelManagerV2/models.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f3f896c8f7b89955d1d3b3c25efd12a3948952debb0da485284eaf14a40b772"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:33 imports invokeai/frontend/webv1/src/features/parameters/types/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ea6c015277cba094c9d9ad1273480104931e9f251e040b5cdb34f3ce1a18ac4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:54 imports invokeai/frontend/webv1/src/features/parameters/util/externalPanelSchema.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fc949d90ac74431303d2e8744c951b567f8fd8ac1f7c4d53368f0162d98c51b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:55 imports invokeai/frontend/webv1/src/features/parameters/util/optimalDimension.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c15562ca39e1408a769cb91ec6436715a72af683ded299f05f40523ab23fafc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts:61 imports invokeai/frontend/webv1/src/features/parameters/util/pid.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"90ddc99b874cbd0a9db62ed9ce7720778115b0c7edbc745841d491b245fdeb38"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts:4 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7bba0039a0766a05a97ca30440b0675a22df5637c7aa784d1ea4afb0afb8aac"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts:8 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"445aa33a3bc187e5ce8f623562f2e84449ea62f846d6373c00d29cb5ee6ed0eb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts:15 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"77b9e3a60da40f9ad2380af143bc8ff6f5455d64ef9122de4774ce0244b51e7d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts:17 imports invokeai/frontend/webv1/src/features/parameters/util/optimalDimension.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"46121229f6f8f26cbbf96d83e29dfe0599db50e5b83a0c670a43428a34debbd5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:3 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c13716efa7934c265cdb71d4fcb3fb0913ebd35b10e245a8001a067b028877cd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/store/types.ts:4 imports invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ed28389a5040e8ba58d3aa8943e852718837d99d04dbf1a15c1220b76d0fbb3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/controlLayers/util/getScaledBoundingBoxDimensions.ts:4 imports invokeai/frontend/webv1/src/features/parameters/util/optimalDimension.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/util/getScaledBoundingBoxDimensions.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"b777187c2f06284cf6a593a271f9a5357c823bfe08a78442fc531b24653b9546"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/cropper/components/CropImageEditor.tsx:12 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/cropper/components/CropImageEditor.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"32d83e4284474994a6b083e35d72c3b38f62fa57fe6cec39dfb5139f7e222127"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/cropper/components/CropImageEditor.tsx:14 imports invokeai/frontend/webv1/src/features/controlLayers/store/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/cropper/components/CropImageEditor.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6ae5ad586715e0254783e03037aa77bfb2ecf3de4d13919a88c40e21e122699"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/cropper/components/CropImageEditor.tsx:17 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/cropper/components/CropImageEditor.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"a89bb1b6addc32d3da675c429998cd00fe2306846153f3099b923bb7fe149515"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/cropper/lib/editor.ts:1 imports invokeai/frontend/webv1/src/features/controlLayers/konva/patterns/transparency-checkerboard-pattern.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/cropper/lib/editor.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3923208d494620cb5d00485e0057f6bbead7f59643e7dd370e76968498ea17c5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/customNodes/InstallFromGitForm.tsx:12 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/customNodes/InstallFromGitForm.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ecc9bac2cc6bbd24d24c9ed8c22d9924836c91151fd644a06decf9362ebb7ee"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/customNodes/useIsCustomNodesEnabled.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/customNodes/useIsCustomNodesEnabled.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5062ea6ad9a51138385665db26855af99af238630a7d142db939acddb78b489"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/customNodes/useIsCustomNodesEnabled.ts:2 imports invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/customNodes/useIsCustomNodesEnabled.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"26e613ba70f07f6ce726c343f8624a34d847c6c5ee1d8c09f450cf98bdf43486"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/customNodes/useIsCustomNodesEnabled.ts:3 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/customNodes/useIsCustomNodesEnabled.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"084abdcd1d272806d79845b078d88e8a51cd16ba4eca8fe1673356f0036431ee"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/deleteImageModal/components/DeleteImageButton.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/components/DeleteImageButton.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"25f67d88d145a4ce2d45325c21a32cd0c4f841e0d5d2bc3a4a0358a2d1f2a442"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteImageModal/components/DeleteImageButton.tsx:5 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/components/DeleteImageButton.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c764942a77c009e1736ea5a2fdc25558a6a73b367985496b3e724f674c98b2c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/deleteImageModal/components/DeleteImageModal.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/components/DeleteImageModal.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b7696d2fab97de12d207e1bffbd4f4c1d798b5b17ad7ded508db9bb7d27cc09"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteImageModal/components/DeleteImageModal.tsx:5 imports invokeai/frontend/webv1/src/features/system/store/systemSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/components/DeleteImageModal.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"a123b624b6b03ee6cdce74f4451a0d56cda91c59130efe209d31738e40deb4c2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteImageModal/store/state.test.ts:61 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.test.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"9113803df6986bf4e01ceecaf2d4acb3fee956577cc36a0718ab4520636d41b6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteImageModal/store/state.test.ts:62 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.test.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7ab511e3ed988a7165d340a2a42a888f09cbf04f229b4d3407f8d88e86ac5ee"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteImageModal/store/state.test.ts:63 imports invokeai/frontend/webv1/src/features/gallery/store/selectCachedGalleryItemNames.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.test.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d944faaa18e742699b3600c15d19a8c489491180135692a654cabbb88c6b65d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cfb3f7a2bbcdc4c933ddc02ed99787d995caa0415748fbf3c48a253f617e22b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0b3ccb34dc964ff11c8a6b8c2ec5e5c34aa0325da20926fea239d45b3f19781"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a2517d361b980087f068afb6ff25aa3440da034154372feff754a46964447f9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:11 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"760a895424318fafdd6d51b5700dfce5cdc77984dcd5e64f60a96aacdb1e6bbe"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:14 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5d9bc3943b381add5ac592323929c4a025b5c1fa5b422520a9cc734cd63b29f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:15 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"77e1dabfa52a87c266858fce225071ad03cc017c4c59b2cf11fdd2c4ef142ab5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:16 imports invokeai/frontend/webv1/src/features/gallery/store/selectCachedGalleryItemNames.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"da6a0f381422b489e84a0d9ac11ea0580f63def101256afda308d6acda78a93c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:20 imports invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac74dc427503f470f614813fff2d47016d56cafffa2e815ad4d930b8502b5ff5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:21 imports invokeai/frontend/webv1/src/features/nodes/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"7716801bc781110336c1f633bbd6751e9fe7094a5d777cc42b2d3ee779cd4361"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:23 imports invokeai/frontend/webv1/src/features/nodes/types/field.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dabbd6aa158d22e43f45c81a5e44df97e0a2e9176b86aaf913a7f895783203b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:24 imports invokeai/frontend/webv1/src/features/nodes/types/invocation.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1555ee0641f5effd78f8124b23c0d6c2a9f8a1f3475e91f2736f5814c82e998"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:25 imports invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"75b29582fde0c899df8203dbdc8c5813790de228c333075ab3fecb308ce74967"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts:26 imports invokeai/frontend/webv1/src/features/system/store/systemSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"e73247ca5d6741e5de5838ba0df33cf0a309018f930e820e5659dcf5b7afd403"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/deleteVideoModal/components/DeleteVideoModal.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/components/DeleteVideoModal.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b8d24821d3770ef26e6fab52bc3d6012c2bf5cd7722cebab4fbfe363ba60ec4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteVideoModal/components/DeleteVideoModal.tsx:4 imports invokeai/frontend/webv1/src/features/system/store/systemSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/components/DeleteVideoModal.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff9dbaf746a6eaffcf285190b06f2dd92c11374e9d124426da99070ab7e6a38a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.test.ts:60 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.test.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"27966c00cd180fbe5ed16219c21915b00e0c2afad5f78625bc47de498df33c93"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.test.ts:61 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.test.ts"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c0395c0aa1e771569c225c3fe60483b1cfeafd7328ab8d0b564ec3fc5b60f55"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.test.ts:62 imports invokeai/frontend/webv1/src/features/gallery/store/selectCachedGalleryItemNames.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.test.ts"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"09f98387191fdae2320ea275b624855c518548d58bbf788fb2ad3e158d15c411"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.test.ts:63 imports invokeai/frontend/webv1/src/features/system/store/systemSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.test.ts"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"d96b13e2b0dacd6633451312f0891153fd99e48d35de0827017840546e8d3dc8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.test.ts:64 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.test.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6efa1c429522893b12546f83cd19a8fc3d39da65b67e4495cfa782a2b1f525e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3077820f2f1a7ccb1850410d352ea8713e5af4f027c5ce00b294eb85ddb2eb1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts:5 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"998b406b6ec2f8a9f8860f22911195615868a78f167c05c0089432bcd98e808f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts:6 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"79cb5e6bfb59c11c5db9105a7c85db78cfce4d8dcbaa311c659dcf425ae89c32"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts:7 imports invokeai/frontend/webv1/src/features/gallery/store/selectCachedGalleryItemNames.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8c6450ae874e7586dfd2c76e89b4ecf5bec6aced34550dee42334078e833740"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts:11 imports invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"11c1bfe94f7d6fe9a06fd7edd3d6fc3e932204b916d711c1684d80b8ef515153"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts:12 imports invokeai/frontend/webv1/src/features/nodes/types/field.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9855be4118b1c6e01b2e78eb2da02bae50bd3f5e8002bae037e32df32bd814d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts:13 imports invokeai/frontend/webv1/src/features/nodes/types/invocation.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c299af97f48c29632eb338bea0fc0110e81174b8d33f9244c53abacff187bb7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts:14 imports invokeai/frontend/webv1/src/features/system/store/systemSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"65655281da84d7f41978b95ccbf80d73b0ea8994202aef1f6dbe6a69bb3cf47a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts:15 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"158bc85196c5c23e5ab30a5e91337769233b9854f331c29465c04e48dfac447f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx:5 imports invokeai/frontend/webv1/src/app/store/nanostores/store.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"592f3f05ea75819596f1808b546e16a2df2b1013b1309fae16c755ee77a48769"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx:6 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fc847724fff6cc7ec02eba9b116381b6dcc4692f7f28b4688ba90fa5ec6721c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/dnd/DndImage.tsx:6 imports invokeai/frontend/webv1/src/features/auth/store/mediaCookieRefresh.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/DndImage.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed0c64c456569ba66fc553badf3de9f55d4bed48cfb3898fe8a33f261a12e0d9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/dnd/DndImage.tsx:11 imports invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/ImageContextMenu.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/DndImage.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"d460c1a089c9dc227bc08c5b5ed1bb34ded16b535d457ebb79079df6ee85a339"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx:7 imports invokeai/frontend/webv1/src/app/store/nanostores/store.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"896e54f5f405cd83867fdb148d28493c6c17e71f1fe33d803f82e6568983771e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx:8 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef9916f2e303d47147edde4e1a09931476f16db404426f811b03802ab2169bf9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx:11 imports invokeai/frontend/webv1/src/features/controlLayers/components/CanvasPasteModal.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"d87494e1ab0cbcd03927d4bc33c377bd8e1618f86fe67658547d3835a3b3b162"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx:15 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"f167cc24bf648ac0939ba11a6f238e942ffd3aece11a4ee1c7ea196a0ecffb31"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx:16 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7e36bed78b3ba2cf446cf36b0adf7e77c896b8e0cdbe2e6321aff85b28896a5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx:17 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a27fe4bb1c0d58f67425cc5be06f956a714422f02b31e5ba07b169464a9381f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/dnd/dnd.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"11b38529ae6d00972957eab47c36bd72a91b49a70c76e7f171bb032b647b3493"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/dnd/dnd.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/hooks/addLayerHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"94305b5932c98f8ae434487948b7e5ba53f167c425dde48d33054d0566f95cc0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/dnd/dnd.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"6854e331b686f333a8ab9c8de87d2d9465a5356e926bd7aa1cab29fe25541dbc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/dnd/dnd.ts:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e53375e4c461d40316ff2c523e193a98ab550fe8d49ec274ba0feaec37492a7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/dnd/dnd.ts:7 imports invokeai/frontend/webv1/src/features/controlLayers/store/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"a996c3e8fc5bf83463f6e8a1eaeb36e466c0ad3df1aeac214a30b4a5078b2ca7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/dnd/dnd.ts:8 imports invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"54765cf8c6ffd2494f13526f27abeb74140853a5f5e3c952895a07bcef09f0a9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/dnd/dnd.ts:10 imports invokeai/frontend/webv1/src/features/imageActions/actions.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ee2968f4b08c964c680726a502007065110983efcc8201234ef360e3a38735b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/dnd/dnd.ts:27 imports invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c304d17442aa41b1d10d6c01ae16626b7ec225eab2b71f100d2476344cfcde9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/dnd/dnd.ts:28 imports invokeai/frontend/webv1/src/features/nodes/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb623a1fbc473e87547f89143da17d5fc71e517334b12b2aa99e9eb4df2eeb5b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/dnd/dnd.ts:29 imports invokeai/frontend/webv1/src/features/nodes/types/field.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"1021fdfbe082db0e9f7046055485b2da39e19502121db726fef70979b16ce582"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/dnd/useDndMonitor.ts:3 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/useDndMonitor.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef347841afe42289d5f30c53d7d6c5c520c0a5e1c6cbca67d9a5ef2994bb2b75"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/dnd/useDndMonitor.ts:4 imports invokeai/frontend/webv1/src/app/store/nanostores/store.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/useDndMonitor.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"635376c307098273a0756a4b63225041312693cd54e79d5d60857e4756db32ef"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/dynamicPrompts/components/ParamDynamicPromptsMaxPrompts.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dynamicPrompts/components/ParamDynamicPromptsMaxPrompts.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ca58623d72d516a3606fa259fe5308a95c617a21eaf2d62272976dcdea08851"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/dynamicPrompts/components/ParamDynamicPromptsPreview.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dynamicPrompts/components/ParamDynamicPromptsPreview.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"37a6b8314ee999a98368901127b0a095253d8f980bea8bab4eab6310a58732db"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/dynamicPrompts/components/ParamDynamicPromptsSeedBehaviour.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dynamicPrompts/components/ParamDynamicPromptsSeedBehaviour.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dcbfd4c3db9d447ebd019a413cd6a65ace292b63a8ae43eb9f692f196ab7bbc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/dynamicPrompts/components/ShowDynamicPromptsPreviewButton.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dynamicPrompts/components/ShowDynamicPromptsPreviewButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0edcb213c1473ff56622c529d27d62375a422af89c7c786cc507aecf38ec7f0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/dynamicPrompts/hooks/useDynamicPromptsWatcher.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dynamicPrompts/hooks/useDynamicPromptsWatcher.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eddaa9d5dc84c40defd1298b3a1d7ef3e732d98b8ef474a31adca31d50a7e5ac"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/dynamicPrompts/hooks/useDynamicPromptsWatcher.tsx:11 imports invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dynamicPrompts/hooks/useDynamicPromptsWatcher.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"82f07bd3ebcaca8a3bb769e5b1d7effc7be45b8502c1c13b2218449fa8853c70"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardAutoAddSelect.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardAutoAddSelect.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"a87557f42fdc36ac68248f83309ab802ef67bdd700b53e4381d90a5f9d7a4295"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardContextMenu.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardContextMenu.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"f329cd87da28064e2324ecf9f1e21ff81cee1de4328a6f0ccdcfa6ef51c4d3e7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardContextMenu.tsx:5 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardContextMenu.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbcd00378fbf11404df66f6f0d06da907167015d7bee063105264e8695d25925"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardContextMenu.tsx:9 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardContextMenu.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"daefaa80c3232d704e0b071a38d901103c31851ecdb60aaf9f11d672a55b3b07"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/AddBoardButton.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/AddBoardButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4899b58b020c6e071828fcde66ed466c8fb0702d558f275d90d686774eee9dc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardEditableTitle.tsx:5 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardEditableTitle.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"1712eae173bf858c58ff38ab2b6c963bf108376f32fa31a9228c1583dd6bfd7c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardTooltip.tsx:3 imports invokeai/frontend/webv1/src/features/auth/store/mediaCookieRefresh.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardTooltip.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"28586a00790788b7c79a95ec713aaaf32a8d3cf1583f5ec04d8f4f4bddedb664"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx:2 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a93e1fb6b57b11f62463e59cdbdb416a3056c09e981f2c6fc83d726b63f163b9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac7dfe4454eaa1bd7c5d62e5a7325a4bb4bb796f7b744e89a215423894942832"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"20fe857fc3ab07d63c33ce6af0990b7834757c396b4f9a348810c44a2cb50083"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1bdc69d017141bae83ed25f83f7af314da47b642bf5e06335a643c62ba2d47e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx:5 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2a203e22ce0d4951f7951ca827559da621b2f003874b15b1da0410b2510d84a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx:6 imports invokeai/frontend/webv1/src/features/auth/store/mediaCookieRefresh.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"c59d0f916bac86376e6baa48871e3b063f34bd6cfb315a95439566bbb7959694"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx:8 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbb9446a030d9b949c982aaa8d2dcb7a8c88d07a96a6eb3e78ce033169c1c454"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx:9 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdd33eb434c87826478538cc0dec5b2eb08dc86619f678d31070813005898c57"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c964588adb1d96fe824a71cfdaa582f46d6c1f88d1d18210a8f760744f3793e6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx:5 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"80da639c224bcce249b746142574c5264c623783e09af09d8ce31f7af89876af"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx:6 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"0096d0f3188b916764b4f034350ba92d9e53df609e07b2bf99379f71d39a20a1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/VirtualBoardItem.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/VirtualBoardItem.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"f38cb1fd7d87df2ffad1ca035313213ec7d8f871e328083ffd48ddb9b69776c0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/VirtualBoardItem.tsx:5 imports invokeai/frontend/webv1/src/features/auth/store/mediaCookieRefresh.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/VirtualBoardItem.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e4880280a1d7b8e1c9cb39bd560c25f92a1a05ba760b130ba7fb92ecfa53083"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/VirtualBoardSection.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/VirtualBoardSection.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a2f28e44a8f42a0ad0420b12a787236bb8b8e37e2fa6fe0f0a8ef551ddbdfb3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsListSortControls.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsListSortControls.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e3f47a8ba02ce8223f5890f0ba6e6be21869b5350e7c390908dc077a022a95d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx:15 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"545977a74d580c33f1b2594cb8225a1b313a890d138d159b8df7afbd22817542"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx:16 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"94128c50a6a376f15e4c21a3fb998837ca78cf3f88ea51fb3e30e9dcacedadc3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx:19 imports invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"f43c832e8e98f24b5ac57558928c4568e19d3b310cb626ab7fefb39c7bfd1ff9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx:20 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"bae7b8fd0003ed5d0bd7d9f3596a5a251a14a5f5e60537812a844d2943fbf8fe"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx:21 imports invokeai/frontend/webv1/src/features/deleteImageModal/components/ImageUsageMessage.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"98f0523b297468e29d324f2a2f8cb90f6836ff93bb6fd1b08a7894604dab6c34"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx:22 imports invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d72677a6c92e340aa22b4754390488c81e9d3bca923500031d4899f03cb6a8b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx:24 imports invokeai/frontend/webv1/src/features/nodes/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a11afca541afad2377be3972d4aeafaf40104710591b3e26e4031302f545590"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx:25 imports invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a6f3b010ba39639ed2178980aad2a4f7c74d9f0191868439f0d95fb68d9e15d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx:26 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"acb86652a9cf76d6b384c50a7c05b7773f903b9f6d0e8378d8d9fc29a8db85c7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/Boards/NoBoardBoardContextMenu.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/NoBoardBoardContextMenu.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"7742083fc1e50232ffbb206c4492aedd6e9303050d83be9724295137f4dff3c1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3eab19e7b8c0782c34ee49bf7b47f684e670cbafaa1d8ecdd90194c1a1281e6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx:10 imports invokeai/frontend/webv1/src/features/ui/layouts/auto-layout-context.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba342f5ce4190f139e7dd16f379b1094723cfcc88113657c37af314d262c1f71"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx:11 imports invokeai/frontend/webv1/src/features/ui/layouts/shared.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e6c66d4a90dc512b81e06176c379e5b49e75d49da433a856417881ed5feeda2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx:17 imports invokeai/frontend/webv1/src/features/ui/layouts/use-collapsible-gridview-panel.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"b064059b1a0217c07b60ce4453ae77809098f8ab49029fd09518887fb085a87b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/ImageContextMenu.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/ImageContextMenu.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f034883d12a9d6bab8527a1101ce689d599dd4e5a7aedf19cea0320d7b610e5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemChangeBoard.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemChangeBoard.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fa3eb89b98e1e6f8b2c2c40fce9b1128c0fe8bddab699c6c8905c1453be5b4b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemChangeBoard.tsx:3 imports invokeai/frontend/webv1/src/features/changeBoardModal/store/slice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemChangeBoard.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"48c2d988b851a4f2fdd037b46c14717d8e6afe33132ac60fed4dcaf3629b0e3e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemChangeBoardVideo.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemChangeBoardVideo.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"157280a7d4a16784ab5437ed75b7ab63c7b3fdeae708b30f6c3274e92ec6f9a3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemChangeBoardVideo.tsx:3 imports invokeai/frontend/webv1/src/features/changeBoardModal/store/slice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemChangeBoardVideo.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6cde714e72763d85fe666e746fbb1df0e1e7e6f949eba9e65500a1fa06b0a17"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemDeleteImage.tsx:2 imports invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemDeleteImage.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"06b4c1d7c91430a03718df290bc2e5187b40b327c8d2add88212f2d1dce38283"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemDeleteVideo.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemDeleteVideo.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"52245c21bd2ae627c644c174d2b23e91041ae32d56dc799ed01bfefca9efdaf2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemDeleteVideo.tsx:3 imports invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemDeleteVideo.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"d939ac7e93daafc61e83c7c1be2fae4324adb5ceadbeb1dd452d0fd0bbf48638"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemFiltersSubMenu.tsx:2 imports invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/addPBRFilterListener.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemFiltersSubMenu.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ce9ae4cec23d2a7b8fb4ae5460adf0739a51a8709f06ac70f99acbb21addfad"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemFiltersSubMenu.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemFiltersSubMenu.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbff2052cba6f01d6be46e8b6515eb0511301a2779fccf0786b09f0636e0df29"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemFiltersSubMenu.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasIsBusy.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemFiltersSubMenu.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"4413958ebbd4c382e96b7e4c72dc4191d861333fc5272d75ede541d49d5b6c4b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemFiltersSubMenu.tsx:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemFiltersSubMenu.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f01584d0b7cb87b8263fb7b0e934cd6af17c61c8175de0d62ecfc0ff7b3362c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLoadWorkflow.tsx:4 imports invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLoadWorkflow.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f82fb2f668f5b5f1c6a57ae8a477348cdf78d9b908feffc967da5a4632e596f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLoadWorkflow.tsx:5 imports invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowConfirmationAlertDialog.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLoadWorkflow.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1ef160ee517a123402e8ef3ddbacf9a0687ad795c4d0978240070f4d2be7383"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLocateInGalery.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLocateInGalery.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"68de5a805be6d1174f69ce8165f9d71458aeb6b5c440e2369d780dea246e3886"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLocateInGalery.tsx:6 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLocateInGalery.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c935f7cc47165953df341558d9134cd365b31651dff300d1f223ecf67bce155"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLocateInGalery.tsx:7 imports invokeai/frontend/webv1/src/features/ui/layouts/use-gallery-panel.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLocateInGalery.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"049e2804413962a2b031634e9cebc8b36a72e850c312701361aea4294e92b34b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLocateInGalery.tsx:8 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemLocateInGalery.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"5313acf68854be7bbbd4bb4af62ac227835ba07423e4444150fe647998bcde79"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"350ee28ba506a33bc701e5020286378bdb665401241c6dca7450c4bf5f8a8361"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasIsBusy.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"bba5d809a3bd78b021f18ff6f7af7930fc6f85d4ac7d34c96093ace23300ee50"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"fae00c53cf9e9ff5a0b551d20f31417fb97417a8819f180713333492ec0a84ab"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx:7 imports invokeai/frontend/webv1/src/features/imageActions/actions.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2aa8cad180d6f765f1f5c43de618191ded2838f6d339c12b832c30bd393a0bc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx:8 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"34259ff29b2b647c3d69910e05b47827337d81bb9b7aec558ea934b1bfc3ca94"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx:9 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"859895fc0d717225cad543fd3d1bee620964bcf485919621307dc7e403ba62a0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx:10 imports invokeai/frontend/webv1/src/features/ui/layouts/shared.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewCanvasFromImageSubMenu.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"27fe26444f1eab7c030f082fdbf8e9c57c8132f93cd3db1c4df57313ae799a34"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4746ca204851413d6456096505d4b4abf6cd4c8068875dba0ffd791dc96c0a6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/components/common/icons.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"25ff2ad95634ab54dfa14fbc1319edc679a0e37e09ec997d9b0025530bd7f84b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasIsBusy.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"fab3af61baa66aa4980e7d867e94654018f4e922ce311a5d9b170a3c7fe739f0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx:7 imports invokeai/frontend/webv1/src/features/imageActions/actions.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"64c60708ac1d45ef030edb943a7b984dd843c1f472f879479bc6a4da883c2b66"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx:8 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"01f15a18ca59336db557121d59e5817854ea5810dfc4a5e005980ca61d07072b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx:9 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"86dbf388e63ece46c540ba056bff6ae490894652b92c666fc7af896f6e66a87e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx:10 imports invokeai/frontend/webv1/src/features/ui/layouts/shared.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemNewLayerFromImageSubMenu.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"51e0792a8bf3c88c39f99819c4ed5e18456c35fbc9047368d6f2339f1b27cac2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemOpenInViewer.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemOpenInViewer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eedf7d09602062454e04ac1a0d652f56f968b8a690c79b89dba4269e136a9718"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemOpenInViewer.tsx:5 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemOpenInViewer.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"adc1eaa5b4e14d704c83ad8fcc08a6b1172c79bf5401419bf40424079b63ab2a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemOpenInViewer.tsx:6 imports invokeai/frontend/webv1/src/features/ui/layouts/shared.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemOpenInViewer.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"b695471f48f88e811d39da280b31a78ba8b02ea2f300a26eb26dd7c19818587e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSelectForCompare.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSelectForCompare.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a78ea9ae710b59ce630d9fc4d1a9254adc685c050e231a78637b7b84a65d1a65"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSendToUpscale.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSendToUpscale.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"174f7f413a72a22a587850664950bed662fe7f49c7cbf5a88a4c1605af206f25"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSendToUpscale.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSendToUpscale.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b5a0ec1e2b2559a4798fe04eb7b32a13de1ab8dd0c9c5a5e0519bb74ea9ed3f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSendToUpscale.tsx:5 imports invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSendToUpscale.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"5add00a75cb397a47e9659094e3349ccd6a09440bf336702449c503e09d98b4d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSendToUpscale.tsx:6 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSendToUpscale.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"35cfd829b2b51929c8be4c36ce952568daa7d53c34760b4be8e90daad26ebb9a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSendToUpscale.tsx:7 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemSendToUpscale.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ca2601b711cd249c243c2f803238a504b69f18a6ebeb5478f7df15c5c09c247"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemUseAsRefImage.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemUseAsRefImage.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"7daa1a916e383f6da758219e1a376069ecc93ba3e46e3117576b28d11dacc45e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemUseAsRefImage.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/hooks/addLayerHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemUseAsRefImage.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b426d332b4bc0ac6e844b70113871ccd0c59a6b0f42b33d58dea4da54c7a2b12"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemUseAsRefImage.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemUseAsRefImage.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb690f11c193919a8de36d30180832b04a8d2254192c8ea628e8186e706d0375"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemUseAsRefImage.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemUseAsRefImage.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"35bf069e52ee4cd21503c72ea8513f66e7935f40b6e1a8f61bbad389db9943f2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemUseAsRefImage.tsx:7 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemUseAsRefImage.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"d34eb34f2edbe3f689123a4ea7833db3ab3e968d07d9b55532195517c4b6a614"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItems.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItems.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d577484d50227e29096e6d0237aa65bcfc37d16549045fe90a746151ae0730b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItems.tsx:3 imports invokeai/frontend/webv1/src/features/changeBoardModal/store/slice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItems.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"31d9bf1a2f95a1b5fe0c2fac8175751a403248f04d65a6a2ed43bb29969fe930"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItems.tsx:4 imports invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItems.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"431b5fa22d4a076006d1a292351039c6713ba35e4c34948822608219e8811979"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItemsVideos.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItemsVideos.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fb9074b62f8f5e5885701babab904739d9ae27a9f78c3e7a921e32729074ab4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItemsVideos.tsx:4 imports invokeai/frontend/webv1/src/features/changeBoardModal/store/slice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItemsVideos.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"819e8397dc844ca73caef451a84d1a36c9b2caf7768e3a3f73c548f91a080678"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItemsVideos.tsx:5 imports invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItemsVideos.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"b57b560b991265815947802bb7d78bfd32fbb6060dea99fefcdd54da79f1496c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/SingleSelectionMenuItems.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/SingleSelectionMenuItems.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6e5ab6d43fc86f06fc0d45d13041c3dbf0f7718746d8652b56a61dfbe5a0a36"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/SingleSelectionMenuItems.tsx:20 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/SingleSelectionMenuItems.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"19a08c6e60f80199b8e73160932db1bcc984475fc52e20d8c992206bd0939192"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/VideoContextMenu.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/VideoContextMenu.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"425348d134f3549208395e4384e1a8817246b5ebd201c21b2f86b2fd95e1e279"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb29b82a5ef590633277597699e3ba7754455a4a2f0ef9468f2b8b7e96094753"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx:16 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fa6914f048902a678d931952acc04e93f9c1ebae7d9d780e20b2fb03603e410"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx:17 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a65e4edba5c175bdfe87ca2823f2b08e1d67961fd18ef8c68497ec900ca569b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx:18 imports invokeai/frontend/webv1/src/features/ui/layouts/shared.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"960b85f58e04776aee6a94447f46a153a862e4c06467ec911df64ae30f4dc885"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx:19 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"70030cb937c0cafa0158c28038d449145d1a7f2c58d00ae0b95209f36ad52ae2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGridPaged.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGridPaged.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaf7a86899c1e41ad37029c9b17ffc97c9e7dce6922fc28876dae6495fb2ffa2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"d064a11043260d3f2189cdf20036ad7e6ee9ada64b681c981257168af83e67ad"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx:9 imports invokeai/frontend/webv1/src/features/ui/layouts/auto-layout-context.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"f461600045de5a8387b9ab4d3885ce2ee04cd8a0ddbc73f40adce3b5fc92401a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx:10 imports invokeai/frontend/webv1/src/features/ui/layouts/use-gallery-panel.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebbaa1a22b4ccc2c0c0ffc08b40a4f1309f5b3c3c7b2da47c9995d9ec824d8de"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx:11 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"df1c5ae61d74f51a9d824796ad88ed0a09252db829bc93bbe41f1e9e244862ee"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AlwaysShowImageSizeCheckbox.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AlwaysShowImageSizeCheckbox.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3823dc2e9df9e9cf9b5d7d39ee8aa8d48b0d2c9e86a12b99a53822106e2891d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AutoAssignBoardCheckbox.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AutoAssignBoardCheckbox.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"b84585881f25fca79c1e837dc67f9c3e09a7c211e24e368ac1923698ec783669"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AutoSwitchCheckbox.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AutoSwitchCheckbox.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb875cae55924aea8cfd1f73fd762e780e763b32dd78c283f50e794ac4307d59"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ImageMinimumWidthSlider.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ImageMinimumWidthSlider.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a02aad1e76e6533f75d3dd4246a78e9f31c4a5a17fef2e758bfe8e8d59737d6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowArchivedBoardsCheckbox.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowArchivedBoardsCheckbox.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a2c1249e185c182f9569bc2c24081ed99235b47cabefb58897966b756474ae6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowStarredFirstCheckbox.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowStarredFirstCheckbox.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c223cfb8aca6d0b51464b62f0b2d1e871bd68314cc51b361d287a52e52b8e8a3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowVirtualBoardsCheckbox.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowVirtualBoardsCheckbox.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"bddd8752bdda741c01c168ecde108991565d388f361b53286af29de5f3e67e89"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/SortDirectionCombobox.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/SortDirectionCombobox.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb2748e29e67a8748bf16dad1cffd908f24db7bc184a030211072ec430b6ea2d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/UsePagedGalleryViewCheckbox.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/UsePagedGalleryViewCheckbox.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"76eb8736a70a52161442f13dc84aece455c7307d1fb32936bc4dcf3ba9e548e0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/UsePagedGalleryViewCheckbox.tsx:3 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/UsePagedGalleryViewCheckbox.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f41276ff04e45d1377b281b30ddcde6ddd36330aba7bcfa5b29f30463b03092"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/UsePagedGalleryViewCheckbox.tsx:4 imports invokeai/frontend/webv1/src/features/ui/store/uiSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/UsePagedGalleryViewCheckbox.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0586992e98cc60272fe7b30ad31523b5a8892886cdd8e83b5b85d1f79f930a3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx:7 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bf5f6b1e3c3e568673f53e5d8d8e73bc26f5ded016d7690c785ba435020825c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx:10 imports invokeai/frontend/webv1/src/features/auth/store/mediaCookieRefresh.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc2d0f3c1662171c2f096b6648070813de57be95ee8d54a6f08db5055dc9b151"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx:11 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"1663bbaf6bbae3d24a8ae74bd4596187d7dc52a15796cbcfaa78a9ed83fe671e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx:13 imports invokeai/frontend/webv1/src/features/dnd/DndDragPreviewMultipleImage.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"35b8db29d3e11b460826b1470307b9c36f3c85c0a80fd09b7d4ff383194150d7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx:15 imports invokeai/frontend/webv1/src/features/dnd/DndDragPreviewSingleImage.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"2534129b25b04954d4b7559fe3e85d8898c6bd6cdc9491bdfa28d0ee5ca7e04e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx:16 imports invokeai/frontend/webv1/src/features/dnd/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"86d6350b621536a4b7a74320a837db882b23dd805117648aac83d8e15def3fbe"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx:28 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"990570ea5cb8688e519e614d4faa51d681853028bf95d463540c582deb43a022"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx:29 imports invokeai/frontend/webv1/src/features/ui/layouts/shared.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d1d6ec5bd66237e43ca2f7838fc5c999bdab20eef1a546baa97c58f5c4b5e90"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemDeleteIconButton.tsx:2 imports invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemDeleteIconButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f33ee8563f23aac8ab3d12a9c73fc11bbd489d8bb6a3be913b4add4adfeb8c5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemDeleteIconButton.tsx:3 imports invokeai/frontend/webv1/src/features/dnd/DndImageIcon.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemDeleteIconButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"768147aac719a5ea1a2cb71783fd91e8ec4b3d5c5c0ac4f4ee2db9e062f3aeae"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemHoverIcons.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemHoverIcons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0892587b2d711a4ed41a9befd5fa9907257d2d3aab239e9397af251e536d9c7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemOpenInViewerIconButton.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemOpenInViewerIconButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d482aac685d8417e3a5c328e1212d0478115a354e4ab749f652c944f06232676"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemOpenInViewerIconButton.tsx:2 imports invokeai/frontend/webv1/src/features/dnd/DndImageIcon.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemOpenInViewerIconButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f57edae9e7ce39e818e29f2048b390a1fdf1d5d92320cc18f46d9a4003c687b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemOpenInViewerIconButton.tsx:4 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemOpenInViewerIconButton.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"02bf6b7746b9b073ce73b6b71aa6962e13698875caacfb05747ad1791fa3918c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemOpenInViewerIconButton.tsx:5 imports invokeai/frontend/webv1/src/features/ui/layouts/shared.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemOpenInViewerIconButton.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3aed6ca84c829986c6ce6df438ffeb15aebfdc1d0808f93a813ba730017c3bd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemStarIconButton.tsx:1 imports invokeai/frontend/webv1/src/features/dnd/DndImageIcon.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemStarIconButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0e05c6880145d752998c90f986b169389561d771fea79451c8614521a03d2da"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemVideoStarIconButton.tsx:1 imports invokeai/frontend/webv1/src/features/dnd/DndImageIcon.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemVideoStarIconButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f539fd1f79de7f08b4d0da92485e8aa33226116b4c314732fbe18203ffed410"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GallerySelectionCountTag.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GallerySelectionCountTag.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f73807ed1d9e35ef360af0677142c6a6dbf82a4889c4b943f6e63e22c7f29b87"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GallerySelectionCountTag.tsx:6 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GallerySelectionCountTag.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"27c71abcfaada14a44d37f5bb4831108412533dcac4fe241fc447a734b65fdbc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx:6 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c852cd52cee61abcfba75434ee87a3e9e561a3e27f424f6fcd77819c62e5ce4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx:9 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b974129f5ddfde4f619a5956076f1c13c85e9093d9573fbed45106d9268f12b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx:10 imports invokeai/frontend/webv1/src/features/dnd/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9c0392b7d1c663934e6544a93bd2ff762e414f6e905ad0e00059b8b0dcc3a1c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx:20 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"796ddc3b99aa2c61ec956684032b1660940515c0b5816f99146196c37a81a44d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx:21 imports invokeai/frontend/webv1/src/features/ui/layouts/shared.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoItem.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"c008bc6a98609aec4ca9e24aea1d7107dec1b29c1905db8c7eaad0dc7de8fa71"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoThumbnail.tsx:3 imports invokeai/frontend/webv1/src/features/auth/store/mediaCookieRefresh.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoThumbnail.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"3360a499c86275d6190c676cdd8d2a8a6107ae07550924563832d77b67005b43"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/useGallerySearchTerm.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/useGallerySearchTerm.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac9087488eb9f67121ba4e95dbca824eee445be83d694385b7315c2f49c39fd0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.test.tsx:1 imports invokeai/frontend/webv1/src/features/metadata/parsing.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.test.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bd27ab6f4fcd3933e441554aa49ddf1f0cfaeaa0ef3b2b810d47f0307805726"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx:10 imports invokeai/frontend/webv1/src/features/metadata/parsing.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2ac9dff278591e8a6756b58e93f14372f0716585c8a0e9f3f9ae730aae85a84"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataViewer.tsx:17 imports invokeai/frontend/webv1/src/features/metadata/parsing.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/ImageMetadataViewer.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"70ea9ee551681efeef991089e4361aa709b9039285dd56c6a89f9186c1476d60"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CompareToolbar.tsx:12 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CompareToolbar.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4e00540a27d1d99c536cddee029f07b301099d46d0cb3682bba9364022c970c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CompareToolbar.tsx:21 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CompareToolbar.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc327a6678f546a6a23fb5530794dfc5b3ee5a24b208243b84393004fe5a26a0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b168ade458fff9f3a1252c59008d5f743283622f312459cbf3dc0328c5603ff"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx:3 imports invokeai/frontend/webv1/src/features/deleteImageModal/components/DeleteImageButton.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"26125e88c61ace991c38ccfe7b88d243553fd3119673e2d571e60e525ad3333a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx:15 imports invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/PostProcessingPopover.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"db2815e5b36e96fabfde2d5706bbc65b829c6426e2f52d62602cd4dcdd356f86"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx:16 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1ce9ad35edcc7260092e330b533837ec405aaab91b24dd7f9b3396c2884a696"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx:17 imports invokeai/frontend/webv1/src/features/ui/layouts/use-gallery-panel.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"2407dd5e59fcd641eec340c12d070d76ee16a1cc1e6f1c0e3d7bb94bc9da0acd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx:18 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"ede3404e0f57b3c1ea0121c0ee10c63ae430306888629e8c995c386a25c8e23d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"7805ecc78eb43c39e58874ded01b14179c01d449f8e24fda04be9b10bf034cff"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx:4 imports invokeai/frontend/webv1/src/features/auth/store/mediaCookieRefresh.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"83fd490dfc7df62f2055522fb59ef91355227a4a7af965ec8b398550c6b9bdef"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsInvocationProgress.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ce3697f804d555dd963971815e8be403ae4be48652a26adf0dea2580619d249"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx:6 imports invokeai/frontend/webv1/src/features/dnd/DndImage.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"e98c962c7118fb2aa993d98dd9a8e2f0b87be30f9df0f98ea50f4f4e1b8301fa"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx:11 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5d71d194855c545bc766ebb004042bd705c03e1c89dd4c56213e1aa313a7681"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx:12 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"a04527ecdc744837f9414202b9f95f55de1508a4988e910b7d0b2677b3f70aac"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx:13 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImagePreview.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"19abe99fb03decea3427a4ac9a92a848067a2d3554e477f33602380b555b119b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoButtons.tsx:3 imports invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoButtons.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"facabe11d5d27c9e08a8ac2fe4e13c75626d4f358d73a6c3058ce5cd76749d94"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoButtons.tsx:4 imports invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowConfirmationAlertDialog.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoButtons.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"1346ec038102117771801eb542ec997235c4d4c4c142948653a56fbfa1e37170"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx:5 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"41bf8014b1ef8d4367674c02acfdfdbb16d31e6cbf581dae1684160debe2bbc4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx:9 imports invokeai/frontend/webv1/src/features/auth/hooks/useMediaCookieRefresh.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d15ba590a0f8c953bd170d1f097c8162ee1f33d3a611c1b758019facfbc48ea"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx:10 imports invokeai/frontend/webv1/src/features/auth/store/mediaCookieRefresh.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f487b2429560e521fe7cf58b2f5ee849eaf70ccdb6e538c786cf11c49289f2a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx:11 imports invokeai/frontend/webv1/src/features/deleteVideoModal/store/state.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a76b90eb207ad0aed9a736db4c311e956368602b16859c9bd0d3dabde088dec"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx:12 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"e58b8c5ce0f082509f806c02d23af9f121a9af24cf999f3b5d541b1349891c27"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx:13 imports invokeai/frontend/webv1/src/features/dnd/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7694fe0b30b911655cdc07b21d0c19a0e759045eecbe0bdbd398bb7c78aefe2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx:19 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"1987599dffa63b195b77b46879c1f82297adbf2d05f1882fccd0da9d9ce0aab0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx:20 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9d249dcd10928dcf340504e6d352d20a1c28709099516cbaf96e50c5995ad93"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx:21 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"f713ed007ef4a4c7d864b57843e0d180afec3f2543367fc46ca087e8b2099507"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx:22 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"c65071f0d25a0000ef716ba913d3c4272e012129a7c99b6a3ad63c2ea887d46a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparison.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparison.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"01e79fe6c525788b48d1e3740b7f15490fa7459ac56e453b131e0424c3ecedf1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonDroppable.tsx:2 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonDroppable.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3d6de1941bbf86fa874969fedc515018eb79b0a1fa0d7ea8182db96042c55d5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonDroppable.tsx:3 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonDroppable.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf08337a4b5f270c6d92c9e4c587a993173185ecb39e5e12c9053a89a10b8934"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonHover.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonHover.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"aebb7bf3f1fe849400f5003db34db0743fa5cbbf7ed404370191546c2a762f14"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonHover.tsx:5 imports invokeai/frontend/webv1/src/features/auth/store/mediaCookieRefresh.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonHover.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"585dc293dcbdb0b6c34ac526e32ae8ad28d95a485cdb37874050d0196f922223"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonHover.tsx:6 imports invokeai/frontend/webv1/src/features/controlLayers/konva/patterns/transparency-checkerboard-pattern.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonHover.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef69c9f99a020485d3965b72dfd57c2826c8c7f9fcf778c755d87532300d3a24"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSideBySide.tsx:2 imports invokeai/frontend/webv1/src/features/auth/store/mediaCookieRefresh.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSideBySide.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"85cbe17c4571d8277c18909b3493acdfbc1f9f0c4e73f35ab79b7658293516eb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSideBySide.tsx:5 imports invokeai/frontend/webv1/src/features/ui/components/tabs/ResizeHandle.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSideBySide.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"a72fd93526792f4ad8f0f6e99649e7b265829dcdbb546a34061bff1fe4b5e31a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSlider.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSlider.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"df8dcc950ea54b508fabd3f327144c10f587c14a11bb37a38dfcd8c20750ba5a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSlider.tsx:4 imports invokeai/frontend/webv1/src/features/auth/store/mediaCookieRefresh.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSlider.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"21ea84423e417c8cea867fdd441c46ed33bef101086ba0f3ccc1467385a6458e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSlider.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/konva/patterns/transparency-checkerboard-pattern.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSlider.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"e15e9f22ef16256df5d53d22ce895bbe9a9f9022c25bf1c87cc91fe5c1bc3462"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewer.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewer.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"48254756592f0f8172607ed1ca5816fd9380e0ea38cac4a3c730577b9f02316e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewer.tsx:4 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewer.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbe08a9df1182dd72e0e8acf46ead9f9e84a866a22e4c31c4eef78fd29c866d4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewer.tsx:5 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewer.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"15bddbe972662c7f02d1c768d881ce65222a64513491cf5258d2fc60364be8a8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewerPanel.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewerPanel.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"75d340f0e0a6d803f730ef87a8d5d33fae50a382deb2c99287eb91835bd03ca7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewerToolbar.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewerToolbar.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"251caa22f3929e20b2980b90c8438bee2cb2be4e786781b8324cdcbd3c6ccf53"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/NoContentForViewer.tsx:5 imports invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/NoContentForViewer.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"07e928081ad3f2ba83b28d5932a745b301e9660b5e4a80a37abc69ad40a98e79"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/NoContentForViewer.tsx:7 imports invokeai/frontend/webv1/src/features/modelManagerV2/store/installModelsStore.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/NoContentForViewer.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"5edc7b25c8130e9f5842391d351a9f9eabe23f0b233d9a90eadf7e2975e2c92e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/NoContentForViewer.tsx:8 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/NoContentForViewer.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfdbf26cc6f07f98a5db42bd59f67156b73d79150f527b3f789ead69580bc103"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ProgressImage2.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ProgressImage2.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"5365dee3a91afa371bcb06acaa421ed8b9fcecfe46d283c05938ce0fe83bdc3e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ProgressImage2.tsx:6 imports invokeai/frontend/webv1/src/features/system/store/systemSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ProgressImage2.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a7f5a545d7ce3bfe07b01e2aa3e15e7824074c29a3b507faa3ad32bc494b4fd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleMetadataViewerButton.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleMetadataViewerButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"22277d607749182be1039343305628be2ac1357e8e678ab55a593e3b795a074c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleMetadataViewerButton.tsx:4 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleMetadataViewerButton.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca45c174bd53da5f0af0b139674c29d46e859e72c06faaccc6b6d2c7eb9a56c7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleMetadataViewerButton.tsx:5 imports invokeai/frontend/webv1/src/features/ui/store/uiSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleMetadataViewerButton.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"153fa6a34ed76229364ceb2772701128a9ef7197968e21f0a964f4e72a3b5f95"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleProgressButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleProgressButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fbb398d1e6a7a9240106333f1bacc1b6b2090700b1f77e859f5ec37737b45df"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleProgressButton.tsx:3 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleProgressButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"39c2bb9dd34c018588a69b48fd883f3f47c64a6d54be59ca18efc402709b6dc1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleProgressButton.tsx:4 imports invokeai/frontend/webv1/src/features/ui/store/uiSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleProgressButton.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5b82fd9ab7ffa03461aeb5d8d07cd0bdfdaad5f5baabe742bb95a310ecd4de1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/common.ts:2 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/common.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"88ca07283e3f08b1e14a3a36bc7a9b1aa3a6fe3512ea1a6bce3d43570eef3b9b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/context.tsx:2 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/context.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdd6e11e1e6baf38c2fbfc33d0ebc6a9c5af70bb1888d0125cda2e0fd0f67f8f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/context.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/context.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2aaf1fd2a6fcb2342aa44870b15378ef8af70b95fc5e5b8dc1e141517a13015"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/context.tsx:4 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/context.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"840aae52f170c3e514fd8340a0201e64874dba01127ce84b0be013fca1b72457"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/useToggleMetadataHotkey.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/useToggleMetadataHotkey.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d4c5ecd31c040e3a8dd2b6e4bcde995878c0a1f36425d2987681a4dcbe10bcc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/useToggleMetadataHotkey.ts:4 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/useToggleMetadataHotkey.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"77b0627f029b01f64f11f468a6a204212cc2f26e40c8f5db1bbf665dae24f53c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/useToggleMetadataHotkey.ts:5 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useSharedInfoHotkeyTarget.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/useToggleMetadataHotkey.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"b09a4163d2aa89de12020de3009a20978f67f9afa76144fb1286d4cfbe9843da"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/useToggleMetadataHotkey.ts:6 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/useToggleMetadataHotkey.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3566dcd1db6abc48ecf50dfac7db57d58c63d59720c931e0129200745e3baf8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/useToggleMetadataHotkey.ts:7 imports invokeai/frontend/webv1/src/features/ui/store/uiSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/useToggleMetadataHotkey.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a95ddfdfeaa2c6780f9fd0be4ddebb29a6c6a346f18c44580194b4d9a7f2fb1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/scrollIntoView.tsx:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/scrollIntoView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"103e5d8b32c0b73ce554727a907b9829e0389b39df2c6666baad4176a7499326"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/use-gallery-image-names.test.ts:13 imports invokeai/frontend/webv1/src/app/store/store.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/use-gallery-image-names.test.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"13e139f9c6dda56d20aa1af93f34000343f5de56bca09ba75ff6945d73a88743"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/use-gallery-image-names.ts:1 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/use-gallery-image-names.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2f0306adf09fbc0ef3170d709f3d144c78d16bfd8e5793db5a2cee8eedb1960"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/use-gallery-image-names.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/use-gallery-image-names.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"46f57d9e4d539e4a234da28e993a10eca033453a2a78d373f0e4d8cd97c8710d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/components/useNextPrevItemNavigation.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/useNextPrevItemNavigation.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aeb401db3b328891ccc9a585815ff097982e7512ea2d7bf7ce4cebbf93565614"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/hooks/useClearStylePresetWithToast.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useClearStylePresetWithToast.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa375b44cc7ae2e2f5cefbd2330417dc2316bb0e847b6dec85fe27f8c37f8d02"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useClearStylePresetWithToast.ts:2 imports invokeai/frontend/webv1/src/features/stylePresets/store/stylePresetSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useClearStylePresetWithToast.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"31945f85c144b9788068dac9b2ec51c3878c0ae0fb35bb7fbcb8aaf10b84ca58"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useClearStylePresetWithToast.ts:6 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useClearStylePresetWithToast.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"5072e6afc4124ba84425a1a93febc801fa402e715a2350e9a106f64ef3f32826"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/hooks/useCreateStylePresetFromMetadata.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useCreateStylePresetFromMetadata.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"196423aa6b19acd42e14fdb21fbd47f19bd20c62bce939631f4c3c7f11a1b882"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useCreateStylePresetFromMetadata.ts:2 imports invokeai/frontend/webv1/src/features/metadata/parsing.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useCreateStylePresetFromMetadata.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"163248ab70caa1ccc5e076318dd1315721e4e5c909c8f6c09cb194166aecc066"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useCreateStylePresetFromMetadata.ts:3 imports invokeai/frontend/webv1/src/features/stylePresets/store/stylePresetModal.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useCreateStylePresetFromMetadata.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"00dd3917b989a053dfec4e3157a885267cc5b14430f7d30af5c99a283a2c92ce"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useDeleteImage.ts:1 imports invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useDeleteImage.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aeac82832e6d79fd1ece517691431ef259b192ed47dc5cbf4da7b49b0d945a9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"86589424b08fba019872737d216fe35f601eb87530fcb7f06fd64a49ba3ebfe3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/contexts/CanvasManagerProviderGate.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f8a5b753b2d94e758444a201cd5bfbefe33bcee859bd368970b50e302b131b7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b0f9e8eb8ba1c1eb75561cde5d0bb00a75a02c5535e976588682b401de9e33c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts:4 imports invokeai/frontend/webv1/src/features/imageActions/actions.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd7710474d04136f14627566655a7088bbb6beeff41619035d3f878f5d1ef8c9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts:5 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"da08df112d3154c1f428f16cc84c46dfd7e7673e8c0863c37306b2887e4e1a3c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts:6 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"92df63e68239ceca91d0f9fd386a72994a17bff7854caec1c80be62b2531a3ec"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts:7 imports invokeai/frontend/webv1/src/features/ui/layouts/shared.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"d00c73f7b26029ef242aeeeb99a5426d830c128b90c1be1b7754db5066558b8b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useLoadWorkflow.ts:2 imports invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useLoadWorkflow.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d984e5ede358809ee6874c70fa276af4140c8d8ad4e5f527586f378ea147f5a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useLoadWorkflow.ts:3 imports invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowConfirmationAlertDialog.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useLoadWorkflow.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f8aa370f90982041721dd9e34f88aa7f90bd590f0a33d8fb33655f5c1c32563"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/hooks/useRangeBasedImageFetching.ts:1 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRangeBasedImageFetching.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6404fc08b822c81ea64a09923898ca3bc0b10ed89749fc3da4c542845a6ebe83"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/hooks/useRangeBasedImageFetching.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRangeBasedImageFetching.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0c76fa16c93aa5c858306e763fc2d9eeb5aea436e1691621472a16da9c5e679"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallAllImageMetadata.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallAllImageMetadata.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8799c25388585f9481a1c64b99a63b8f8dcc6bf12f0a31fd48abc89a4a7eaf74"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallAllImageMetadata.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallAllImageMetadata.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a055fc58a149ef8c84ca01b6f49cbd8debb72891dbb409733dfaaf34bb78bd7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallAllImageMetadata.ts:3 imports invokeai/frontend/webv1/src/features/metadata/parsing.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallAllImageMetadata.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"df84ea6a3da8f9280a5a7cd39441d654bb67cb8e053d3a687501d70104df12b3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallAllImageMetadata.ts:4 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallAllImageMetadata.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7555c221c65a5970876b040e646b8011f4838d7fb153cba6a0de08b366204e3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallCLIPSkip.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallCLIPSkip.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"83e4d485f52271f9d607b6df1ad328a9164f65c56db3e60b210686d05b7b9ad0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallCLIPSkip.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallCLIPSkip.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ad0767508526c2741c531bb1ffc661bb9e5507d306d5b60f4263a029b5053fe"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallCLIPSkip.ts:3 imports invokeai/frontend/webv1/src/features/metadata/parsing.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallCLIPSkip.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"075b1ee207386f40cef5cf9a782f6d3ae92653d1a23a0c55f6fa36a66e3d5778"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallCLIPSkip.ts:4 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallCLIPSkip.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"379d8ca69ee74d6d95dbfd878f712e6c1a4dfa467fbb62c3bb40c33926b08eb3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallDimensions.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallDimensions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"473d10486c6a40dcd5e719e816536c38ae8ec48b79538f0ffa835a9432611a81"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallDimensions.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallDimensions.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"18455de04980b1213e71e44b8146df929a293e2e32bc33f6dbde5b94c49535e2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallDimensions.ts:3 imports invokeai/frontend/webv1/src/features/metadata/parsing.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallDimensions.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cee9c5daf6078928b72be0d1f39382251d33d01ae8235a64ff8b0d3e360f638"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallDimensions.ts:4 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallDimensions.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc2b07b7ce940e3f37fc02affd2a4bd3eb780caa735bb3703efb2afc2732ccc5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallPrompts.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallPrompts.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c080755d4cd5de3f04defafc1cf687700954afa3bc242096e2d7d39ece4943ee"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallPrompts.ts:2 imports invokeai/frontend/webv1/src/features/metadata/parsing.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallPrompts.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3b3e6f46993603b78fa0ba20d70b8f8468b82a0de46a99ffed8d11282632486"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallPrompts.ts:3 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallPrompts.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff3ff80d979714566eb4d44a00f22e014023506a1ef828edc952ccd880b5b7e4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallRemix.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallRemix.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b03afc92456d9ed3bbf833fa5cac03a1c33c41450c1279269e2b36c010d366a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallRemix.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallRemix.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2f82626bec75dae67fad68fc95bc6a1a5d71c621667b04832abddf13fb74965"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallRemix.ts:3 imports invokeai/frontend/webv1/src/features/metadata/parsing.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallRemix.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1fda6c8faae5d6d8c5ee19b86b21717e8add7a6f7422ead5bdbd22d925e589b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallRemix.ts:4 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallRemix.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"07e2ba2411735f87c4582717339e1b9f88e7500f33c091f5fc7f781e6f3245b6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallSeed.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallSeed.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"74c2da90d9d3cc9a804b5d71f2e181b0711cf886d5174ae3e8c2857b795c2c2c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallSeed.ts:2 imports invokeai/frontend/webv1/src/features/metadata/parsing.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallSeed.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"319a2516aaf051c6ed16498d994b8c753d44c1a66c04c80892b04735a441462b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/hooks/useRecallSeed.ts:3 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/hooks/useRecallSeed.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b20561f67dbdd8cde28a67d5241825e28f9e0cde974a3b21d06ca31d73277593"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts:2 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d3afd84da980d5e2edee7b68f9c4e4cc9edec6150659257be34ed795108c220"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/gallery/store/gallerySlice.ts:6 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/store/gallerySlice.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5bde3974b43eecc286bade85b6c5960b6d4640b0b317180ada94c46e833a0f3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/gallery/store/virtualBoardGalleryConsumers.test.ts:4 imports invokeai/frontend/webv1/src/app/store/store.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/store/virtualBoardGalleryConsumers.test.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f157047049e7c4950f0e13a75d68828117d607f70464aba0d799c8a12192045"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/imageActions/actions.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/hooks/addLayerHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"e19eea1f354218445bc975a225ea966e85add80a995289d79aab14806097752e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/imageActions/actions.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5c6c185bdafdb81ed5e0dd6507cac24696e7e83ec1078e1ab22ee08bbb89175"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/imageActions/actions.ts:5 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8c53a8185b578c79f84115a1db41f58d46dcbb7cf31d720700b433498e805f6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/imageActions/actions.ts:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/actions.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"20d8babcc54c07d1b42fc7e3e5fec261a5bde6426f6ec1f70345ff11f1cbfa4b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/imageActions/actions.ts:7 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"05b63005cd8c84a93744c470bfc036090feffde79b7d667e7dd87797b8e93752"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/imageActions/actions.ts:17 imports invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"badb8334e68b2b8458bf803b666fca881843051d65e45bf6f9572b9794af5544"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/imageActions/actions.ts:18 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc2275ac207f6458f3ae3d2f7f731ea162760f769e79dc3d76dcdc01a2c09681"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/imageActions/actions.ts:29 imports invokeai/frontend/webv1/src/features/controlLayers/store/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ed7f46129cf820c2982c38b03a2b64dc5b62a07940ab7d5c5fd8f6cc54c7521"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/imageActions/actions.ts:35 imports invokeai/frontend/webv1/src/features/controlLayers/util/getScaledBoundingBoxDimensions.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"25d5f702328c2304ee8cf4d3baafc2b627b6d23f796337560a42d1cfd52d98a5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/imageActions/actions.ts:36 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b84e5d50886e5f9dda35a1c49301c2fc4b66abfd1ec8a23afbd6c020a9e1452"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/imageActions/actions.ts:38 imports invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf65b8e558a500de1f4fa413384702e2ab2cd70f9469f498cd62207cef3c24af"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/imageActions/actions.ts:40 imports invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a08acae944f0cee8fc6db9294d173aafb2e81a9af9979449eb5e615ef724742"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/imageActions/actions.ts:41 imports invokeai/frontend/webv1/src/features/parameters/util/optimalDimension.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"be8e133f041c92cfc7aac1befb8eac314a0b0ff9018578f8994ea2a51321654a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/imageActions/actions.ts:42 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd65a6dbe4d66b51424487c07d3a83727c43c889b242adcc3df4f8fecd4088b7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/imageActions/actions.ts:43 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d6a76f0d406dcbd6a9e01a183453da4e65ac781993910888bf529f93a5da468"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/imageActions/actions.ts:44 imports invokeai/frontend/webv1/src/features/ui/layouts/shared.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/imageActions/actions.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0045386d355ec5845926ab66f5a56eea220ea4091eb3a16d010ae06db4fa8cf"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/lora/components/LoRACard.tsx:12 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRACard.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"44fce9aff50c924d6d5aa71e2bede4117e2d18780e6b2df4a5d2d6990eaacc97"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/lora/components/LoRACard.tsx:14 imports invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRACard.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccefc00f096d075ad6fc3b9d66fd94d0484e0bd64711ff3927e05cf6f899e0b9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/lora/components/LoRAList.tsx:2 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRAList.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"0aba0830af777df070424fbc78ae1fbc46e97e4ae0b7f4e846a79139c4832b6c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/lora/components/LoRAList.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRAList.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"db781ab569b29c55531aed5493271eb773a43af3cb10d08941dcd9f055b4149f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/lora/components/LoRAList.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRAList.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"001f467be434d3e0850200904f2f1efb0056bd0aec48cf05989171e9b0c16676"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx:2 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fa93527d20a3dbeedba42f9e1b4dcee7b59e56a1f996a7e5296d3b8ea93771e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx:3 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebe0c1404d71acf60f4c241ac4965049de2cb385111ad439ba199cfe78179d51"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9b0c343d9fec3c755685d494b05c57718127842d02a24b1561c2b7580d2afcf"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx:7 imports invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce8afc35e5a3eb6ebe592cae766fb8633f5a9a9a3c7069200f07b6099aa99493"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx:8 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"b58e13635196e338d865501fba8f8ff0fba30b04e7115cd24b7e0a5474858429"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx:9 imports invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e769d7d4d878d71ef1f44575005537b346c2cdbf0e5d322483bddcd2d41e26d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/metadata/parsing.test.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.test.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"334e094c237bea29304f37a449a0ff98bbb70a97eb69c49a27cea05a0f9071b3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/metadata/parsing.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a6692514614fc9525c7b14a4eda783e12103103e0cfcadd59caa0c709e23573"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/metadata/parsing.tsx:7 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bc2bb6c984ecfc825cc9006ed5d9f0f0781a57046259704b355c8aa4e25377f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/metadata/parsing.tsx:8 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"865587cb42ee650bb6d12cc8e031f027bd1177c7abbda3364a73911552ff237d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/metadata/parsing.tsx:9 imports invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"af2a6b100c45d544039c41aa5f38d210c94d4e22750b8e3f3085a9d41db31acf"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/metadata/parsing.tsx:10 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f86ac491e2cdac8342bd67e011f8ab597793c6cbb33a9d991db3a0cbb5f2d45"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/metadata/parsing.tsx:96 imports invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"abc4528100afac8783af96ae781d2c7fde5fc0b5a46ec414c64e0fe63895a00d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/metadata/parsing.tsx:98 imports invokeai/frontend/webv1/src/features/controlLayers/store/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"6664da41c5391db5e1b2f8fcc564e7f12ce9ee918f78f8cbc4d662b33770e3e5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/metadata/parsing.tsx:100 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"485c99a287cef2a0d345cc5735bf3e3a9df470dd49cabedbbc36ae3815efb9ab"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/metadata/parsing.tsx:101 imports invokeai/frontend/webv1/src/features/nodes/types/v2/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec70ba41896cec9f2490fa5801c32a510d070747a17fc10af1ec3c3cc55c8a91"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/metadata/parsing.tsx:102 imports invokeai/frontend/webv1/src/features/parameters/store/actions.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"604ceb09daa8d26193917e3ddded3fffc9bf01bd9eb51c95a41364c36eb58577"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/metadata/parsing.tsx:129 imports invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"8552c7b13af7080c2dd327fe370625237d1efc6ef1dace8e3ede08cb79f86e0a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/metadata/parsing.tsx:152 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"df30c9bf44e5c2bdfcf2944eea9435db84749e9d49231fb9e84b6bfa99fe47b6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/metadata/parsing.tsx:153 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ec5dcac54735b0503dceb24f66f5670aa3e70f52cfe80c7e362d4a380c4b641"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/metadata/util/modelFetchingHelpers.ts:1 imports invokeai/frontend/webv1/src/app/store/nanostores/store.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/util/modelFetchingHelpers.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0527ac0fa3210f8495e029e93ab24bb71d3a2b11eb3f10794f4b7269dfeb7ede"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useBuildModelsToInstall.ts:1 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useBuildModelsToInstall.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6042df0f2ea8793d0cf426dc18a24728ad568b200822e9ca8fb3b74607762556"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useInstallModel.ts:1 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useInstallModel.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4d7b73a35b067763a9745e70ae20baf06d81aa17cb6ce97d02758a3e06bb3c0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useIsModelManagerEnabled.ts:1 imports invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useIsModelManagerEnabled.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0764ef3f23330d16624d4ae062c9cb01e762b94c42ddcf2ca873c688f38c75c6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useLoRAModelDefaultSettings.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useLoRAModelDefaultSettings.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7a75658d5ddff393f76660b2c5dd7587bedcf031effd091df262d54ad8a210f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterBundleInstall.ts:2 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterBundleInstall.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"41a16a69fe5217deb2e88a0aada51b6559ffeea799be0329b1b02d9040ccbf95"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterModelsToast.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterModelsToast.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"100c070032d641138fecbf55212c831cbec0985900e3169abfe99e0921fe99d3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterModelsToast.tsx:3 imports invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterModelsToast.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"98a0e9408cbf7152dc21f694160dd167c0e0661910850c59b1f53c855720891b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterModelsToast.tsx:4 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterModelsToast.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce0cc2f2a66192ff9cb15f4278f4da40bd9003849dc203535c3d33a63e104e63"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterModelsToast.tsx:6 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterModelsToast.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5dac84abf684ce623c7d572d67b8b176144c191fe22ce3d7d2983253dd1a917"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/store/modelManagerV2Slice.ts:6 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/store/modelManagerV2Slice.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"15163844b37329baa60f629035f10f82ff6156a5887d41d462c2c3f7bb424fc1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HFToken.tsx:11 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HFToken.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"94b0c80c261798e2324b04023adf265d1996f35367d520dc16c75477386fddc4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/InstallModelForm.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/InstallModelForm.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"bff0100cb59a7f9ea23955b3641db0559f7792cfdc541bc760007f389815247b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueue.tsx:23 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueue.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"144d914102290df7f1414f148098c9bb62682153124de28f6987533a40c7249a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueItem.tsx:18 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueItem.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"81c0832fdc513c17fd8b4352d1acca55ab7d00f31b4ccb459dfccfd3deb115b7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderForm.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderForm.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbd5265c802e2f7f85774faf0e531921024ce02966f0a2d7974b92ac643e6496"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderResults.tsx:15 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderResults.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"39d66f29769bf4b9235a3f715fb1c49d4d8082a2bbb48507bb8f8d8fde0d6ae9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterModelsResultItem.tsx:8 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterModelsResultItem.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9671baea8e7b843474715391c81b44c5c2f7ad07453c0f4ca4141b0a3033f5d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManager.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManager.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"fea53407509448720fc7990e3eb282389cfef763d4f6cd6faa9fcf446b2bd913"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelFilterMenu.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelFilterMenu.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"440bcd22d465bea643348538f5d41612a9b4a5e3b31e1c980622b5d5d2570435"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx:2 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"de4e3f0a1a229ccd44c1605b098eb24f4a9d7ddfc036fadb2504b934042a14ab"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"f228bec55a2d8098624e5e6676328ca71ca1c72bc5df808ddc7caa52e18c9e81"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListBulkActions.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListBulkActions.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"5346ff22375e721a5dc60dfa64670a953a2089bc9a33707df7ceef130f34b311"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListItem.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListItem.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdfbd1ead38784dad1aa2584d01f5ef08c4caa79c13ffa7169fc8071acb8e0a8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListNavigation.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListNavigation.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ac7a4a0c14a01fd904b15123584cfbe41c296bb077c51ae9eb895fe6f50c854"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListWrapper.tsx:2 imports invokeai/frontend/webv1/src/features/system/components/StickyScrollable.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListWrapper.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a1184d6e830787da79f929766bb23226f58101729041cdce0d549ef7536a449"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPane.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPane.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"324e70dc8a6234e6e59374c314efbad30742a6e0ce19e1eb07e15c07c18443a7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/ControlAdapterModelDefaultSettings.tsx:7 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/ControlAdapterModelDefaultSettings.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"26621d4f4169be564f0dd8b8dcfe807d1a3ad909a5f72aea67fd2a27581724c7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/CpuOnlyModelSettings/CpuOnlyModelSettings.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/CpuOnlyModelSettings/CpuOnlyModelSettings.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0eccc20311e6d504224dd8fc4176076ff08de6405d84c64d551d0063d77cb27"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/CpuOnlyModelSettings/CpuOnlyModelSettings.tsx:9 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/CpuOnlyModelSettings/CpuOnlyModelSettings.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9202261aeed891196ef61cabecc20136c41a3e1f12cbc6b2f5d74b8f7aefed3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelImageUpload.tsx:5 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelImageUpload.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"a60c9319ca61e083d2376eb04cd7f5290ad3cbdc4b271cb94b198b068f3fe94b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/DefaultWeight.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/DefaultWeight.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c009c1d3f31d87ac0a3aca60d958253cd1c0e73d76e7b650ec3cb0bb171ca6e9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/DefaultWeightMax.tsx:2 imports invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/DefaultWeightMax.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0d0c5ab68efb7c0525e272bdc29d5487b3fd4a6eb80f9fa45561b87012cc174"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/DefaultWeightMin.tsx:2 imports invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/DefaultWeightMin.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"14531deeef55d792f5ff31540f81eca6e7054fe6fd6fee46d7b9899a116bea8b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/LoRAModelDefaultSettings.tsx:2 imports invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/LoRAModelDefaultSettings.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"eac1d827736f226b49db54b32aee06193425ad6e49ef34adb3011477c29a4096"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/LoRAModelDefaultSettings.tsx:9 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/LoRAModelDefaultSettings.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c086d368d073a8878a43eb63918d59166b5a854a14f8fccbe5a84b2286eb50c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgRescaleMultiplier.tsx:4 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCFGRescaleMultiplier.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgRescaleMultiplier.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"87937b7994685eb1b99559c1fa8d7a5361b21ce5d402eea58935eea2f4121836"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgScale.tsx:4 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamCFGScale.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgScale.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"06a2786fe81c2f1053bdd7573b5601d5f05c56021f50ae35b6012c2ffabff788"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultGuidance.tsx:4 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamGuidance.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultGuidance.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"78bae550d649f37060d0ba9f86d033f2572f961020b6133e59b4c41d4814c0ba"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultHeight.tsx:4 imports invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsHeight.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultHeight.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"936a132cfc8ab6bd5e7be18fa7524125492983f1b8a5998cb128b61ad0ff3e4a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultScheduler.tsx:5 imports invokeai/frontend/webv1/src/features/parameters/types/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultScheduler.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"c63736cff88ee46999fa3c06a18785367392b85884786d4ffa19556f3ba1f061"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultScheduler.tsx:6 imports invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultScheduler.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"edf16dceff4b3ba79e9b32a5dc0f0c2d67d72d147433681c9b71c16f38f1fc0a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultSteps.tsx:4 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamSteps.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultSteps.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"aab96d241cbb9702ae61a6141e54a537dbcea3dbea3d28628fa33669d9bcef26"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVae.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVae.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"40012b1eee7dc35ec6db9f477f231d439526d155cdf801a31a0bceb9ea6f5af0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVaePrecision.tsx:5 imports invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVaePrecision.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"7980be46d5f9f85530e7505a55774af1e43193adc58a64bacf8cae9b7b8d0eb3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultWidth.tsx:4 imports invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsWidth.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultWidth.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"97b30ae67e1b1bc47e3e7a457344f7136649056fe6ccc50708debc3d31b5943f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"3745fda8aa02b588049a7cdc9aa781c897302eb19be2a7e4e30c23d7d9904da2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx:9 imports invokeai/frontend/webv1/src/features/parameters/util/optimalDimension.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cc15e853f65133d35cf296b82b7de2cb1eee5e43ccd4224455d56d14b43b637"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx:10 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a8cdd644421cfc54fd9c9d80314b800ab3219c5b31610a71841c0864344b47b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Model.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Model.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"01f609592b2e745cf489539f035309cb21e7f7508757f86ed8595052c26d0399"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelConvertButton.tsx:11 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelConvertButton.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"a614e494afcec45704c60967a089813f0f595db3fd79143494a5331428c3002c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelDeleteButton.tsx:2 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelDeleteButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"123408269df62f4dfe94fa03021e5b209c6ee9f6bcb741485e3fdd6058e0adb0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelDeleteButton.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelDeleteButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"22a6c2b2bab77a0753402f9a6398836bbc85558ed30b5fb1daed0afc5d642f38"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelDeleteButton.tsx:5 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelDeleteButton.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"1500e9bb79532e5c43718118d284dc502e5a3861da59e82f88e8bf2045948da0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx:14 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"68a85eb88914d51f7ff47efefb2656646e6ecbc26d4ab1d207a8e201392860fd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx:17 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f0dbb880ac54956c9c2e1643e957387cace023281dba82f6fc3c098a88c9e16"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEditButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEditButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"00f306ae357e4e91802b7001883b4c41e093bbe34436bf16fb1136246e5cbb57"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelReidentifyButton.tsx:2 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelReidentifyButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaa17da11a925ef7323b7e11102bcb10f72d4febdd50990427209630b73bf85a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelSettingsExportButton.tsx:2 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelSettingsExportButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"76666565f774b2d6aa655d9539d5696bb62aaac6e414e67b18b39f764c5a56fe"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelSettingsImportButton.tsx:2 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelSettingsImportButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a52475411c90398c3e2b3dea32317312b60eae55dda033081635aca435e75bb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelUpdatePathButton.tsx:19 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelUpdatePathButton.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ad79b9c1c8e30484de13b524516b9707637818d0f3ed81c704a24f901e69ef6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx:17 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9d23fdd8572a6e65c0d1134b7668472de52d5d5ffb292911d3e74ee2c9400ac"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx:41 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e26ed50d3309587483eb7f5cd4af016ff59598ee416f8698ed1beeda43e2ddd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx:42 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"3846990b2c24e4c60e47b9112edd5750f089d863ac7c7d059a29b7ef0f39e464"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx:43 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe1228ca6dbf9bf21420a81d7ef11ee94b338446fe7b37493ad8feb507cae8b9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx:23 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f44b8ed63dee3ef5efba1a723c92815e131a5c822f71495e90c9b93af9c11d4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx:58 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"756151bec19e38abe9822e56bdb6eb6d29f117de1832eddc114e9ff41135dec6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/connectionLines/CustomConnectionLine.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/connectionLines/CustomConnectionLine.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"969f7031bdf0d2e136da572d61ea430ad8142d299789be278ed842b60092fbcf"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/edges/InvocationCollapsedEdge.tsx:5 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/edges/InvocationCollapsedEdge.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"04c611b56d84a7a20eaa8a5ecd4059f9023bda98cf7b3962f329125e78e4dc88"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/edges/InvocationDefaultEdge.tsx:6 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/edges/InvocationDefaultEdge.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"76a72ed960b5eb8c88b5a146a034f990a4fdc840c540d30fc1dc9d4c9f8c67e7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/CurrentImage/CurrentImageNode.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/CurrentImage/CurrentImageNode.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf7205187f4e5cfcc03f8d7e394b7900297cd11baf6ec233b67b892b9557057f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/CurrentImage/CurrentImageNode.tsx:6 imports invokeai/frontend/webv1/src/features/dnd/DndImage.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/CurrentImage/CurrentImageNode.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"f671d3eaade47dc7f0ab90ecc98626e6094c68a3415db0461eb93ad7e774f220"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/CurrentImage/CurrentImageNode.tsx:7 imports invokeai/frontend/webv1/src/features/gallery/components/NextPrevItemButtons.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/CurrentImage/CurrentImageNode.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"43100b39415021bef9fee4e426364f06413f59914af612b47f5d38163ba5cadc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/CurrentImage/CurrentImageNode.tsx:8 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/CurrentImage/CurrentImageNode.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4e6c720b308f85038a0facda68990da448eeae7a34cff7aa06f6febb507e3d3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/CurrentImage/CurrentImageNode.tsx:9 imports invokeai/frontend/webv1/src/features/gallery/store/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/CurrentImage/CurrentImageNode.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"b284c89cd349d42c793ca25d7b15fe4e2b62b399e214b825e2e499a7fda06aff"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/CallSavedWorkflowNode.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/CallSavedWorkflowNode.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdb93152323be2bf31d8f99315037cb97f71c72609da8e6b80f50858f95e60a4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeNotesTextarea.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeNotesTextarea.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"714a201c507324c51673e1a07f9c9dedc5e8f452cc6c8cc07cb5d08d38f7f500"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeWrapper.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeWrapper.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"358e0bdee3ef717d7458df921907937ec1e9c1eecac986f8eb55e09162f651bd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/SaveToGalleryCheckbox.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/SaveToGalleryCheckbox.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f0f126390cebcb8454b2fd383edce62e2533752461a2f5e8437ae4d6e249377"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/UseCacheCheckbox.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/UseCacheCheckbox.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3a3abb174098f3e13dda9a226a09d5862d708d850a3a0d5b702a047cdf5f7ab"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/UseCacheCheckbox.tsx:3 imports invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/UseCacheCheckbox.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"00317314f31be61c9541812be497da4b8e79c5b12d01a74141a0cad5da96310d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/useFloatField.ts:1 imports invokeai/frontend/webv1/src/app/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/useFloatField.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c5de1238494ed012d941ac327fc5dfb0638ce6cb7f7293866e92a4d0cd875bd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/useFloatField.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/useFloatField.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3c9a5cc2fc0cb078e2bd4386433e3d981934ebffd7ec1a237aa903514fcdb88"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldDescriptionPopover.tsx:11 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldDescriptionPopover.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"978e84830a25f585c90ebd516de6679e6ee8141befab977f3a074e159b716607"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldTitle.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldTitle.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f9bd9ec6624d8a935e4a0e701de18a758b746c85abf16bd9d75d11fc71cd139"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/VideoFrameIndexFieldInput.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/VideoFrameIndexFieldInput.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3303f6398419a232cb8af5390c25454085b64209755d7bf70c648e92366aaa2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/VideoFrameIndexFieldInput.tsx:5 imports invokeai/frontend/webv1/src/features/auth/store/mediaCookieRefresh.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/VideoFrameIndexFieldInput.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"db5c20ced3145010d96167211aaf6c357e761c0de4c73c0f2a2c984e0226fe65"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/useIntegerField.ts:1 imports invokeai/frontend/webv1/src/app/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/useIntegerField.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddb414a53f9eec1fbd06473169546019e360bafe42b11b425de29dc4e493a151"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/useIntegerField.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/useIntegerField.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"09aeb05f935d54f3fda38e9aa83c074190b92e25cfde45a75077ec04351b3a66"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/StringField/useStringField.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/StringField/useStringField.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cebae60b1e8ec6b080be1d8ba7a1e8d9d63356486123ad4717466a67f38acec"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/BoardFieldInputComponent.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/BoardFieldInputComponent.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"51768c02d68f5051334a05032c1f7dc0861d3ec0d5a6e868100fc465eeb631bb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/BooleanFieldInputComponent.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/BooleanFieldInputComponent.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"54ca7319a4855f481d99150a0f62aa883a1e7a424c20236b49915d7d73b6b586"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ColorFieldInputComponent.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ColorFieldInputComponent.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"05a29bf2304701c6d3bf082d36bd52ec78cb4179d2f9e5b7ed5a433289544cbc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/EnumFieldInputComponent.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/EnumFieldInputComponent.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6774f1e35031db08968e7f0d163027089250f8c2afeac083edd12f3b57c1f42"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatFieldCollectionInputComponent.tsx:12 imports invokeai/frontend/webv1/src/app/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatFieldCollectionInputComponent.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"627e6bdf030103260ec60f54fd52bb0d2d1e433c7475803f20ab54138881d256"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatFieldCollectionInputComponent.tsx:13 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatFieldCollectionInputComponent.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"595cd969b1c8f3697ddb2c80dd8969081290c06e2c4c79d4749574c827e73b35"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorFieldComponent.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorFieldComponent.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d6d07cab22336d5ee054ed5d79e54a6893833601dd4bd255c82e20e546f3c9b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/GeneratorTextareaWithFileUpload.tsx:4 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/GeneratorTextareaWithFileUpload.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"68f1b29e7dedb40f3fc4dd2fb288dc6f1c9ca6dd063b1e0e753a7ba8705c78ea"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b09c04b96560df2ece0ab4dddb425dd5ad273424eb9a63e1a1cab6249f82c568"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx:7 imports invokeai/frontend/webv1/src/features/controlLayers/konva/patterns/transparency-checkerboard-pattern.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca6be69f2cb6b5fda35031745d3496be3ce000494ef2e09d8e3bae81d8042546"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx:9 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"98c72c9861033dedaa344cc630022d9690514d6da6208e053be297bbec2cea08"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx:10 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"b27c78dcc4b205192fb57d1a019843116da9b553a14ed34eb1cd5e477844931d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx:11 imports invokeai/frontend/webv1/src/features/dnd/DndImage.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7937dc90a32d1bcfcc7be1f95dd0d5b0eec259012dd91d7fdaafd4fda4148f3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx:12 imports invokeai/frontend/webv1/src/features/dnd/DndImageIcon.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac0f61f37924844cca4f19c909b67a09b4985ac71aaa2c9bbf1154aa3385da06"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"586a1f45a21a258135dab22207ca56b9b5b4a25d1eb3b4f990058ab7819441e0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx:7 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fe9872a1a89acba58a42c8d184e7709793b243f9371415346ce0152a4bfe4a1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx:8 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ec7f69b3115fff83d63bcb8914ed339853a322667b43c25af304eeea91cb2e3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx:9 imports invokeai/frontend/webv1/src/features/dnd/DndImage.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"c04bf4d9275547568effe2c6fb58150b3b9dbe32d4e66f397e363a97a2754dd5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorFieldComponent.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorFieldComponent.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5e423192d955cf97c4fd545aef69d1d056c34096924fd2738fda7f16d3ab1c3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorImagesFromBoardSettings.tsx:3 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorImagesFromBoardSettings.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a4798359d328ce860caa4d4f7ed1a21fcea752c13d2d1d8347841ecc6aedac3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerFieldCollectionInputComponent.tsx:12 imports invokeai/frontend/webv1/src/app/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerFieldCollectionInputComponent.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff6ca90b5e49090ef10f94a4e2b8c987b8479d122b55ff3d6dc3a93c5893d423"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerFieldCollectionInputComponent.tsx:13 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerFieldCollectionInputComponent.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e4df7693f6c52c735be8efbaf651717df959f1c2e4c7b84bb04a7ed76ca372a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorFieldComponent.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorFieldComponent.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d013e0f6f88d67f131aaf1397dbdaa16f76ca23d0a7e4418f9be54f08d6e2d73"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LoRAFieldCollectionInputComponent.tsx:3 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LoRAFieldCollectionInputComponent.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"71b0b78ac44ae15dcf9b8c3b68525d61bf7dbdff867f4813b32770ae687f01e6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LoRAFieldCollectionInputComponent.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LoRAFieldCollectionInputComponent.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"97611fd333647ae990ebf0db5a87902d5e5a2eaa183625ed778896968fd3dd2b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LoRAFieldCollectionInputComponent.tsx:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LoRAFieldCollectionInputComponent.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b700e2614f7ad9327b8d4afc8e17dc7c90f38f8c7d3e695583603072a425499"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LoRAFieldCollectionInputComponent.tsx:16 imports invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LoRAFieldCollectionInputComponent.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"713c4ac237508c8f8190c08fc253452dc6356927be3a0cc33bb0badb6c5439ac"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelIdentifierFieldInputComponent.tsx:1 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelIdentifierFieldInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"199ffe53af23a43a7c1ee54d3a6a2c08729dbe33b8a91806cc39a7b3865c0b79"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelIdentifierFieldInputComponent.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelIdentifierFieldInputComponent.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"926b7832941bf549aa02ba36214d6c0ff44d4cd27657757b520cd401f0d3f52e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SavedWorkflowFieldInputComponent.tsx:3 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SavedWorkflowFieldInputComponent.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b073f586dfb001193ed2411a4f84ba27df26f41d1472f25fdcc0399a5d630a8d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SavedWorkflowFieldInputComponent.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SavedWorkflowFieldInputComponent.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"6750b9cced602ab1e816145f3c98f6eb4c89de2e8ee6ebaac0c615af4561cb9f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SchedulerFieldInputComponent.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SchedulerFieldInputComponent.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ad5735d7e517ecb56c5c38beec6f34a649683703700d8e474cbad5585776953"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SchedulerFieldInputComponent.tsx:7 imports invokeai/frontend/webv1/src/features/parameters/types/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SchedulerFieldInputComponent.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"59434f0ed744330e7812df58b6f4cc550f35859f5fbfaaf97f9462fb227c36ec"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SchedulerFieldInputComponent.tsx:8 imports invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SchedulerFieldInputComponent.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"26a577fe9e69ab1ffefa0206939260120ed5a7e6b8790d4a1e5af0fd9e3bf66d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringFieldCollectionInputComponent.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringFieldCollectionInputComponent.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"d346271ac687699977d428ead1ff63404db355ac57c75b50de6ca02345bd4cd0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringGeneratorFieldComponent.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringGeneratorFieldComponent.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e3787f98d4857d45c914fe95c32f2cdfb5e160a6233267810cc1d1f9b3dddc0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StylePresetFieldInputComponent.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StylePresetFieldInputComponent.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"82f446b4f4e8be3188203c68ad2e9017ae752cd2b1289819c18e0946276fd387"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SystemPromptFieldInputComponent.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SystemPromptFieldInputComponent.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"f96378fe73d5b35bc673312a50ae388ca0bf597c24087cf79fea52f2b867dd6c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/VideoFieldInputComponent.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/VideoFieldInputComponent.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"78cab39e5728257f9020591cd75b6bd48682fc36e40a0023714970934200432c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/VideoFieldInputComponent.tsx:5 imports invokeai/frontend/webv1/src/features/auth/store/mediaCookieRefresh.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/VideoFieldInputComponent.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ec8c8c91b74a17f4116415351ec4da643f0302571d50b0ace8b90bb46c2f9ec"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/VideoFieldInputComponent.tsx:7 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/VideoFieldInputComponent.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"c44b86281464a871c39ae1797cecefc8433b1e905cff544651dff51a552f6b6a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/VideoFieldInputComponent.tsx:8 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/VideoFieldInputComponent.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"77b807d44840c7c188bb2592857a42e822e0e6faaddfac50b7dbf3441fcf549e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/savedWorkflowFieldUtils.ts:2 imports invokeai/frontend/webv1/src/features/workflowLibrary/util/workflowCallCompatibility.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/savedWorkflowFieldUtils.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"04bf2088e9a5d28f3f32cbacd383f79d40328a79d0553a7b17e4eb5701272143"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Notes/NotesNode.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Notes/NotesNode.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"bceeb2fb28201f290ad42a719ae318e388417f3c351ce08fba9cabc81ce1f41f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/InvocationNodeTitle.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/InvocationNodeTitle.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9ed7baf6f152117ac10e1320300a05a94adade1a1755ff5507e43219d6b405a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/NodeCollapseButton.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/NodeCollapseButton.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"e16e4f4a20e6ae723d849e6f451cd99cead1b7bdc14b4b562b41e9556e713cc3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/NodeWrapper.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/NodeWrapper.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fe7a26042ce5276bf68e09d339ee8ccfc87e0646f5b478900da44585d09f5a6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/NonInvocationNodeTitle.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/NonInvocationNodeTitle.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"abc6165268943adf3b2051b62a1444b16d09fc5df60b757aabc0a6dc33be991b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/NonInvocationNodeWrapper.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/NonInvocationNodeWrapper.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e3218d22b2e65f5c7419b2fc564456b5333367a3618fea28e29e0bd1388b2ef"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/AutoLayoutPopover.tsx:20 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/AutoLayoutPopover.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b696e2c32a966834bdf1f7b452654b904ee544bb954b63781005c84712e171d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/NodeOpacitySlider.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/NodeOpacitySlider.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"44940ba150b1710541ff97c2112e2cf11be78510ab8300a4bda293b0559394e5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/ViewportControls.tsx:3 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/ViewportControls.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"966287265418dc943eb713ced7a4407ffc53e35b4810117498d8c26852245b18"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/ViewportControls.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/ViewportControls.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"e99ce3418a78b03bb50ec010814e028eeb145446dfe109e5afd0b8a4f5fb9142"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/ViewportControls.tsx:11 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/ViewportControls.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"91178b58de56a9d4c4b8f1a457ab7b68540639be0344dce1a704e9cefeeebc35"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/panels/MinimapPanel/MinimapPanel.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/MinimapPanel/MinimapPanel.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"52f7130bb0c5a046857fa4ce62232b18be4c146509ef45a1b33f52df3b7f20ff"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/ClearFlowButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/ClearFlowButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f15e3b43dbd6458a22cdcd4cbebe04ebeff9b666dfaf6aadef3592faeb63cc2a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/ClearFlowButton.tsx:5 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/ClearFlowButton.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8d862648820a8bf862c3a5a3e30e2c6caef4542fb91351c29ee32a17be13f1b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/SaveWorkflowButton.tsx:3 imports invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useIsCurrentWorkflowOwner.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/SaveWorkflowButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ac3c534f3cf27e8d0fa22120080c5d9cc512734cec27f5b4a1e1fdbc5ed92b4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/SaveWorkflowButton.tsx:4 imports invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useSaveOrSaveAsWorkflow.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/SaveWorkflowButton.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"85d0166185d9fcdcf6ecc053e9d4ce89095194b663edb740bb9ce78d5f57340f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/TopCenterPanel.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/TopCenterPanel.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c91fd0079aa73eca6e67cd8b199ef4effaab360ddea8f6cc49da71ee57481c2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/UpdateNodesButton.tsx:2 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/UpdateNodesButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"35baa164fe3a930e6f0b97c81d85133e9fb5caf72331765ea3d7e01fa81a6f34"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/UpdateNodesButton.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/UpdateNodesButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"81c198e04de14348ef4ec64f530360227526a2a100c15ab46ad51724281f0cf7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/UpdateNodesButton.tsx:9 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/UpdateNodesButton.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd33f42b3ea3d31d75ce366dd785f87e677d0b4556951bc65491dee816a52f44"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopRightPanel/WorkflowEditorSettings.tsx:19 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopRightPanel/WorkflowEditorSettings.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c0d2c9acda0a80e215fd52e3a6303d33a6a0012c28602112f515a4f8fe83877"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/EditModeLeftPanelContent.tsx:2 imports invokeai/frontend/webv1/src/features/ui/components/tabs/ResizeHandle.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/EditModeLeftPanelContent.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bb2b036a5b5546ce56ad1d4aa9fe5689bff2e6fd964e98115555d78ed74ff1b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/ActiveWorkflowDescription.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/ActiveWorkflowDescription.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"fec4564e0edf9fbecb55429919b7c306d3ef1aa87136a052bb5ee3535c05a566"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/ActiveWorkflowNameAndActions.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/ActiveWorkflowNameAndActions.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"59bd23efcb98709c6a4ab8a687564f2259fffae0cc47c0ec8400eb6dd736924e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/ActiveWorkflowNameAndActions.tsx:6 imports invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/WorkflowLibraryMenu.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/ActiveWorkflowNameAndActions.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"9923c69fd35f48cc1b5d0594836f67d631f48a0d0b9df5bf089f1522446223f3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/SaveWorkflowButton.tsx:3 imports invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useIsCurrentWorkflowOwner.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/SaveWorkflowButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"112acaaf964e0c1d2a8a63ac54b52e31ae2b9828e7e0514835660a2a04369b9f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/SaveWorkflowButton.tsx:4 imports invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useSaveOrSaveAsWorkflow.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/SaveWorkflowButton.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"98931c0bd359f91f89202379f89908fad7f549e5572c3ae51706c7f5fcb12cd4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/WorkflowListMenuTrigger.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/WorkflowListMenuTrigger.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f33bf0266e3483bd0e94254f4aa1263ac96f69524c3ccd4cff9d1c20ce4a5e5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowName.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowName.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"92b01ab79fb7ffce3ea47ad9c6d1388ad9bf1cec215012376fb3d913c457ca06"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowViewEditToggleButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowViewEditToggleButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d356787399c3a00d2c1d85b2691f272bba0e7f89f621b69570ec105acec1942"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowViewEditToggleButton.tsx:4 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowViewEditToggleButton.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8fed3babf7211c6f803e4967fdae6d8de1c4266313b2a4de79d9dc78d108b8a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowViewEditToggleButton.tsx:5 imports invokeai/frontend/webv1/src/features/ui/layouts/shared.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowViewEditToggleButton.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd5e54ee5e0f14b3a6202d86f3b81b1c92016309dc9346466779c324200f915b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowsTabLeftPanel.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowsTabLeftPanel.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8ced7a0f7e1cf3d607bd969ff38962d2271cf760375fe467b975932f3726b73"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowsTabLeftPanel.tsx:7 imports invokeai/frontend/webv1/src/features/queue/components/QueueControls.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowsTabLeftPanel.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4a9f629be67e1e6f33a32a6775e0511c43530d0a2121b04ef7f5e0df5b76d1c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElement.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElement.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"2405630eff9f31b32dcf95f39f6882d9cb9f56bd78dac6929247085af39e8cf1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElementSettings.tsx:14 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElementSettings.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"dac72ab4a2ab508a64a2363f66d77d19c633e21f7dfbe668836e91189a9e68ea"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/DividerElement.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/DividerElement.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec8d1a7636fe2b2cfa0ba0341514599d4b8959307dd3bb2539f4e69c3ec09ce6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/FormElementEditModeHeader.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/FormElementEditModeHeader.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"d29270e498e9b6c66da2c9a387d9783aa26e020582913c48c6b05017ccfde69e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElement.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElement.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"745e00ebcc061278b473595df2d9faed1301e28308cc01b09be45b2c1ffa20ca"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElementContentEditable.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElementContentEditable.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f012654f9fb48d92d1579142abe75a29b4d637d7e28702542c2bb514bbace2d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElement.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElement.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b4d2e1f505ee84cb57ab476e1559c3e1c18813735d014cf253085006f01273f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementDescriptionEditable.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementDescriptionEditable.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"de666b0697f0b8654534676a35e26d8c1ccb68be2aa5299c44dd87218dd4bd81"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementFloatSettings.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementFloatSettings.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bca1960d8a6df9e0970ff6d8d838c2e96e730c8351d7f050d4f268fbd324d20"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementIntegerSettings.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementIntegerSettings.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"505d378b46ba1b7d1511448e0a49d43a01b035db7476387f459ab20f0ebdb37a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementLabelEditable.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementLabelEditable.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"04aab35965035fae377ef2ddfe2d8e133420a9286fb78437c2481e0f51006636"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementSettings.tsx:14 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementSettings.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1d5c1ffd4129d6552b1b5e682e5c61cb1ee50bc8356b108b7b7fe453c781c76"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementStringDropdownSettings.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementStringDropdownSettings.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4aa3c8ebc59e5601bf8eddd2a95c71f39c1f17b8253e22d242945c8876d4336"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementStringSettings.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementStringSettings.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d47f29ae0ca6e85824996bfe8da5367d1a3c0176d899b8236810561ea436d3f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/TextElement.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/TextElement.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a410e16e760b6fc8b60b18a746ecdb39e3871ab68329aec6043f457320de97c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/TextElementContentEditable.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/TextElementContentEditable.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0b4873f2d07c847c0692e063945e89f6c109f267ab884f44b001ea3a487e2ce"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/WorkflowBuilder.tsx:6 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/WorkflowBuilder.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cf5efd093782940a5db2dd44efcb725b06bbe667fe91608f14f60ca29ca7e58"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/WorkflowBuilder.tsx:9 imports invokeai/frontend/webv1/src/features/dnd/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/WorkflowBuilder.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"c39d6789c8d4b4dd7ee8f8f3bdd7f064b4f251b757440e799047dc3380be8856"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/WorkflowBuilderMenu.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/WorkflowBuilderMenu.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"28babf3698a1f48f9d105945c11207dfd9f7ae864e7460ab750b3644d88ef873"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts:11 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b2760df1819166a89f15b9244717a0a66c4f7736e20b88c1bd43c0435f74276"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts:12 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab214b72806c198659653cf76d8a0fc6f2625286e72adeeff3f79ddf5b155726"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts:16 imports invokeai/frontend/webv1/src/features/dnd/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f8b8e429b8a9b337dfa2a48e9e011fa425a5ab219d55ba11b5366aea68d061f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/use-add-remove-form-element.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/use-add-remove-form-element.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc16438c0fe215257bda56fc722527c74032eaaf455aab12ecf7f8f1187ad48b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/use-element.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/use-element.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"283cfb52997b3bf37bbc525c21bee68c0374276c9fe8398470fd53e417105821"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/use-reset-all-node-fields.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/use-reset-all-node-fields.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbf687d0ffff11baa0544830d24721239dd593e88da84251607d937d9c61b159"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/ImageOutputPreview.tsx:1 imports invokeai/frontend/webv1/src/features/dnd/DndImage.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/ImageOutputPreview.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9205914855c3065efca7451477134aa09992a5e7ca1640fcf499bb9be4345ce"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorDataTab.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorDataTab.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5c3154e4933844dc0ba203300155de1673e56fcfeb0f904465e14ce0be469ed"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorDataTab.tsx:4 imports invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/DataViewer.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorDataTab.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"da14a643400a7eed552d04889c2a02f53f9789a556eb5d2869e47ea4f828a01d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorDetailsTab.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorDetailsTab.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e776e0e605ed933d74c45c6a4d9c5cde48eca2cd466f198145ca9db51db4728"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorOutputsTab.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorOutputsTab.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"4634783ebbe6e81cc2e8574a748cf4d0b75dc8730fb33cfebfa2c4f7729ed2f5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorOutputsTab.tsx:5 imports invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/DataViewer.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorOutputsTab.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"db1a523f4e864f7d923552b8b691aa6d21c679965802a16e07a26f0c697cd770"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorTabEditableNodeTitle.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorTabEditableNodeTitle.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"4942aa070a305cad1a6c39687499be6d9ad2f6ddd1548ddf18a0238bd6c991a2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorTemplateTab.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorTemplateTab.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1fb4cecf4deaa25839f213718a896f753d3fc1f1ce063f6e6df9e462b9234ba"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorTemplateTab.tsx:3 imports invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/DataViewer.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorTemplateTab.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"2690551b52b854c11556bbbc4a268f65daff36541ad88d06ab90aa76332f0a69"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/EmptyState.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/EmptyState.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a42152e4efe653b64fc33440e7f6a89556269d47355e2cb5543ea38f5abff34"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/EmptyState.tsx:6 imports invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadButton.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/EmptyState.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"85bfc34e962e4a03c2737397d6be7b7b0ce2d8cb4f1a6d5db198d8067a4e2518"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/ViewModeLeftPanelContent.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/ViewModeLeftPanelContent.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"271e08d30f7d06b635de11e2753d657c1ea4216162f4d8942dd457e47062c009"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/WorkflowInfoTooltipContent.tsx:2 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/WorkflowInfoTooltipContent.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"57eddb57502990acc20d0c8dfbeecaf55dc19232fc0635cfd9ba202aed5471b2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/WorkflowInfoTooltipContent.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/WorkflowInfoTooltipContent.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"e73fa6b58e47eec22e17c0bb8370c32d2a219c21cf0d642271b59ecaeb883567"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/IsolatedWorkflowBuilderWatcher.tsx:3 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/IsolatedWorkflowBuilderWatcher.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3525417962a3919df93cc6a570b1f1d1d9050c2a92aa76033a3de81aa0dff78"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/IsolatedWorkflowBuilderWatcher.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/IsolatedWorkflowBuilderWatcher.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"80a7a4679a1908497a734feedd21b791c6f5711afcb4ba41554144bb64a8e95d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowGeneralTab.tsx:14 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowGeneralTab.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ce6311f226c33ad72278df2110491e001e2ad3960288ae2b6dff6c9e0a1ba91"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowGeneralTab.tsx:16 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowGeneralTab.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"c681d2d946ed2c85cf672889d0eba63635fd66aa825d042aa6b9316cabfcf4c1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowJSONTab.tsx:3 imports invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/DataViewer.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowJSONTab.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"90391f563c2455ec751cea9dd8af3fddc65adf33ec96312687325caf32569079"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/DeleteWorkflow.tsx:2 imports invokeai/frontend/webv1/src/features/workflowLibrary/components/DeleteLibraryWorkflowConfirmationAlertDialog.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/DeleteWorkflow.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b93f11fd387c75b3e8ccf91e2680497a138dae5d009695a73c84f478ec01e67"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/DownloadWorkflow.tsx:2 imports invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useDownloadWorkflowById.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/DownloadWorkflow.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"05e73c86ae3956fcfaf686ae713a9b82e5003674ba904bdab30641b225d541b1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/EditWorkflow.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/EditWorkflow.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"2811bb567a4a89609204321839be199371cfcc9c8a6b9cb3194d00b370c6c9f5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/EditWorkflow.tsx:4 imports invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowConfirmationAlertDialog.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/EditWorkflow.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"969578de3367112d3f4b3c51573455174ee844a253c5635578ee6a25323e44d0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/ViewWorkflow.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/ViewWorkflow.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cbc2ce7427847ae4e1486e8fca46f62427843563ae599f474dd04bfacd4b6c5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/ViewWorkflow.tsx:4 imports invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowConfirmationAlertDialog.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/ViewWorkflow.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"29251322587bb9af169d740fec5a0dbf84d86d395cf99afc08fbef19f6049d4c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryModal.tsx:11 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryModal.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5f3d4fd92bfc7b7887126996292f7bb138b0d95f10a699a4772111763b8d124"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibrarySideNav.tsx:15 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibrarySideNav.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b1462c252cda8febf6a6fc5b69a5edf2eb7e7f696de0572e65a5e62736d0f5e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibrarySideNav.tsx:27 imports invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowButton.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibrarySideNav.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb62376b4648b39dadc8187856cc17d8208b0011c068b2c7a8eddbe1653f34fb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibrarySideNav.tsx:28 imports invokeai/frontend/webv1/src/features/workflowLibrary/components/UploadWorkflowButton.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibrarySideNav.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb6bfd4faaf66d9343eea7ae45e8fff5a04822869a69c97e9506601c787b1c76"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryTopNav.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryTopNav.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"00caae05f753443407cbf24ef4efd41cb37f54e1b2a3ec2ca454d9f52c723652"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowList.tsx:2 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowList.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"73ad69cb125a14f068435cda90218551e29101ef8d33c5d18fdbba5a067fe394"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowList.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowList.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"92d77177577d0c2518f344dd1537df3471b031a65328218da5b411d5d287c9b0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowListItem.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowListItem.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b930cf792e1927b18b81d87e1288b860b0ff68b8e45f3848927a31092a2af3c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowListItem.tsx:4 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowListItem.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"79d2f34fe6e921d417e9e4033e1afe113a25cdc8ae4364e406bf9859fdeb45e7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowListItem.tsx:7 imports invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowConfirmationAlertDialog.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowListItem.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"73f8e071ce19b0716dceadf549c5a1b67adfcfad56c80d422248cfcd1d61bc8c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowListItem.tsx:8 imports invokeai/frontend/webv1/src/features/workflowLibrary/util/workflowLibraryListItemState.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowListItem.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"53fb5dea2682e00b227745fce9ef911de273944d31cfbc2662ef43978680f4bb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowSearch.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowSearch.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d88afb16594e3c6ff0643584f636507aecb4b78f76d783aab16e412456edcae"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowSortControl.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowSortControl.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"9de6b0644675054ce5975f2b68230da5eefd771a63f6ea7707dcf34554e0de19"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowThumbnail/WorkflowThumbnailEditor.tsx:3 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowThumbnail/WorkflowThumbnailEditor.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"fec718341028f21cfd83c9a5dbf32e1784b0f977426fce0d5e4cd0d264c40a9e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useAutoLayout.ts:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useAutoLayout.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b170e7f376fe21e30c78d7027c852c529a009fa3c28e6279cb50839e90820082"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useBatchGroupId.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useBatchGroupId.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a7f4fb97d7c9aa64c893127b27f6a727181403b5386a2802c65a2d965c43512"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useConnection.ts:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useConnection.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"be8f984d8146a1f0c925e5e4ba76be0cb61039ac63af6d74d782606a60dd0e35"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useFieldConnectionState.ts:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useFieldConnectionState.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e032f1b128922b317b176b04a42dd02538c7e9e5233d37fe6b86860b5c17d17"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useGetNodesNeedUpdate.ts:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useGetNodesNeedUpdate.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a409f5874802993991090e69255d2b01d54293679ff2fc225dc17b8b220a844"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldDefaultValue.ts:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldDefaultValue.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b73201e4a2ce9d170b7373023832b616ffeea62eabe78b01ee0e8693152f299c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldErrors.ts:2 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldErrors.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f46271b1d4240bad5fa5274cc9fea922b5b1ed47217e033cbdd2120cd4e001e0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldInitialFormValue.ts:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldInitialFormValue.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"d503d7633748e42cd593c7e4f89a1a0befc1357b6562665df71b4abf5404c440"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldInstance.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldInstance.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dada8eb89a08cedd43db3371b5d6250747a258cc532a95a505f89cad50c8f77"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldInstanceExists.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldInstanceExists.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a6743bd917b5dd337d0c90dbd21e5670d382755e03169506fde8f88a69b35fd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldIsAddedToForm.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldIsAddedToForm.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"325fc968eb5c40b5c26fca5a8be65381e95abbf6f702fd5dbb7484864657774d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldIsConnected.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldIsConnected.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"76455eb2a2cfd155936bfcc2d73b4c6c3766d7235b213274110367ed2df8b8f2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldNameSafe.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldNameSafe.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f0358686e81f66fc08ec2ed2f194a194f9ccee1ee06a13db1390898a654f6f9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldNamesByStatus.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldNamesByStatus.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed5947c2da4bc518e57db786f4cdacda71a45e308dfe23a7dcec769c8ca02e2c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldTemplateExists.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldTemplateExists.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a194e618d683d202a161ab99132db419a09049922339a6b361900152fe52fa0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldTemplateOrThrow.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldTemplateOrThrow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2f8bc5dd2be64aeb18b02aa39dffcb7c515c4b0f61c9fa080b4f2e9d5d3e779"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldTemplateSafe.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldTemplateSafe.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4f2afbc4ef6121dc211cb0b55e6c150841a1cd109a0a5b42f7df6b6c0395225"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldTemplateTitleOrThrow.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldTemplateTitleOrThrow.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"de4aedaf4d1d7cb65dcf233f521b82f78682044989115512d05891e5af5e6c3a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldUserDescriptionSafe.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldUserDescriptionSafe.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"898037a0f87ced497693e1c2739a7c00203ae22d090330c5c521bedb34273bfe"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldUserTitleSafe.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldUserTitleSafe.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6550a6dd6fdd76c6c5778ea08cae21728463fb947a4faf7ccff32fa0d24e23c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useIsValidConnection.ts:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useIsValidConnection.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"887fe98ed73816db274ad68d201693f8d2484052da2d18161bb078d78d70bf3e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useNodeCopyPaste.ts:3 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeCopyPaste.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"80797ccc52f4eebd0e78be0a1715a76a1f53a6c3d2ec67f0d233c6a5d3161e7a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useNodeCopyPaste.ts:4 imports invokeai/frontend/webv1/src/app/store/nanostores/store.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeCopyPaste.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a8d7e0122d94ba7fa96e44384bf7f1e35ba27d36c1d6c9142832996ba37b080"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useNodeExecutionState.ts:2 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeExecutionState.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"c24a227f0192018aee27e2a36f99edfb0d99ad3fe77dd5582af94dcb515bfda9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useNodeExecutionState.ts:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeExecutionState.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"68794f9005e1640b2914b0a085d4991dac985b19f13bc0e16ec49910744e46a0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useNodeIsIntermediate.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeIsIntermediate.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc30599097e045fc3fe8aa15298e5f37fefeef196fae5cc8b3e9dc70e7c8b53c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useNodeNotes.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeNotes.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e86f6d3eee74abf9c48c2ed506a1521c061a984aa8494cf164fffe1cee5d00b6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useNodePack.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodePack.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"26ed631487be835ff1cafadc27e4959d3893de94ba13426135060ca273e5f2c7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useNodeTemplateOrThrow.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeTemplateOrThrow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9030abc8a3bc267956d5af184db78a95643224d694105895af7072e0c23c8c2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useNodeTemplateSafe.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeTemplateSafe.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"636eadb0b34a32b49f8160452d0ae401a46849c6c07a41483b0ee1d33dbced78"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useNodeTemplateTitleSafe.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeTemplateTitleSafe.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7a586e3bb8e2ecfb8f1ccbd4bae37773b9e9dc34c23f628402b3f4a4a06ab70"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useNodeType.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeType.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"93d9b9394a3fd35a8f743fcae04a239dd206de7aef62ebe6913a2007ba54f6b0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useNodeUserTitleSafe.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeUserTitleSafe.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f08d4dbdf3e6c48f19cea400d11111dbf27bfed5d2d53f848e8310d39b77eca7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useNodeVersion.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeVersion.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb5a8a3a0729dc4fa8ab6e031a1dd3673400f2f17b8ba15d91f8ead22549e6b8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useOutputFieldName.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useOutputFieldName.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea1da8f24443d79dca59a4414fe0bf49caf27b4774c77a2b7e2fca9b547149dd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useOutputFieldNames.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useOutputFieldNames.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c0dd651dcd416313083b283f4e9d402c51d8fb9257a3f6148aa381aa8a64d48"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useOutputFieldTemplate.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useOutputFieldTemplate.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b57c6264e17cfdeee60d4d86417d77c81421de9de24dd0e26c01893b5408311"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useOutputFieldTemplateExists.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useOutputFieldTemplateExists.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"22d2296266874682712e51d6f03ec0dc695f22b5c71378e8cdc8d1cdd13a5e72"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useUseCache.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useUseCache.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8bce9294858873761ceac87a9f86d2f7f3cc775a124eadef735433d1b0ce5f3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/hooks/useZoomToNode.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useZoomToNode.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8002b1a69574190d61a99e835e904b8ee38b50b584d36a2fde02929a71504a2d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts:17 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b70d3fd995667876f81ffb8bf6f7e12eabe7fd99531923abf235a1da5c62d30"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts:2 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ab5567008a757e30b1f3807d5eb3067cf8c812dcfaba85d3bda767ee864f988"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"1da2b729515371ee9ab484b5007faf9e28a00204781b7b2d967f0ec5399c91cb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/types/field.ts:1 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bf1a47ea2aac0bbef52bf977e1f5b6e49f5872fabf1dc535bf49c6190d56210"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/types/field.ts:4 imports invokeai/frontend/webv1/src/features/gallery/store/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"e39ed9ff0c34b1315c6d3f8d186fac77fe9c8059a2a7eccf0ae9d9f23cd9f004"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/types/workflow.ts:1 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/workflow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b241a4461fb0b19af849e4f14299efb4cf626f1e4674cf02f2b2e2d1c8f84ef"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/buildAdHocPostProcessingGraph.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildAdHocPostProcessingGraph.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9bdfe2229cbed83ebbce80f5088ddee8d2188d8bea1d3ccc8cb79b81f882b86"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/buildAdHocPostProcessingGraph.ts:3 imports invokeai/frontend/webv1/src/features/metadata/util/modelFetchingHelpers.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildAdHocPostProcessingGraph.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cada99e29dba6338555147e3c80e01a491e719fa22fa5d82d6788b59092115e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4881756acc081c69ddcb689c33017b34104d5adf0aaadf25a8e3335fe520c1c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts:3 imports invokeai/frontend/webv1/src/features/metadata/util/modelFetchingHelpers.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"71889bfba3b9d5da7c616314d010249eac4246c1d65283963e44e1f180707a9c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/graph/buildNodesGraph.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildNodesGraph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"49c93ec4f43f40b89a5fe8bea249a08bcdf15bae0a162f46f17ec96c6eec2201"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/buildNodesGraph.ts:4 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/buildNodesGraph.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3a07c584f9582a6bedc9acba230d756bdb722fb958cc92cfb22627fb651bb38"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/filters/buildPBRFilterGraph.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/filters/buildPBRFilterGraph.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c127cad3417ac2dc7b4f5d629ea43dc31e3a5e729dc3f62600fd33ed90fcd46"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f3f862a2b67118a0c1b8ed40a5be40a72e9c9ae3112c35d5636e3bed9751143"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addAnimaLoRAs.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addAnimaLoRAs.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"073f0a6b3c2c7159814895d60453b271f2992250955aae0a95eb9f58c2ef6223"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a65694feee2b088a8a63ea8beb31a0d229e6b0b50dfd7fc0df013353fb6f7674"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addControlAdapters.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"88ec52a40501010553b6ee4d162ae42605a10db29d70f2ff7b17220c82be6c80"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"07ed3690824be57430559a80e6c60f96b3b1925607391c9f9dbd24e59ee48916"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSettingsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"28ac5a099cc0f326c4ba25bc519fbcce5735b2f13b0e3191c5ca0afe2e0fcb7f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXFill.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c18f5729045a425ac3ed96dcd3a3c3d3f87cc5068593a9c22ecb5d517e99675"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXLoRAs.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXLoRAs.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"4eb69125313cc9e73bec12c2b2827ef727797889d34fef85d06bbd70d34b2e07"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXRedux.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/store/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXRedux.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d957ad51ea91c0202b5085c7990e171f061b3121c811770175577be459c7cb50"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXRedux.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFLUXRedux.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"77e92332c2b045596aef59d67a97b27d71c42b88dc8a2d48252516731940fb0a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFlux2DevLoRAs.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFlux2DevLoRAs.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"809f05c762afabcb082768b480ae69b9de5384b7d34cb2c24408e5bded060865"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFlux2KleinLoRAs.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addFlux2KleinLoRAs.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"9817119b6434e1c256d7eb8b58494b8210cc7079ec03b336ceec5d1f3c4f3fb4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addIPAdapters.ts:1 imports invokeai/frontend/webv1/src/features/controlLayers/store/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addIPAdapters.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"33d30036ace92d7edfd04a798cc30fe2388b57075eb02a28b5582ba2f433f421"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addIPAdapters.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addIPAdapters.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"44bf38d533298e712a9fc1f5f660995f13a52c5c7ead7352a0aaaf0849b27791"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addImageToImage.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addImageToImage.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4f806af30004c1c962089190eb2ab1680561fd7c587ac27d06a598945dc548e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"afc586d2d0f8efb5632396772dd87516135b4b790b88e39fa7d50e0771605be3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSettingsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"cda2fbd72bbd393ef81b4cae4d0cf1d01dd48c4418bfb36c4b07ce5141f5d705"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addInpaint.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"2767e1ed96df0d6e66b4fc989862c7b976f01faee2a15d3d0cf4ac4eba889db7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addKrea2LoRAs.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addKrea2LoRAs.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"fabe008c097577b36accde3f8ec9eb44aa8a57e334af7d1cef244644a54e63bc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addLoRAs.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addLoRAs.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"bab3030990ff6a530afb0731f6e89bb92ea8d9582f35b1509d45224667939e58"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addMiniMaxH3LoRAs.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addMiniMaxH3LoRAs.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"c66c1a6c42fc5cb4d3205a9a86c09d44ef0c8a70b6d316c7c742c6baadae278e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addNSFWChecker.ts:1 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addNSFWChecker.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"df4e0af4af1cbe09eeb7f6691f3ccec682742660f9c35d883d84a8ef3752fe3f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"6600376d5f83dadd1c1976b2a54e971cab67b82529cfba82f5eaee228f085386"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSettingsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe4ebd4fd952c5bc3723070241714ee91d148cd478ee203798ef8d5d281e1089"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addOutpaint.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c3ccfbfb55f0e5af562fd6cf8594fa1edeebaaebcf6b5759589d7862256325e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addPidDecode.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addPidDecode.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"720a2c35c4b64de723d1b0410d2d557982a6745f84448caa3b54bdc1a5364dbc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addPidDecode.ts:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addPidDecode.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3d684d5758392a60c174032ca13deb45d3e43ed3db85c28f4cc33133b92f22d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addPidDecode.ts:13 imports invokeai/frontend/webv1/src/features/parameters/util/optimalDimension.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addPidDecode.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"a046687ff5469a4ea1fcee6d5722eb65e5b6098c878a475a428ceda57d0d50ee"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addQwenImageLoRAs.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addQwenImageLoRAs.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ad28fe4c7c981c33985f6ae27590a7f11e42a54ecc52d9f7a68085d982c20e4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.test.ts:7 imports invokeai/frontend/webv1/src/features/controlLayers/store/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.test.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"10bafa4fd7c9d316f62d6445c0c038fe2e172283d72feeacd3f6ffb956398b38"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2f2b24a976c880ad79adabcb1338a48fa34f316b16fa2505a555223b272ff92"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:5 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b2efcbf0876fc90ba828baa9a175803798a61de685b5a5bf2bb6e0dbb9622c7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bf92f78b70dbb84fcbf1f405a4bcdaffd280e73e6c2d1e033fd739f14a0cb11"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts:12 imports invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"25167ef93ff3356e3a58b844c4f92e6fdfdb0c83d5f46ddfbd006fa18aa55c18"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSDXLLoRAs.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSDXLLoRAs.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"20135d6146280974fd457a00df04ce9bcd6db6ec8e76e43c3904888b71e71b2d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSDXLRefiner.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSDXLRefiner.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f15ccfcc638343ff0b7f967f864c22a4e738cfaa763073856f2ec11d60863094"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSDXLRefiner.ts:3 imports invokeai/frontend/webv1/src/features/metadata/util/modelFetchingHelpers.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSDXLRefiner.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"d09c9c881de743eddf7579cd5458ee582d18b9dffa9d73ac63012637e52218ee"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSeamless.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addSeamless.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"15a2fe293f7d86211798f9b0218d6b52b8232a016a6dff1fd06c8f8281bde969"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addTextToImage.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addTextToImage.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0e2216ae457f3a5178d10f88fe79235a770bd481ebc622873eaa4a1e8aa05aa"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addWanLoRAs.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addWanLoRAs.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7b9a3ab003bc8d724d0dff3e004eecd5f1681501432276e7cb3d560d944ae53"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addWanLoRAs.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addWanLoRAs.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c54704ae4c8d1fe11ab9edffdf1ba9b2feca4cb6c8fd267242594d178d8288c2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addWanLoRAs.ts:4 imports invokeai/frontend/webv1/src/features/metadata/util/modelFetchingHelpers.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addWanLoRAs.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"a83f8bad428679e25b4ada753f6d6a3678b2bb230081ec5be5ea90853b48bb3d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addWatermarker.ts:1 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addWatermarker.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ec22445971052a9fe10a9cd8972e193fe084bdd8f686bfb74691b7f3b3a40b3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addZImageLoRAs.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addZImageLoRAs.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf121b8c770292c0d8ed8b70d624da0ef0bdd25a46798f03315c6603fdb5ce8a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.test.ts:104 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.test.ts"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0debc36798683c5d9245d0fc2a4296dd373f8c2325d3316d2cbe682645e51cf"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b946eb39b647e7de402d59cab8634ef10b02538c5f768510515e68cc6664c10"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"728f6702640390fcbe57aad0ffc6cdeeef5bb49c03cb0348920e8bdb5127557f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fbdd1386177e95cdf357d01422ca12449d899c7a1d4f6c93fbdf7a58461ff76"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts:10 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fdfa23c714dbb9928d97d779d1e4e1eff63363852bf2ec4e3427b9a2d899537"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts:11 imports invokeai/frontend/webv1/src/features/metadata/util/modelFetchingHelpers.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef8e16ee0710e94352bad170c8037b2fcadcbbf65df9770b18381e4f0628e328"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts:24 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"e96e4ed1997cfde4a1599e472cac28c0b6d40e38e55c9957107cc4efacba7b59"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9388d33468a3bc1a699b42e89bf3dbd73f8b5b359f7242f1ce14c5e875050cb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"0aa4f62fa52ddd5555f7b423c9d022d1005e7ed2cb5436ab6e4a81ab6ddc4f25"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d57608de92bf9b544685c88524dc88a2d90a79c73c7aaa038277d2460a685c7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"241ae1fe0384a385216558692cd62be7cd4bed9551d0cfb34b98658eb8b6145d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts:5 imports invokeai/frontend/webv1/src/features/metadata/util/modelFetchingHelpers.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"082acd7d684098cb932f0712d320baf763455fc91d7588deff2402a766f05247"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts:15 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b27253644c499138966e32274c40db7a15ddef3d6b922e6fa4386c92ff0465e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c867123eff1f5a8f50677a999e99219c1d83f9b548c61334a5759f884919cba2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"1adafe94d376a52f1eea656ba6d11826e5ce63362f40df1c6c5feebbf20c8e44"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c2e37fa3d7d4b866e03f1233a27af3597b9f72ef07d27d135c5b0e2d6f3fd71"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts:9 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a13a80708b347f8e6139613b97b31f46578aafb418ac19029d588123e17e3cd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts:10 imports invokeai/frontend/webv1/src/features/metadata/util/modelFetchingHelpers.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"f816587653b97a345bf3b965a090e43a9fd8997be832bf2ff75a35e5fe95554d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts:22 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"780ad17f290fbe48fb6c4dda118983a4162872b1280eaf8b8c54da962c5f5d83"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.test.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.test.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2b8cef4e64017774cb8bc223d717cb56c7727720baf15b8e21880db1eacaa50"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts:1 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"62f3127faff5f5fb21db0d5c5057a28f2b78d76b805328b072167bf1dd04a263"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSettingsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"27ca144dc0e330e80ec0b53b9a2597f7d67d254788038aca08cd79256784c032"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"257461d935959615b2aa8616952f6729556ae022b984a3998a484e522ab33bba"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0c9a7055ada9c832205cd9effbd4d71a36a0bed866ebcf8f3785f237466e349"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts:16 imports invokeai/frontend/webv1/src/features/parameters/util/externalPanelSchema.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2b078ad43ac527ecc497938138319e648f40982d4d1635378becde42ea2e323"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"db9839c3fd6497dc5ff305dfb4dde4f5192f1ff6d3a80bb5e89cacb129f2a9e4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"6acd35c30ae15e486e24b9ac34008598d8bee8e6233f11c32d3a6c1e40b01492"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b011ae1e0bcbffbbf922d052a101dad4bba874652301a4a0127740b12feacb3b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:10 imports invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"a64ecc3969ceff9b5257097ce74c465e7422eed8561c434772c74413d9ed8ca1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:11 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"6eb9e998a7252e2d5ddb5429852b36721af78a2b193fd22efd49e508de9da1d3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:12 imports invokeai/frontend/webv1/src/features/controlLayers/store/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"65569c98a88ed5f50fc3bbc1f73328a1140b0545ce7aa8c5da38ed9183c7351e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:13 imports invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"17b6d1b93f4a11afcfbc67f0b27633e991b3c79e629c42cae36c4df12b4080b2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:41 imports invokeai/frontend/webv1/src/features/parameters/util/flux2Klein.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"408414e3a6db2c1d63aa75d5cb0117e319b1aab7061e900873202837c2888b62"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts:42 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0abfbdfc9291f3b12eed3db3f105b813c173336491dde17ee5960b8b12c039a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts:2 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e76f0f2ae7c49fc3a31e094d0b87abbd82f37cdb97585d4e04e94d80e5fd2b6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd1ca614d0630788bc2eff8f01f869e968cb86c824cc596ff3ecbf69d2fe3a53"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"20081f7beb0c3f21c46e7e1ef56f1fd767c52029cc38f4d991c496308041d0cf"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts:11 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e704e5bb52ad1a214137a7066fac5aacc8dac56d7f7b4d4e3d6095b634fe27d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts:12 imports invokeai/frontend/webv1/src/features/metadata/util/modelFetchingHelpers.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"1af02c25f04e8c1c2681c08a1f66a4fbd68a112860b33e3ae01bbe9aacf18e3e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts:22 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf10fb3d4c44397fc0019151ea327d161f79e70990c88ea0c483c28ff6c53e57"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Prompt.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Prompt.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"50f68dc656803caa81ce1db8a6362ad47af75ce8abfbb18f2a43d52eebfc5d1e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Prompt.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Prompt.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e05331b7b6c9dd71e57ac2c12d5c142f42ba5d8958bdd0050679b29710f0fd3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.regions.test.ts:105 imports invokeai/frontend/webv1/src/features/controlLayers/store/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.regions.test.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"22051ab218f6355d1a71e48687081970ceae92597d1ee9956e8949b68853d008"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"600659ed1f2d8a0fbd2ed8f3a077b5bc0873cc4658f96f5fc46be30ea28de305"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"30ac00de3630fd60b79bc15f41b8df4b8cc29fe9c2e2b9abaa44d483da1caa71"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"67eb5e85b0efff10ab6ec6c529ef5b03fc81ab5fdeeb82b464575a46b18116f8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"349f695b3029ff02a20b4e3e46e73653ba4d1d9214554db3dfc1a6a72ca0f30c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d2113628ca8fb6a214e9b097dbe469221222550ee7edad41ba944eba0d30173"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"dec9f3add7eb0e541ddcd2db235d5c1efaa8b42d053c55e96c0dead2102f426e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts:7 imports invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"760f9205dd83ddf2ff3c4f040d5040ee2d62a49f7f21fdc4f31c504b05dfd7b2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts:8 imports invokeai/frontend/webv1/src/features/metadata/util/modelFetchingHelpers.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"cce79447dfd5da808f196cc3f0e01d1d9f0bbf5aac3233726527299112007bd8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts:21 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"5741539b27dc1669212b6ef8c02990fef5bdea801b874c143e8b3c13b401c505"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2538d6144a069e93ce6bf3cfea5be9a1861d7b13088f720092c9425cade46a9e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ec7a670782f2762086e0ee2a8329b65e94982432571d1bc27fdb54759b4ba5c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"260aed155215e2af6e098771d76a9036251ae8dcd617ed71b7790fe6ee7b5060"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a55aafadc3741e2f7df7dab2b1c7fc2ca8a5f2d3edfc10c9283ab0806a16c03"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffd3bc199e99916348c26a705f017d4ea9ef0ae87a7cafbfe90d91c80dd42dc2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"9604e10d6f13b84dc7cf86b67447e7f1e34f728db1754448464d626ad051649f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts:7 imports invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"47675578d0b5aa0c7a346248b786e1441b316a755707b64c2169595836095398"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts:8 imports invokeai/frontend/webv1/src/features/metadata/util/modelFetchingHelpers.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"8442912473714fb9c61758999e409afb355c7b4578843aadb5dded31d0d666c9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts:21 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"48c217aa5815a4b5111e4f4182f22947c65da0a9068d16b19b5db55b812d2a8d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.test.ts:329 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.test.ts"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6dbcd5aebf307f2c87cf7b814d1ccbdd37ea6b80104756bbd019430b4cce219"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.test.ts:334 imports invokeai/frontend/webv1/src/features/metadata/util/modelFetchingHelpers.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.test.ts"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"514059f7b2bb74da1df36d08c709de371685dec2bf1ac135e30ede50131bdab5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.test.ts:338 imports invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.test.ts"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"620c1fdcc58239ce3c8c55a81d4fbfb9a760890ed639ef2e6034e2768540d10c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.test.ts:460 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.test.ts"},"region":{"startLine":460}}}],"partialFingerprints":{"codehealthFindingId/v1":"5886b047b8241d9f071ce7a4585558902022b274ac1c2d4c0a388ec91ada152f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.test.ts:464 imports invokeai/frontend/webv1/src/features/metadata/util/modelFetchingHelpers.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.test.ts"},"region":{"startLine":464}}}],"partialFingerprints":{"codehealthFindingId/v1":"645d5cca9cb6bb1787e8397fa9663b58cb7e47470068212cce6aeb953656cbf7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.test.ts:467 imports invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.test.ts"},"region":{"startLine":467}}}],"partialFingerprints":{"codehealthFindingId/v1":"7555d970b90052850f5a5b2b9bfea69a12e2ef2baab95c95d9ca3b6248dfa1ac"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fc740c40f2dcb926f49be0db8a43e6ec9b815d09b26fee7b052ffa3220f600e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"291a93a28f31ca47517141e6d0fc5118a57bac516b37fca5d988bab2f2c5c6e5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b97f4afdac979966485431a356a1ba73a5bf921b248cb34e9b6e007773d5d751"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"534d2ffe05c4f2eec6638833a0509867f3258a7de9aa7726a3b7d8ca89f537ce"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"2951aa54cc6a2bca7cbd5f1f412e6d78ea397d391c3f25fbc2834c1beee14725"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7493ba7816a74e9a8940bf2b9dd5a805055aa887bd9ea27d85170f4a6532b67"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts:7 imports invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"40571045e10dd54b8fabcec084374b6e1fe4d83adf3b728c8ac6ff0390bffa6d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts:8 imports invokeai/frontend/webv1/src/features/metadata/util/modelFetchingHelpers.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbbdf42f04ad60b1eb2f9cf1206e27a906ff756a5d6a7fc4db6f3755eb9317ab"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts:31 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"c020a2bc6e878e0c3e58b2660704e79bad1813baefa5af8f71cca31a3fb3dfd4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1878885bf66c25d6300c7d7dc8951f7979209ccef0249022619dac61387fc9a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"5193ef7acba4f5d89fd39a4e0ffc9b22af96f005534e5a650a9a390218ef69d3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"67fcb3ec18460c24c1c82a93d33893c35179262265e72a5a385a9d0d590116de"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a82b83b9bbdc48f58aff0207c8de0318b3e8d56a26073dae615176d1bcf0176"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"e72558f70a7685dac0191455e38e871ceb59e5cc8e6774cbb879beaabf730f4c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts:21 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"32fcccd1c2fa707f105d7c29e1a3b57b5015065eaeab9c10f2c7a84b7cb23f1a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f761d8fffb942d76f0846eb78ad5e90238104e5768c4d9166c6a988601e5f051"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"507dd268dbf1eaa154fff2abc5bbb2d96479919450d20bb2f05ef0cfecd4de61"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"f344b89fa864641a1c392ef657a6dbb8961158dcf09e7b4942cc8b0bbbb66e2e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"709310f1071c6f00e7abbd5988657f823d1d92b9fd480be123f9df1a661604b6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts:24 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbc7142d6a09bb36e7c1c3b9427c8c7bb73260f6879db808307b6df2db71634d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f300932af59907b44e5ba0f988e2d2cb7b68e059c44ec0a40f6a3b26dfa4b641"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"4592c6df760ef0a57c7faa0cbe8a69acdaec18a166ecd59f7707af565bd6d38a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfbd1a3d99e4a78fcace641b0760ba79e044291ab4f98c51cea1513abb64f50e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"b190eaed834fc796dc7608dba06f057fba1eef48eb474490bcf42159d924caa4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9ae3fa65844ad6bbd89f6b27ee5325f211b04cc347a8e1538974c212b7f0f06"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts:31 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ec516ba47677ab62264537cd3dd02ac29627de9e51f57383d5cf2a4535d0167"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c1a4fd6a070a4df3e82b48cf450a5cfc45e3a2d31a2165afeed679254caf0b1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"37d132a03f59d68bb0b2a5e5347a2bf7196616a6c0b7c6344e3d621e8d6ce064"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c02a28b9619bf8d842dbfe3faf974225fa0168dd7104869229be41b64f0cb00"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"32c64bacc3c93c486fffc07fffa493bd6085c633a02ac445ace464c9438917e3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"c52edd7ebb310adb2b3fea8e3175d94c3699f191bd568ee798bca2dceab75b2d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6d857fb9a48783a8fefa08b250b9a550530fe4ba37a9e592fb3975c6306feee"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts:7 imports invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed547ba45080e5589febd22831db372cebda94e880a98caaa3e5267387957e7f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts:8 imports invokeai/frontend/webv1/src/features/metadata/util/modelFetchingHelpers.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eaf749c4a743c479ae70c665bcb39d4b298e7dcac31006d2a054964cbb28515"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts:20 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b10ea89cae2206b76876197eb129f9cabbf2869b5f512e818f8ba1245ef3554"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b819584ef7e69f52f9f9c251d7ab5764a4577cde60402cf2b903680ed9f7860"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a060831449c52fe0497c800248073802b1e7d19c39bb4d3bf75ab776b8b624c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"8715af241927cc495e8ae001a7e764576d089bc682f446868e479595e78eca07"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts:14 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"efda46f8f6b131e5f5376bb5dc2ce2c623edfd87b0daea4a82eb867f969a8acb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts:15 imports invokeai/frontend/webv1/src/features/metadata/util/modelFetchingHelpers.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ffce0c5638e69069ad32e06aef248c842a3f69cf78c8af8d907bb5a0973e4d1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts:40 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"524f1c6b559661f6d28ac3bb3f6432042cbc7a34a5b41e94f5c683576724a731"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"410f481ed497c47090c628b8837c2333853ad27cc85233a7423ebd26207b90c6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSettingsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3064704fe5a712a9d3d377f9d2d304a0871f525b48bb77d6553b38d7d775497"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts:7 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d59f425c2bedb2bafd8ac638f39acb150ac8003aeed36c39c2d0f6d060dd00d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts:8 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"6893d7b8996f5c2a3432fadde7865b73e4a54ec2385807492a67fffb31d8f715"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts:16 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"5efc5246696b82f80edd9664f004f4a971186f9f3b704706843ac79f0db0eb03"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts:20 imports invokeai/frontend/webv1/src/features/stylePresets/hooks/usePresetModifiedPrompts.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"714c8eed931b36e1121e84848dac2a9d3ad021c23b87d3f4af22d7c42850f78c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts:21 imports invokeai/frontend/webv1/src/features/stylePresets/store/stylePresetSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed1f7fa1deb18b3d8143c44a12aab9036487fdba5e6092a85c14a3d6580c2ea3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts:22 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bc6166da251ca04c8c808f685014a57e88ad6d3dab6acf925c42558fececce1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/schema/parseSchema.ts:2 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/schema/parseSchema.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c1f351765e8db6503a1111cd7ba17331cf48cb15de7ba6ae617ff0ef7bbd17d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/workflow/buildWorkflow.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/workflow/buildWorkflow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f35ff8d543d617713a3eaa5610a5b8618bf874a469d7eb326d2e5acdb609701"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/workflow/buildWorkflow.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/workflow/buildWorkflow.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"09ddc362c8969a2e0aa943cc22793897375c63904aed4d2c73a0939bf8e6b0b2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/nodes/util/workflow/graphToWorkflow.ts:2 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/workflow/graphToWorkflow.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc5052bd90e56afaf001b069b4c53991e15f4e72c88b964d051b46bf91a08336"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx:11 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d182d00940c5cf159d6175e48acfcb86473cdfb36bd5df4689c867866723aec"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx:13 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"f14434f180d6959a37eed4ca8dae6c185966c0fa6be9ebeb9544805a5d6d6dcf"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx:23 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb7f09991fb0536830798900b24c04bd64adee4b799f400bd50bff9cf84420d9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCFGRescaleMultiplier.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCFGRescaleMultiplier.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd32a7ba1c25b6e00b22e609823c9a49b43efafb293ea41113d7a33fb24dd369"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCFGRescaleMultiplier.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCFGRescaleMultiplier.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1f27a2117ff379e0a62972abca535448d7c3935abdc99fc3f26d151625a3814"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPEmbedModelSelect.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPEmbedModelSelect.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"6758efbf52800d4f7555a6798387bf181c00857ce77557522b945eaa9dbbff5e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPEmbedModelSelect.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPEmbedModelSelect.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd818e21da58bfe5be1810fdb053c5e0c65bcabf59873c050c7fddd5baa3615b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPEmbedModelSelect.tsx:5 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPEmbedModelSelect.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"aef960b7d20da94d56a1c924311a4f0a8251744545a3bc83915427960d6a26f3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPGEmbedModelSelect.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPGEmbedModelSelect.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e893a522e218ac86f3d9a5006712837000a7a1ce06b273d5276651c1a584990"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPGEmbedModelSelect.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPGEmbedModelSelect.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d97150fa49a80c98b233fb4751c4788470e0076481d85a5aeb3fcea7acc37f6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPGEmbedModelSelect.tsx:5 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPGEmbedModelSelect.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"aee0836f7c377be7a94849adac916b3c0b7737f37968a2ccf2a06fd88f709ba8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPLEmbedModelSelect.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPLEmbedModelSelect.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f860ea98b140de44276781a980bf2cf63769d5952df5e0cf41698d28936ae66f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPLEmbedModelSelect.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPLEmbedModelSelect.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fee903e1aed913daf5ae10e5427cfe861841b7cd2c8ad40b87e71e45384d85b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPLEmbedModelSelect.tsx:5 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPLEmbedModelSelect.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"f94207628ebd5c454b32269d5e5bb3b6329dcdd437e7086ab5ec302278face34"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamClipSkip.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamClipSkip.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"95e030df95c42a0dc4fca5f0b4c1d08acb748b6b38fcbb3c4ab65bfad3306326"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamClipSkip.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamClipSkip.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"4df02d01fbe96254a6cfea0f5c65c104ea0fa813bd9fb3a9414abe6e0ebf7a33"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"719f5b7bb8cbb2c6b2b68f5a17a29ef5d42eeb0b12d7b2af0844568089c78686"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"40ae65e9fc32e53e3761e893dd275b680b3284c34808dda2350a9e45cadcbfe1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx:11 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"42b75d4f4c08830bf44ef9fb199e2c4430aa75666b98949057f9fc6c6b51eada"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"74b6d05afb85b4b3703086370d8b9c1cf19023a6ab1bacdc8510293e2800aa98"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"a39f4f286477bbd43312245c57bd5edef423f5266f062ca66fd3c3e36e7fc2d0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx:11 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8f3042192071ca36d1cf4580f8ac531abfece4c8bbc393f5d2962565943e129"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"da58307828881f7fcd6c2149266195a623bfe12d63edb66b19ad1aad114ecc1a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"a35a14a6b637e0723d048145091568ec152ecb31b2c8a6e25c06409bce92201e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2a2bc2885e6150086ce6adfb07971365d88e3a2252e01cea30cb43c4c1d479d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"21f23e50851cadf59b5d30dc17b8c3774dca3c9924f82a50178229d97b12eb67"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx:10 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9df46bfc60f826f4e2bc5426d4f08f9c643698ce24acbc57065126ee2a71d06"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamMiniMaxH3ModelSelects.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamMiniMaxH3ModelSelects.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6429f70b309bdb6958c068fc90c571199ed0bddaa6a5703f42cfdc57b858e6a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamMiniMaxH3ModelSelects.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamMiniMaxH3ModelSelects.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"7892b43140d832fc9f849128bc4ec22d40d00e0291564cc13f2c3d835153555b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamMiniMaxH3ModelSelects.tsx:10 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamMiniMaxH3ModelSelects.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c5aa32e0c6692d149a9163c942eaf80ce7b537b6d36fe1d4c6a077eb5759c98"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamOptimizedDenoisingToggle.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamOptimizedDenoisingToggle.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"479a976cc59a07bd8fbe264447409d56f695928cc5f2e4be14b911d2d3395849"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamOptimizedDenoisingToggle.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamOptimizedDenoisingToggle.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bef86cb583c102cae8789ac9614735c3b47b4c6d6270af93195fc5fb57bf953"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageComponentSourceSelect.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageComponentSourceSelect.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e610e0b55a44b9969adbb36a8163ac4510611e612420c74839191d5aa3ce0b8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageComponentSourceSelect.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageComponentSourceSelect.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"58f3494fa51ea8e1f3ed553344080b94fb894ff56d25408c55b35c067c308de1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageComponentSourceSelect.tsx:12 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageComponentSourceSelect.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f906e9731d7f151b8a6d246984a50efdd34eaa2d4fffd81346381d010a7b69f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageQuantization.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageQuantization.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"d98840b4eb57a99c1a88138396030739c754f3d0dd08794a51a1b90b22a0f7c7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageQuantization.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageQuantization.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfa186bc1a3435367609cc6c003891191ab5bab2c66a753dbe8565e7658c1c97"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamT5EncoderModelSelect.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamT5EncoderModelSelect.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"790337aa2c823050d888ab06cca6eb1a1e28bba46be41616d69be563daca6eec"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamT5EncoderModelSelect.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamT5EncoderModelSelect.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"204017b58505144a3764aa0f6fce4f9817bd7df0e947ddeffca4c2018146858a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamT5EncoderModelSelect.tsx:5 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamT5EncoderModelSelect.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"156132379879684cf676659ff7a0e237f8f47d6c62d890faf764652c1c9e8d4e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bb937124a0424be12a63fca6d9404eeaaa851af399c1e38d69120cab91b6967"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d4b0ce503739dac8abe11d9e3a18ec69e2edc85f09e8d9898710402567c9590"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx:14 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c1a0fa95882a93759e1e198fd96ebdc1ea7b3d861dd8b569e1543cdd83515ec"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"152991a895225e363ed46c336ee64c7c0a252ec910153dc0e354a13387fefc72"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"820f9599dc1281a1db814c585dc1b4ad6d97d381af8db1253488b86a1cf3e38f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx:12 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"632948c34efdade8dcffaf499d171824c0d4406231e3028a8188da2482978994"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dc78b6de81ff6c66509e2ec84bf191ce200cafe56abef3ae78e6b5441461657"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c2afa574849674b665fc165c98efa999ed17f64e0c2df53252fa94acd1293a6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx:18 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"8796aa3abd1a49ef8351a6726d1928e10ae33b2cb279007140bd7a01ed6ff5b7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdd20e7447c28a49e418d6b19d5db47f6730b1a5423c2b5a04d0eaf54765b4d9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e598bbb40de8a2a82143a894a3eb8b631b433f359f0958ddae475ab78dc74dc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"0293966285b82be4ba351b8b27c30f33de27d5d1d22d75f0d824f2350c56d844"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2924d0face53fdecb9a68100e38fba50b79765b6719095be4ebdb9abaec9bcc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx:12 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a81f3449d889617e2a9d4333339cd044cb94ae52e25c8f0992f6f2a8974b65a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx:13 imports invokeai/frontend/webv1/src/features/controlLayers/store/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ad17950cacd73bae54c1471b9c7420517efe021129b56c42df72e0190a84837"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxHeight.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxHeight.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"75c8551bbc4720819775735b7bf1157443eb843512dd1b2a94f42e58ea85a1ad"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxHeight.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxHeight.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"a10d7e34976c3774d4f3f68605567dfb638d1dbcbdb3644ff150f54f26189460"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxHeight.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxHeight.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"679dacf88ed5f33c2f221c25ba99e12e803b9fb972352618b25837b82c9a19e9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxLockAspectRatioButton.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxLockAspectRatioButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd9451b679dbbcbbc0aae83bd111fd205d9f6ec2a5904a6e9d0fc774796b4b83"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxLockAspectRatioButton.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxLockAspectRatioButton.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8516c7db4806e6489ab54c491df3223fc9889ae26d99613d3a72cc68d0ba989"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxLockAspectRatioButton.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxLockAspectRatioButton.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf70c3b377c292d179ecd6daeac7768ecd06561902b17e13592bc061da5994d5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxPreview.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxPreview.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb15c85fb822fe3718185a32c3c49010abd0317270bf89d5482dc87944b2d2c3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxPreview.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxPreview.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"24614db4c037dc37e1cff22477c5b2340c9c91260c33cab5054581dab9343b10"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaleMethod.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaleMethod.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d7a058ba589acf31c1930ac99ebac38e6eea60606ae2c923ba13d4a3942c186"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaleMethod.tsx:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaleMethod.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"f87ea0f65c7d0fab33fe9ebff9d7d181df09bef732cf05b800a3f3842c38b371"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaleMethod.tsx:7 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaleMethod.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"acb9c68b7db8e8184fd40a9ecb52c9c042a49fcf489e6b9851bc389e36d719bb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaleMethod.tsx:8 imports invokeai/frontend/webv1/src/features/controlLayers/store/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaleMethod.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa1f98effc90ddd6c2f4a5ca047019983a4c103337a443428661eb424eb05eab"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledHeight.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledHeight.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"8228956325f18150bef4024587a213eea48a8a9aecdf8af34e6b97ed8a881514"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledHeight.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledHeight.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"23836b1b41967ca17a57eb82279c454fbc1740884c86364ecbcdf0e26a8ab1ef"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledHeight.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledHeight.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"496086559a96c1087a2b70bbff3a18b6bbb19fd3ac8275552640d035b573793b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledWidth.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledWidth.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8fd81fcb5a3e008c456053d3d2ebb7bfc52efba4d3dd756570e67994e3f464b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledWidth.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledWidth.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"67ae438fd87942ee0e7ef00282166ded13bce8eac606e1acdc5d28bef2161f4c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledWidth.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledWidth.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"50591f51243b8d3c5c95022c6912c1c6921a71542a05dc8fc91a6014aa42488c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSetOptimalSizeButton.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSetOptimalSizeButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab0883d0d32c0bd8de0c6f34e2140cebd45576c9ac6762851c482f8d1271029e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSetOptimalSizeButton.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSetOptimalSizeButton.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d9f6fa25060e882e66acd200ee6c4c61fb5210b7765323f2510c12dd8ffbd43"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSetOptimalSizeButton.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSetOptimalSizeButton.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d2e179b0160e91baf841a95dc921e131159a8a2b185fd382c168ce3bb4033fc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSwapDimensionsButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSwapDimensionsButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7b9baf1b7fbefe539b184467a492cadb9c93ae9ae87d12fe15775413c54a01c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSwapDimensionsButton.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSwapDimensionsButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"268139dfc1a1a44c6cbdfeca9e178c5d71673087f61f4418094ff90e4c4bfac7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSwapDimensionsButton.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSwapDimensionsButton.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b7a7ba1c9f4b3dde0f658af5b8cf0ca01fa192e9b26170c7cc909baf30aa4f6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSwapDimensionsButton.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSwapDimensionsButton.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"49023746f4484f94b6d369a378737ed0c660e4c75ecccf9325134c342c9f2f9a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxWidth.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxWidth.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"285160686a758882e341491064e059ca369fedffde4d25a864d92ab895abc62f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxWidth.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxWidth.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bfd6b870d4886f0b23533fe8217646db961845f1b6f7b58d67764efd617adfe"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxWidth.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxWidth.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f18c99b00abcd3873a079f8e6bb58af036569a973bae321c5da356e950df8a2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/use-is-bbox-size-locked.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/use-is-bbox-size-locked.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3ea37de0c197e1f32cceef2b2117838da3a6ae78c6d5f6cc196c56e637f9855"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/use-is-bbox-size-locked.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/use-is-bbox-size-locked.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"864c1933b9efa45167e29c7a97d48cd89de159537ad27c76655c5ce7c1b92536"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Bbox/use-is-bbox-size-locked.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/use-is-bbox-size-locked.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8bd8468c039fb99dab74f4753cf79646a73f200ffe29a00e2fa03f02c042e66"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceEdgeSize.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceEdgeSize.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bfad0692c016ca8fb70d0f7d41e859530c0908c6804a19c005bb07b9d4ee291"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceEdgeSize.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceEdgeSize.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e37fa7fad91eabc8c31f19422cda052f2c202c7f0be79d68bafbb7d252a47c4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMinDenoise.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMinDenoise.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"b11e9c9f26b1deabe1d92d86ea75d7a76980217d51c86c3ee01e77e0acc7010d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMinDenoise.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMinDenoise.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee3946dd7aaf127bd5da3eabf3b6b7c0d0ea6ed61bbe70aa837bdc0247e9e2f0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMode.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMode.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd7ef0412e5e318fb2dd102cf51af7378d3ebdbab23da5bd73596a1c3c661275"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMode.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMode.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"e91147675e001440efbb8dd966f8e9e32367be0bcd44b13629f9ea07a381482c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/MaskAdjustment/ParamMaskBlur.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/MaskAdjustment/ParamMaskBlur.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d75afb77048294c9a25947466ef24b8611378bb460de8323be5a866dcd472710"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/MaskAdjustment/ParamMaskBlur.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/MaskAdjustment/ParamMaskBlur.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"013cc5d7560a58bce7407d924ec1a44084b1fa71e92342978dccc806975cece3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillColorOptions.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillColorOptions.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"222d8475f8c33c2d676ee217107f72be42ee4c08ed0c8a6ed551909ba2ad7771"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillColorOptions.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillColorOptions.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"308ddcfd78b35eb04d365d975a5e30a6b9ab94413f9f6368ee52d807c36a4d9e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillMethod.tsx:3 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillMethod.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"95caa86422b76e5ba8b0d8142793008bd646fb097dd04e606a31d2800cf9b7c0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillMethod.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillMethod.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8b88018a930073c9873848a896c07a9508cfb862fba1da7d516ee52b59f2d78"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillMethod.tsx:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillMethod.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"cee3f867dab29a18c0a008ea9448bf1bc82422461574811e5b7754c4145cf3a5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillMethod.tsx:7 imports invokeai/frontend/webv1/src/features/controlLayers/store/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillMethod.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"01a693ffbf221592a2a10c3ff7707b52f75bab4afcc7458e556985898d70a999"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillOptions.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillOptions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"236afd4ff1c9a2756472319d5372847b1ca4893dcf84e3b85d81006ae47971d1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillOptions.tsx:2 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillOptions.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c00569cc8f9fa9f5436b36647f5a56b9caa2d398814c44e6cd90f142b87c61e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillPatchmatchDownscaleSize.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillPatchmatchDownscaleSize.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"eeb2b486fe597fc29cbb628624d09593d27986c7366b331622e7f4550f39581f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillPatchmatchDownscaleSize.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillPatchmatchDownscaleSize.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"35c8c93e74f01ae158c61fccfb9eeac99a7f065291ec4bc233f3f7033a1f6067"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillTilesize.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillTilesize.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d3cec8827a929fa91d5bd0cb0a7a30c505d4720b0f68242b01871efe3cbd906"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillTilesize.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillTilesize.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ef55732d2541ce7cb25cf136ce67ef9489648d0626f7d6b32a873669fc8d77f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/NegativePromptToggleButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/NegativePromptToggleButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"344ffb8b4355e73c7b0f52de79f14651953ac826cc8bcee7725538e2ae7b52c6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/NegativePromptToggleButton.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/NegativePromptToggleButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd6a59dd95b1912de073e0d2fd72d2effab33c9b7ffae0486a9d3b55b283ebfa"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamAnimaScheduler.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamAnimaScheduler.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"674d281e35e116caa101bc4cf98fdb7ddb1fe9e343584464355b0a091aed5087"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamAnimaScheduler.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamAnimaScheduler.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"05501165f00663e56eed9eadb185bb7f2d160ea55ffaa6f1ebcd34bdc1c0d1fd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamCFGScale.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamCFGScale.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaac747d5967f597bb4a48ce68bf4ed86151e9298e2f21cc555a4875b5fe2358"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamCFGScale.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamCFGScale.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f059a3bf0bd81746efb672903081c08b34ada2b9625142cb87d9e422a94b3eb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImagePromptEnhancer.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImagePromptEnhancer.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3facba68be8959b02c26f1e189963fb6d4328dec55a57a279ac836c2a395f53"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImagePromptEnhancer.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImagePromptEnhancer.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9cb8c1765f1d6b5bb1a043d07e955afec5b776d39c9afef41b2b024977001df"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImageScheduler.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImageScheduler.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba0334bce9f49a860b997fb05ca8d0b0765988d7a39c65938550aa650bcffd17"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImageScheduler.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImageScheduler.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"392428369c3ad6bf091bfd3e45af249cb04d35847ba6bc457f0bebd13ce24ec7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeExponent.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeExponent.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3556602f8dabaa9a86b2e220bd2feb745eafdde87ea28e19d753d86b104a563"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeExponent.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeExponent.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"334b2e7189d8af2686aac89ec9f84ae21b374dbfc57378c98aac595e581b47d4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypePreset.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypePreset.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"67555ef3167a02b9c0c97205bb2c498f4b4db3cd2869f1bf1bfa176aba903505"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypePreset.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypePreset.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"33eebf5ee8c34d3f8f0e0fd26f7caeabf3462e19c52c8d1e7bbe07c955740642"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeScale.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeScale.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac7429922097b06b41b6996e71366a52a131b69d06f07ecc6bd4cd69689c8a7c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeScale.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeScale.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"73509f8c5423ebf72c9ab319a56c2bee34a4cd27ba673f03c4d171ea2fb8fc2a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxScheduler.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxScheduler.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"27aa029819c21369bf7f3600294d4c8bf9238a032b0274237a42b56d238c52c6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxScheduler.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxScheduler.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d704172e126a2fea2b2fcca1cd6097a8946c8be9cb03457d7147228f60f5611"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamGuidance.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamGuidance.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf0bea4b4c01ed481055d315609eef53757da3ede8338d3b29603462f4238e99"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamGuidance.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamGuidance.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d243ef49237a241249a1b8344be312ec6afd346c69b035217214b1859545785"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4ColorPalette.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4ColorPalette.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3c78eea03715a9ea19e5d86673b48b22e3eadd2e3d0f92bc1cb6a4bb02a7d2f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4ColorPalette.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4ColorPalette.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa732890eddca546dfa82cc30ea0532911ee32e1507b2142c3885036ba2725cb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4GuidanceScale.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4GuidanceScale.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e36c7064c8b07ed50a31c8f78137bc466820b5438815174da6be77487df90ec4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4GuidanceScale.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4GuidanceScale.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"59ccbcca55062595310aadb65ae1b878906e63334cd0fe59ea8013d729d3613e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Mu.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Mu.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"849d529f1fa72622532bebf0a1b63269cb277774d9c67c298e3c5d5f6a50aee0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Mu.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Mu.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dce3eabdaf682d83e92dfe23fab5c93f96ebd2a48099ccd917e39db1ef63577"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4SamplerPreset.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4SamplerPreset.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"85097b06b759fa321aecc6d7d6092c3119dabe368d440d5e738bcb902733dfb0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4SamplerPreset.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4SamplerPreset.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf7705f11c62ca05db4b8b8ef8afe95bb3935c69fa68656e219718eb9102e291"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Steps.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Steps.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"1407350d5d27f968a60506216e78dd5cc931611abc452b01d2d5d42b5b630985"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Steps.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Steps.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"110610fdc4a4c74748099a615ac220ce686b669d04d04643a8f27799e00dd14c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamMiniMaxH3Duration.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamMiniMaxH3Duration.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"8baf5e54248a872be97af95c8545e6816ffd0748ac8582435080bdfb50ff2d50"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamMiniMaxH3Duration.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamMiniMaxH3Duration.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2409e4f7be663729af22b08e70d28b5b32577f82e623c6cbb19a05c38b87621"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamMiniMaxH3OutputMode.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamMiniMaxH3OutputMode.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"4df0c9fd6867c6f42b146c0eca74ddc58986567d23c39351cf28239ef540bf4c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamMiniMaxH3OutputMode.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamMiniMaxH3OutputMode.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"32000ca6e4f9bafc17c402c83e7721abec89a10c005a4d2f9967ec07ff08a332"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"092dbf32731b8b920058cc62d1aa0e754ed7bf54bd537369784cf626c4d40755"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d61ce7fc5391951a631bd694136297ba9dc845e9cdf996df5a75d5a845fbbf5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx:12 imports invokeai/frontend/webv1/src/features/prompt/AddPromptTriggerButton.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d80d33b5695f7fdf54520387f56f2ae480fb116d1cdf37e0e677af84afd1268"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx:13 imports invokeai/frontend/webv1/src/features/prompt/PromptPopover.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cbac692b9a47cd617606e6832dc826c2648aaa2faf7e7ea884ef9fdfdeba2e9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx:14 imports invokeai/frontend/webv1/src/features/prompt/usePrompt.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"17c4ab1414d47713419d98b50d355ed3e2fc38a89872fd23b282d6def849434a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx:15 imports invokeai/frontend/webv1/src/features/prompt/usePromptAttentionHotkeys.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"d411460b8e303fcdfdab5b00f26f828c050ac276a2036db4d61d6ad549c28531"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx:16 imports invokeai/frontend/webv1/src/features/stylePresets/store/stylePresetSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamNegativePrompt.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1e4728a2ba482b2dea7f98f852ab5353fb6dfd936ebafb86e221823d82b2237"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a5fc2acaf001e89ca1391b1eb9f1614b97a13fd840485c2977c4157718519c9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee8bc5e7981e817783c2bb5464522dc903105a946c6e701222fcf781ac7de20f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:14 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"eaf9e0066e443c6b1add5f651f11536a30c2749a8fc56c7606cfe4f4e16d054e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:15 imports invokeai/frontend/webv1/src/features/dnd/DndDropOverlay.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"848624f60373f85b5a83daf7cadc9ad8588b95d0e0f47e698e3765fe6e6dcb1c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:17 imports invokeai/frontend/webv1/src/features/dynamicPrompts/components/ShowDynamicPromptsPreviewButton.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab8b43fdf080b9e027a28e18cb004e8e0a2b078210bc8f0b85c474abd916c669"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:26 imports invokeai/frontend/webv1/src/features/prompt/AddPromptTriggerButton.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"758315a14ad5aa15c31d04622923f76528164e980731fcf323db058d404dbf85"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:27 imports invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cadec11a1e05832213dfda1cd1b6eb3bd30efc6c53c17e23075b5cf547ff221"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:28 imports invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"bff71bb0aa42003ac80040d593da000413b1b9e4fe98a6d0da5b49567792ef7d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:29 imports invokeai/frontend/webv1/src/features/prompt/PromptPopover.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"20c0ed74b31919d6277cc7d561398332f07e67f4563eb435c54e75d83e4d0da5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:30 imports invokeai/frontend/webv1/src/features/prompt/promptUndo.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"f229a8e0eeebf6423f9d3acb70560c7f3203430f2ff77f5bb701c901a0ceeb04"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:31 imports invokeai/frontend/webv1/src/features/prompt/usePrompt.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef49cfff56da13fd81a6ece2df535d089640822c0e084f9dd73f0af829b988c7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:32 imports invokeai/frontend/webv1/src/features/prompt/usePromptAttentionHotkeys.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e26a420469663a30d167b94f480781d3d5d136237d351d2fee955758612f012"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:33 imports invokeai/frontend/webv1/src/features/stylePresets/store/stylePresetSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2093af0cc46b08d6f08782fa466c35e5684171c621bfd8ca0de9b3ad097b4a9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx:37 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamPositivePrompt.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"7746bdabbde1ab4ffd66c61328d5c0d863141037c9ee2008d919e75c93beace6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamQwenImageShift.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamQwenImageShift.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"01df3db3b8866c92c0f39916d6aae27ae5e15971ef8254737edea9b87df1a092"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamQwenImageShift.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamQwenImageShift.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb23f1971bc5101f48e64c69ceafede5068e09b234d6633b8fc8f2096ec31e75"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamScheduler.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamScheduler.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"66189884ac55f8da9891670e6a173d05cc5ba0c3bb742a3944ec0f7139408a3e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamScheduler.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamScheduler.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac0ea51c53b3f6eb70fa0910c85addab179d9c4cf12bb29a7b4bc2ed4995ecf8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamSteps.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamSteps.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"524373cf86cc31c9180baaeb8fe9dc1adcca6ab2ee4d18b4517c25b74c2550d9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamSteps.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamSteps.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3475609534e116e44e6c5c609a09fbe3dbf990f7f98e6314b81b56269e740e9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamWanGuidanceScaleLowNoise.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamWanGuidanceScaleLowNoise.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a7e4e5155f2d8b58f37f93d35ac4c18be88c800bfaf9c729376f705855e7082"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamWanGuidanceScaleLowNoise.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamWanGuidanceScaleLowNoise.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cd78dc8ab02c8ebabefa684b4a6c0742de8b018445d316d5826452da2ffca72"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamZImageScheduler.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamZImageScheduler.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"2277b981bb5d6dc3daa79632a507c59ead01471e1dd79863f35a23b13318e90b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamZImageScheduler.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamZImageScheduler.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8dbfdda8ec8fe61c761c36df7ac836dd979975edaa71ad0aeb2093bad0c35ca"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamZImageShift.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamZImageShift.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"402146fb0458f50aec204af9fbcdae776112a0b51b9ecb5f5e7badccca6e5b35"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/ParamZImageShift.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/ParamZImageShift.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"54b6327f1da49bb6e2527ffb3ca5060919b16940c4c93ee15daeb5baceb1b785"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Core/PositivePromptHistory.tsx:16 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/PositivePromptHistory.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ca4c87f99a14208c3ca61c4264260f8e31e0518bb524f459e967ac074a4b332"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Core/PositivePromptHistory.tsx:18 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Core/PositivePromptHistory.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f284d0938935bd7c9254c95d2aca46e8dae49a1305c0c9cea94617c9a091cac"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"594026915bb495a499da53d479f97efd2633123ff8b512e8d877846272755211"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"3637fe010d121446b959a6a6b288de36dfa8ca44d4aaa8a0410a41d2de8c11dd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx:10 imports invokeai/frontend/webv1/src/features/controlLayers/store/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"42a2b51546a8524c7a73a99a6aae93fba495decc52060761d204fd2987b63f1f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsHeight.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsHeight.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c06eddb7d56b180fd3f634d2a5b6d252038e4fd2dee4e8c88509c9195802ac1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsHeight.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsHeight.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"afe68dd569e928d19d15fdb452ed7ec517583caec8060030f764dc6a213f03c8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsHeight.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsHeight.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b68f8ac75e3f668af2e1b5162b495809df345fb2e3b17a0b703cc1a5bdb1dd4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsLockAspectRatioButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsLockAspectRatioButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"684ab22ae27f0216a754cbb3423c26ceb998caacd702508e59162bb7dae5326f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsLockAspectRatioButton.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsLockAspectRatioButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c95dd603386ae4f7d643930c78500cd7ed76136254ee338236b7c69776e5ea70"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsPreview.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsPreview.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b63ebbc96dce5b77fcf868955b01bbd16a9b5fd820330721788a688b2f74083"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsPreview.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsPreview.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c785fd4fba91ccbcd53749aa001148463e823ca4f0110b8959b317b18437740"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSetOptimalSizeButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSetOptimalSizeButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d78ebb01b5ff19c8e8ca3cd29ef463d282ee03514ae909629bc8262e05f90db"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSetOptimalSizeButton.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSetOptimalSizeButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf1b1398d94e203be0a3ca5f65bd9870be614dbb06d92b061ec30059d10bb3bd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSetOptimalSizeButton.tsx:9 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSetOptimalSizeButton.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"ced03ec21fea8625d90f335f726e0944ae647ffbc47da5bcc1e28e4267234340"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSwapButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSwapButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff9457e7a16d9705cf80420e846df4d7bdc3f03a2ef18914233a1977497e90ab"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSwapButton.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSwapButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"91f20f95dc766355da0f16ec5015a2ad381d8a83fbfbe82c328b1741c852ef2e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsWidth.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsWidth.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"9936303a98fa3c0a33254f5b6dc7d6e7e7539fd942928172295e324cb4f069dd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsWidth.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsWidth.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"aba27bce037c8457988d8bbecc4c8db12a0553e867bacdee8d6d051498ae77fb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsWidth.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsWidth.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf6cf86068f5cb1ed34289d5900e304fe1c29b40a29e028cfa0ceb135020e67f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelImageSizeSelect.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelImageSizeSelect.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"690726f1feb1da535c113227bd43edcc3289151639db2772a266f4a78ce0a0ed"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelImageSizeSelect.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelImageSizeSelect.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2a4a89f3ed668c10d8fda61a9cb212ecac5254348558ed4291f8d0e171e254c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelResolutionSelect.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelResolutionSelect.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f48bf2ed04477e95ec683d1e154ae989d8ef3aff54fe1096ef4135081c20c831"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelResolutionSelect.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelResolutionSelect.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"dece025338decfe67ed2805cf0a4908db9089b07f9dac77625b76936f9a01096"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelResolutionSelect.tsx:8 imports invokeai/frontend/webv1/src/features/controlLayers/store/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelResolutionSelect.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4b8dac6a55ce3df65a583eb4feb249fa5ddaeaa1284429739acfc6ff068bc5b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/External/GeminiProviderOptions.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/GeminiProviderOptions.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"07302b0c4cfcd5c01952da4e64d948550221ebf2218603de0ca29947ea916644"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/External/GeminiProviderOptions.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/GeminiProviderOptions.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"55ef814fb61cbc8b1963820537cbb5956873ba0774d2632be7237f3b41b3dc70"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/External/OpenAIProviderOptions.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/OpenAIProviderOptions.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"affc7c4b78cd0cb4550c327e4c7dcbe90f8536b152efd1bb46c5050de1bf1862"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/External/OpenAIProviderOptions.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/OpenAIProviderOptions.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"287873ddb4eb38cf8fd9c8203b3b6bcdb51e9acdc70613fcd206f7a41b4c7177"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/External/SeedreamProviderOptions.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/SeedreamProviderOptions.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca51b66e0ce798a41acaa4ec0123afa6ee0619924256f72146daac12d59b8454"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/External/SeedreamProviderOptions.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/External/SeedreamProviderOptions.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e283a51b24675ee21469c60d45ea1d29824deb64b7f6686df9bae7b1c315ed5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2EnhancersSettings.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2EnhancersSettings.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbd3c82f054a0c227c62eccc2d95719887ce29e9c1d6be3c985f074452700d66"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2EnhancersSettings.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2EnhancersSettings.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"30181ac58d5249cc7e9953087a8f265db6dd7f8290c656b993a7c97294d63fb8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceEnabled.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceEnabled.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9b019c8a66438121236f322f900b6d804bc059d741a6d08453a23921b00e414"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceEnabled.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceEnabled.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"10d47b7cd479552b5c11a7aec2a2aba22dd632f471347cfb9699491b39a4ca4e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceMultiplier.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceMultiplier.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"af0ea3ef6747c40f6e40ced073a3a49bee305d5038c8c1a7d856477fb0251773"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceMultiplier.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceMultiplier.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c8bd0a7af8f5580e771df0f527c6b26566078d1b5c86b58fa363b882b05cb2e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceWeights.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceWeights.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"80792707bfe7047c902415df5f9fee3719994cc7b6bdaeaef67dc44f7bc35671"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceWeights.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2RebalanceWeights.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef03b488f787b509a7a784b428093a0e8d9f93ca69dce3fb3e8c7c93f49115a1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceEnabled.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceEnabled.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"925de58991ea6a68d9c098b206a34cef0cb4aa8de30aff5bc89a17f9b1747636"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceEnabled.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceEnabled.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"18f4c0d552c857f99f0a2d9db3af01f21caaf7467a679282c3cebd0e65f6615a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceRandomizePercent.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceRandomizePercent.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e5683bec5bf9caa50b212098a88730c509eb96b770df9887ad9d4759c73bb97"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceRandomizePercent.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceRandomizePercent.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"abe8d1f2c57d18a02aa5879dd0fd5c75153df66c21403c520ddfe1e73dbde941"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceStrength.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceStrength.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"57e8fbfa6463d163e03c38731bae828fa79771d9c40da9bdb6ed28c17981a2e4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceStrength.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2SeedVarianceStrength.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a4aa0e155ec4b6e69eace3cbfce0929788640a2002b4eab668efc6fff9a43c9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/MainModel/NavigateToModelManagerButton.tsx:3 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/NavigateToModelManagerButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b7d097a0166f7688430f6f5a874075d5146c617f1455be82157ed0335f332ce"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"efda189b6fea893e8afdf7de90c4cd87049ba5253c142ea83c460e2da7e2575e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e09fed6266b1dbdfa1b5e931b187f3178594a5587ce7932af8e25258cd32ccc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"24c76e0e1cec531295e793faceb1c19d33ad1632a2f6ffb768c0fa62e751355a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx:15 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"93b7119b6d3f332e1c3f861d3df61585da94053cddca6f95069c0464ec5de8d4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx:17 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"d10cb399a84bc392fbe9e8387c2847ad63ac9896bc79d4515debefec0cab8974"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx:18 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"84a1c1bb3681cc46b0cc212160cbd259e41fa9eac3b9b8fd421eab5ac8d77c8b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx:19 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"95e9c805e391999c60456ef51d46e2864d058bdeddcda5922dfcc130ffe01a73"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx:25 imports invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"d408c43834532246bdfe07b93c412c87838762b79ea94ec391c0e1c10e53e08b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx:26 imports invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"17521196f6a6f1d607401e94932e47ccd940192eb3151891e1c7cad9ec7d23d2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx:27 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d548193ff2d3e6b586529c558b2802c2feecd001cb25464ddb80b274df03371"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx:28 imports invokeai/frontend/webv1/src/features/modelManagerV2/models.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2059182cfde3aa97180128e464a0563deebde58aa6f9b788061834ab017fba2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx:29 imports invokeai/frontend/webv1/src/features/modelManagerV2/store/installModelsStore.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a1544254f344820873cb96984114e4f6a43f05ea88d3884475938c37eaf5f63"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx:30 imports invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelImage.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbd11ba3384672ed242b190d6b329f07eb895baff758f3c4fa6e25d786762dd1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx:33 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"656820eb6bcc245500612cd3b304b40fef48f6e8211212ac8c564b54b1d1d95b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/ParamPostProcessingModel.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/ParamPostProcessingModel.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3b0a9eaa7c70d828f5770bd544b4ab7433bae4abcc51f48f3882741fe7ccd7f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/PostProcessingPopover.tsx:13 imports invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/addAdHocPostProcessingRequestedListener.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/PostProcessingPopover.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3762c9e6f6048db55f373c1637241c9fec0eba0dad610d14a9ec063c8cedb2d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/PostProcessingPopover.tsx:14 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/PostProcessingPopover.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9566081ab1e03f99c68b9d4e832e439e2dcd85e208f2b4759bd86ced6c4bc2e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/PostProcessingPopover.tsx:15 imports invokeai/frontend/webv1/src/features/modelManagerV2/store/installModelsStore.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/PostProcessingPopover.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c06035508db192165a473a5f20783f2cf281b7035df61c78c765471a631d6b8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/PostProcessingPopover.tsx:18 imports invokeai/frontend/webv1/src/features/queue/hooks/useIsQueueMutationInProgress.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/PostProcessingPopover.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"951be78884fa30ef375aa29158d91725cca91d3a175c5679653a61aadb5763c7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/PostProcessingPopover.tsx:19 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/PostProcessingPopover.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"97f02472f65c9f21c28c610290a690631f1402176eb9b71c6eb58e88d0e6a35e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Prompts/Prompts.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Prompts/Prompts.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d33fbfdf994911d26c216790c8591d94df57a6b1f2f6b7e6f2ccbd0d5e56edbe"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Prompts/Prompts.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageList.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Prompts/Prompts.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccee08c63ac6087aa8456185428134063a99508ccecb8b1bcad7570d0c6a51a9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Prompts/Prompts.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Prompts/Prompts.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6960e75f53d531374c9c199af1adf96094045ca7d959af5a146ec885b4278dd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Prompts/UpscalePrompts.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Prompts/UpscalePrompts.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"47b4779ee6c080da1a5fa0953b1e0749678c954252932c96dfec45bd5d65cbfb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Prompts/UpscalePrompts.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Prompts/UpscalePrompts.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad255234f19c14c258d2a6ccd0784c971ded78b38b7e7fdabb83bf4ea76c1ece"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Prompts/ViewModePrompt.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Prompts/ViewModePrompt.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bc509fa83cc32e2a7e4edf49b01871a86122fc85f522ded863e9d8adcc31dcf"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Prompts/ViewModePrompt.tsx:3 imports invokeai/frontend/webv1/src/features/stylePresets/store/stylePresetSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Prompts/ViewModePrompt.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7ed68352775dd66fb08c1b6a6121e85d6ae65408e310846dd3279d0b6e2ed07"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Prompts/ViewModePrompt.tsx:4 imports invokeai/frontend/webv1/src/features/stylePresets/util/getViewModeChunks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Prompts/ViewModePrompt.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"1079b4daf14131e0617d849bc25a0fa5674cf55dd2f747e68ea0d7ca47fe9ccf"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Seamless/ParamSeamlessXAxis.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seamless/ParamSeamlessXAxis.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"67f4e3d6a9cb720931522a0902dff74d7c1789e98528abdb4ba7e0fdcbf1dc3a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Seamless/ParamSeamlessXAxis.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seamless/ParamSeamlessXAxis.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5d0e5670326dc712fff6e99efee5bc93661aa81d5d787feba69e62f7e48a0c3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Seamless/ParamSeamlessYAxis.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seamless/ParamSeamlessYAxis.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"c71bbc2415ef3630a49ea10a910a816c6e0c5fa19bf991a4b5d5943cd77b415e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Seamless/ParamSeamlessYAxis.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seamless/ParamSeamlessYAxis.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"30a6e732fc93d1864a6fc766a6f208032a72563ad4d94b7c36301133eba36ca4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedNumberInput.tsx:2 imports invokeai/frontend/webv1/src/app/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedNumberInput.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"63eb37e1e6e7b82a38a1c157b29774c953304547b91e221ae544d0f52a146ebb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedNumberInput.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedNumberInput.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"04664187bc18ac8dceb0913f79da2262ea8e19625125c7c2bb8757878071e376"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedNumberInput.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedNumberInput.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b15e7b309c6a482790757f88a5d4b3a6f0aa876622509911014ad4fd85bcc41"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedRandomize.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedRandomize.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c5db916d28fa51cfa0de8c5160f035a9119a93fbafedd8c0ebe73ec0e771132"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedRandomize.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedRandomize.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fe3cfeab589ba9d07099052a22c54cbe5fa69f8484211f42c3926ce9501f115"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedShuffle.tsx:2 imports invokeai/frontend/webv1/src/app/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedShuffle.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc8e75523da0871369446a275de061985b2f8dffa9289a9907de11bcdc9b33ad"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedShuffle.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedShuffle.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"754517d62d3109f723231ade5195a4f0273def3864bbf0ecfae4502c21ae023b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedShuffle.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedShuffle.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"9936c1ef2c733de6ac328b8f597eaef3453e06055ca7060d5b58a76641dfdddc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceEnabled.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceEnabled.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac00b2a92f25be5f95163dad5a5c1f65c43cc7c8f4560cf801c08c5ba38b57bc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceEnabled.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceEnabled.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"05354e9d71d3651c7ea7a76751d1bc4906a4b1a0d9a0d1666baf7cee01d0a7d5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceRandomizePercent.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceRandomizePercent.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a54b8440e32febfd7eb6fbb36b2ffda2be41bfd40862a6f054e270d90e427264"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceRandomizePercent.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceRandomizePercent.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c5361592b529077eeeab8a424c8828d295ff11f5a0cb1e344baf0e2648b019f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceSettings.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceSettings.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e589e16b2e8da55e1ae8ff648ad69d4333087abf1f645529ffeb399d859d164a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceSettings.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceSettings.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a48d483cce8ea00bf58b49e65e01745cd9214465aee88e80a9e22d371152d61"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceStrength.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceStrength.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"6aac2f9cc463ffbf3f0d5c517d9644154cef12d2f3b6a36b3d5d5dfda8bad31a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceStrength.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceStrength.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6e29f56cc22beceb08ecdc31f35d58af65552decfeb72ff45e3ced1a75583d1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamCreativity.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamCreativity.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5b0868903f52c07693abfce4bf47d75fbec2d210257e0dcc6af10414e4f04cb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamSpandrelModel.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamSpandrelModel.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"07066e36bd12c109be7e08e6bf0490a519ba9b20fdf0dac6c15fbf8e18c7e78a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamStructure.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamStructure.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ceed78babcdcb8a05b95da681994ebaeae7cd4c8570fcaee89fb851de4884f3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileControlNetModel.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileControlNetModel.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"e33919f0d938ce417d8dd88e5a5878b3d417887b234270448f2266acd8034a14"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileControlNetModel.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileControlNetModel.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"98dd311bddc8dacbfd83325972b6f4209b8834ec9e0461ca57205bb957e86864"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileOverlap.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileOverlap.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d3cf92757fb655d97e79aa6a4cf81ef32924fe743185d4737ce82549f40eb02"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileSize.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileSize.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ead408e6c41d82a15a8ad02a7c94446d24c1f80f188d44dcd6c9abd3605920f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleCFGScale.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleCFGScale.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"2043208b450a48697437e6f248504a3949d70f1cf40a135f46edc2d18c0e37d4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleCFGScale.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleCFGScale.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"c231c515df98f39270670b8268c8ce9ca4a593c22343bdccde21e71f41ab7aab"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleScheduler.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleScheduler.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad6e361563805c7e5679e6a31d9ac96dac60ee399799a3f7715e20b55d313bcb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleScheduler.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleScheduler.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e7680c92b22bf81bc8edf8f6088ce866bd33c7fb8e11210b13425bd552fd62f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamColorCompensation.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamColorCompensation.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bc7468398991faa24f304b45b1842f3ba3371ba00f6f5b3262374aa9f33571f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamColorCompensation.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamColorCompensation.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed5733f3bac9cbff24ba4fcf12f12a27e823639142d8468e9093e53854955853"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamFLUXVAEModelSelect.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamFLUXVAEModelSelect.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e05326c77f8519a3dfeb4563aba6d493b52355293c31350a4bc74c8f9c170feb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamFLUXVAEModelSelect.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamFLUXVAEModelSelect.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"423e9cfe3317f111df8e53099dfd6293a008c66fd2496f0de57808cf5f3c5659"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamFLUXVAEModelSelect.tsx:6 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamFLUXVAEModelSelect.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"1295eac0a0396b16978fcb59b157ff6f353ce5981ece5c7b94d9a7f976f88161"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEModelSelect.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEModelSelect.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"221aafe0ed8a32aa496b8fadac13e4ef7ecfbb43d3486ce5919367c27dd19e33"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEModelSelect.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEModelSelect.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c712232d7afad12948b714d6ffa9745bb349679392fb15aab1a1fd8fd6421c8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEModelSelect.tsx:6 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEModelSelect.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e6a183e23f127e8502b9463ea4b33f41c8853c8ebeb56984fd48c6201e013d6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEPrecision.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEPrecision.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f4bfca62c16f7ac1c772c10c062582655112991168d4a44c09c5c1ced290782"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEPrecision.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEPrecision.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"27664f33229042fd6feb2d7870d336777816398a5c739c6d06a843167d7ac990"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts:6 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"21a74398fd626ee3fd80f689b583d2f18491c15b617d2521e46475c11a3a4990"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts:8 imports invokeai/frontend/webv1/src/features/controlLayers/store/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e61219eeaae800cda7de3b36b5cf7aa69cec8e4e136e3bb760a2e7cf30891ce"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts:9 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"24caa5652f6635d30dba3623c304da4bb792be8d4dee27656bea20cb7e324f25"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts:1 imports invokeai/frontend/webv1/src/app/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bcc2dae3c4619964d0f8cc170b181d1fc9b3004a29d4fdefad54422eceb73a2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts:4 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"05090a75debf648facbde8306ccdcfe01bd8587e9739bfb51e429cbac06c0d0f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx:19 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"b34788227b2af480e7569519799ca2f234fd2b4c3528cd3f1a057f7aaf3cc8cd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx:21 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b7cc5892d6bf3fa515e970ab92365fc3a6a39dbc074b06ae8932031e828e2e0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx:22 imports invokeai/frontend/webv1/src/features/modelManagerV2/store/installModelsStore.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"1591ba480baacaa8ec84eff7e0b45cf3d64953c28e3ef606476b9e2c5e4b0626"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx:23 imports invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"88907a4f584c614d0e54af7a6236a3a56e51933732750508a33e9b3658027bfe"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx:32 imports invokeai/frontend/webv1/src/features/systemPrompts/store/systemPromptModal.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"761ddedfbc25a878809875ee652e0ae523aa6c09e94bc7b87ee5ee6bb351c40d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx:33 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"85adc35e48c04981913c1c9c30761b127c112452b4b912d52e0902d027857293"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx:17 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"3da55ce25e1576e93689b0a7a5145f2caaa0677d763411410c6a321b09108ad3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx:20 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"88e11f8621ed81ada44a96837664ab5d70783e1c787960816626335b4061f8b6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx:21 imports invokeai/frontend/webv1/src/features/modelManagerV2/store/installModelsStore.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"16063cbae4db99f34f62237bf735d0e3e9d509841cde596c5409e0c6f5ce57e4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx:22 imports invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fc3a92157eb5694282be60f14118d75d263775e4a28783f9b90dc72e347e100"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx:25 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"de7968842da9ce6317a9f2dbfd3025d1aa6a90bf96671463dfa7286833757ced"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/prompt/PromptTriggerSelect.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/PromptTriggerSelect.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d85de13d6ae9f5129b7ff9fb4e291c7fd77afabdb885e617cc1045cac192fae"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/prompt/PromptTriggerSelect.tsx:7 imports invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/PromptTriggerSelect.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"9940defb165be5cddbf93c0e8c627f0181cdd9828bd6e59a4af4f45c8201fcad"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/prompt/PromptTriggerSelect.tsx:8 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/PromptTriggerSelect.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3439fe482776409a92a9ad3fc4c501807fd8845f4af5bdcc7a51e19ee2be7ad"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/prompt/usePromptAttentionHotkeys.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/usePromptAttentionHotkeys.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e81a574df204ece45494f098b140230f0846ab6b847b4b9ecc16931953cd6e8f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/prompt/usePromptAttentionHotkeys.ts:3 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/usePromptAttentionHotkeys.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"062c53d2e7db39d378f59a8c104ddb00d980578d37860c73df2f5353b2c907f3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/prompt/usePromptAttentionHotkeys.ts:4 imports invokeai/frontend/webv1/src/features/system/store/systemSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/usePromptAttentionHotkeys.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"e002a4df0fbedf2a74aba7dab5c2b1f3349e0daf293a683833cc7c4bd07056e4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/components/ClearModelCacheButton.tsx:2 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/ClearModelCacheButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e207342788d6fbc0e20f7d439e63bb05c854a006ae8b3057f3f4f3c72ea75a5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f622eab3ef91381d018b90d28406d40cbc775619af39b065bb12c09033a0f69"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"48e46a08081b3b09379b73bfc8d79a3d205fcbfea6b90c3692f44dfe19ccf9db"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx:7 imports invokeai/frontend/webv1/src/features/dynamicPrompts/store/dynamicPromptsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"61433331bf74cdbd868082c785a208088fe4fb321e7c80299aef3347421445f0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx:8 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"66c1ad149ceac13c1bd57980c9a71b6d147f98cac07b2aa7547310db957a5be0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx:9 imports invokeai/frontend/webv1/src/features/nodes/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"d53df068c3c41760552fa23831da80e660359dfa46c6ee8c341b24b8d7211085"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx:12 imports invokeai/frontend/webv1/src/features/nodes/util/node/resolveBatchValue.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9de63f0ac3bc1a6b46f0e81dd967eefd2e0bd8db26ff102021aca331b03fd12"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx:15 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"e29aa13bf71de23420af619795663ef1b0f6b079b6986311376765428f1611d1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/components/InvokeQueueBackButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeQueueBackButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"89ae489821e0967e74dd89d0828d7860dcf188ac71cd4e18872febfca2a58f2a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/components/InvokeQueueBackButton.tsx:3 imports invokeai/frontend/webv1/src/features/dynamicPrompts/store/dynamicPromptsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/InvokeQueueBackButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a020d16bc5bed77772a8a95c0ec081c89ffd0c0603011d3a53ddea36584655d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/components/QueueActionsMenuButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueActionsMenuButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d122cd249340e6caced8d3988e0a652798617103b5568ac270a63efa1267c35"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/components/QueueActionsMenuButton.tsx:9 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueActionsMenuButton.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f6f0330ec6437fd022e10c45afa489a9bf1bcb69a194f06d953c99d6820d6a9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/components/QueueActionsMenuButton.tsx:10 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueActionsMenuButton.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"0effc8daf64bf45cdf93dd14946b70ad716efb3c0e17b3ee3ca96f42000e16a6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/components/QueueControls.tsx:5 imports invokeai/frontend/webv1/src/features/system/components/ProgressBar.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueControls.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bd522670fe88cb32c5f77dd04ced0a5736fd90726a35d7563e4ea80453855be"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/components/QueueCountBadge.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueCountBadge.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2288014929a65ce2dbd741a17b7a649015696065293e0374fe98df68f4b261c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/components/QueueCountBadge.tsx:3 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueCountBadge.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b74ef99410b0b751b2103b42c5aac7a438a811146b8880e1e574bfabb4ac8b5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/components/QueueIterationsNumberInput.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueIterationsNumberInput.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"7188e6992d4c5363935d9b620d35cf610fc0f77fedd27176b53f36581ce42ede"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/components/QueueIterationsNumberInput.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueIterationsNumberInput.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"38acb20bf4c505f5fd3320d5ee8f7b2619f04497cefef093ecc7a1405733eb0a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueItemComponent.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueItemComponent.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"4343de675974bf4d870141d0e3a130dc5b5f27783e0083447b22b662ddae396b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueItemComponent.tsx:5 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueItemComponent.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"7869151c752da862471f72ca5d0a0543d73a10291a5c9d0cd60bed256037fc39"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueItemDetail.tsx:3 imports invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/DataViewer.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueItemDetail.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee517c9641828db321b9d3dfa16012a5885d5b1f895d6fac792cb14e75345e59"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueListHeaderColumn.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueListHeaderColumn.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"24a79859d20022838f4c33f2e30a54ad6f8caaa38d59353a1181fe2df2f15358"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/components/QueueList/useQueueItemIds.ts:1 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueList/useQueueItemIds.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"90cad780eb6ee1537c25a474acc6aa32c5ba0ec757e873811539249fa4083097"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/components/QueueList/useQueueItemIds.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueList/useQueueItemIds.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"8285d84fa9906877cdc30223220f2bcb3f484267f42e5b927c0e0308db457382"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/components/QueueTabContent.tsx:2 imports invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/components/QueueTabContent.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fc07b2dd0300fbb0bf22095d57c21d86f0e6a1487a9c709cc6c07e0a17024c1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useCancelAllExceptCurrentQueueItem.ts:2 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useCancelAllExceptCurrentQueueItem.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"a187ccad9b72db520d69657c7b7d04c4e3bac77fbc921d866e350b1d141ed8e8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useCancelBatch.ts:2 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useCancelBatch.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"8db12f40690abd58870d16076708f12d5bea679ee9141a7db247adcf16a76ef0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/hooks/useCancelCurrentQueueItem.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useCancelCurrentQueueItem.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b023165bf6c1d3c71a9427595817d1ca9adca9733514d03e33d16f6b40a4c82d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useCancelCurrentQueueItem.ts:2 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useCancelCurrentQueueItem.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"541d86aee69e710da263aaafc31d37b722e979daae27a8788e358f5e44f5a737"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useCancelQueueItem.ts:2 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useCancelQueueItem.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"3925ad72cd906481c6d9a21f0cf68f11ba72e6934cb39ce84b4759475ba94910"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useCancelQueueItemsByDestination.ts:2 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useCancelQueueItemsByDestination.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"bad34e015666cfb36cbbaa8f44a32822412635ab30f57066487a5866fd3b952e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useClearInvocationCache.ts:2 imports invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useClearInvocationCache.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f418bac5a582f2cf880698daba298f5ab8fdea14118563a7687130ca636bad1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useClearInvocationCache.ts:4 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useClearInvocationCache.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"249464b35e5e3ee3fc2390894c3524d704373c32e8e17589eb4433b2de2af628"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useClearQueue.ts:2 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useClearQueue.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e082683086196ea91f8d70ed41e3adbe0be838bce271f0eb6c5155f76e654010"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useDeleteAllExceptCurrentQueueItem.ts:2 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useDeleteAllExceptCurrentQueueItem.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e46609f3b57824f6a07145a261c5f383ea7bc1c71e857bc083714e7f6b6b4962"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useDeleteQueueItem.ts:2 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useDeleteQueueItem.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"99b3350505f586000a059df61a548c3bf822d1643570e775309ce15f7870e085"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useDisableInvocationCache.ts:2 imports invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useDisableInvocationCache.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ca023961a3d5769ca4de18723a50b51980d7a6b751e2fd9b64695a0ae063b5c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useDisableInvocationCache.ts:4 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useDisableInvocationCache.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"0404c7d7259ec73afb8ac5135fd4f5d45fc114120211bba1683acc3ebc27d66b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnableInvocationCache.ts:2 imports invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnableInvocationCache.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"3db94fe22d36449e777749e96aacdf1cd3ac575133f8113d3b0b388b6cb1ce12"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnableInvocationCache.ts:4 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnableInvocationCache.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"88f3d7ec7b25d9358101d341ea28ece7b7838c8efce58931f8d24378bb9ee0ce"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:2 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"24a047720ab1c9371408014c2bc6b5a8e803ae9d62c7bdfeab33202631218da9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"570dc838b5d14ba18174aa147144e24ba7173f0bee166ba4ce5836e90656a1f5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:7 imports invokeai/frontend/webv1/src/features/controlLayers/contexts/CanvasManagerProviderGate.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a95cb7792e270411a25948ee3854c7c57325c6875186f9c59b9f1441723a65b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:9 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ed740a878fd8b71c9831fbcac5768313bd191bbc7c184f58364b63d4d27c68b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:15 imports invokeai/frontend/webv1/src/features/nodes/util/graph/buildLinearBatchConfig.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6f465d1fb15b8b4648e7fa9a669fe5f6837abc366f2c6f2a03ca62cd4b8de00"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:16 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"218210c09c31289677168a167182ee271188a116e25a804f5ea9207f0f623ca9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:17 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd02e463c971d83a487ab52a4545854ad7f990f0c4139670df3dcee9798d2381"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:18 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d9176d81c7a88b016d58454c8a2cc5ae62c183664b22119dda46307001a5f61"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:19 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"619f4a4db728ff1529f25c21e3e3c7a6e15c3efee64ef75d73556bd935f21f9d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:20 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"e36c7278344a61f1bc1d4545e4ef68ce3152a0a23dea9c23653111b7d14846a4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:21 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"febc5cc6f4318fb6600fa2f1e1e9bfa6e8538f6f84d61e4193dc469115f9409e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:22 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"af313b5357839cdce8d83691ee5a70d0ba4398932b6346e40c56fbc458012329"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:23 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b97d5d26c91c77a326cde368ca280efbbef469911c2e10825b1ba8919285bbd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:24 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7b2fa048b78b4e9e3cc548de9367d1adebc10e913419fb1e4af911324156a05"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:25 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c90c9df73ab32e05de99e2dfffe3bb0b3bcd0fde8456ff3aa04625fb9597b5f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:26 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"34d968668eda755e02dbcc62b65234941a4462808257a0b556700f683f1552d6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:27 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc2770c80b0e1ccc29448731bd129d480af4deedd05edc0206ef962dd700fca5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:28 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee1eff6d416fabc2303e0118cc7de9d852aec09f197c9c32eb21a03a0119adb3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:29 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7c414998b2c84178e174eb1defbc7341fb44f5621441a0b1f417725bef6c64a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:30 imports invokeai/frontend/webv1/src/features/nodes/util/graph/graphBuilderUtils.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"2740b6eb1cd4bc07fe7573f6d85fed7814211f830512db2718aecf71e7c65c95"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:32 imports invokeai/frontend/webv1/src/features/nodes/util/graph/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa560790127b1740aa50f454d4bd3e4a91697537d41a972dddf99d6fcc2113f8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts:33 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueCanvas.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d16240b706bd07a9f0fa24129f87d83a41b2f70260c3621cef2ec738501fc52"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:2 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"65a2a0e94428e76795f08c98a5a6e7ff1b49059d2cf9baa7ecafaa0cdeb80043"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5f3ae72bdb316187b88d31ebae6b2034855cd148daf3610f9738cd75fdd94f2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:7 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"44ad178c1ffaa718f87e6c80d2d7632a239d44ebdc758c2b87172c979ffde190"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:13 imports invokeai/frontend/webv1/src/features/nodes/util/graph/buildLinearBatchConfig.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb1307e176057dbdedbb5f883eaecf0c312305a34f9594d52ff85b50ab632312"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:14 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildAnimaGraph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"2aaef7eaffeea496701839d8077ec63c84a6e957c790c7a69c2b57d4faa4065d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:15 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildCogView4Graph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f9978fe528aaeb4c2c2e5bd5b64266ace8365b470726ca0e3c81a462ca1ec9e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:16 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildErnieImageGraph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"9afa895146b4c2cbd3c75695c6e034c887a1e86cb68dee39c64e6eae2bc248ed"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:17 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildExternalGraph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"29140c28ac3196fdfd0149488707ecad4d71d0abc1b51d59a2835918a9ce97ce"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:18 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"7faa7ff355b686d7ba7480da4822931f5a171867a75cac484fabbf2422486df5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:19 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildIdeogram4Graph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"49fa837c5e2871d250a416d894cb1944c9e7797b911eb28c8a2be51d49a18d8a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:20 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildKrea2Graph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"866a8d14e459139be4559b51e015cb18cdf7c6a7f5756be08ff75cef6dfae26f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:21 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildMiniMaxH3Graph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba3f69a16a94f2ee4a079ef5b27b8c23f435d1f7b305c7dce4ceb5a55ee9c1b8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:22 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildQwenImageGraph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6a0a81e43d396854665379382193b3558ed49ac14097b4bf9d1f811ad6ce601"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:23 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD1Graph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"26b3b0398453f7c487f561e8a56612820fbaa40e3c2e0fc83334cf413da7c119"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:24 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSD3Graph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"55309d57fbfe129fe92440a18a7c5edb7a4c5b430eac4851eb6ab0aaae44b822"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:25 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e1e23cdad27e948b6214e621efc1f5f996ff8debd55f4767cae486846f489d8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:26 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildWanGraph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"3811928719c32efeb2e46a8cf178a544d3de7ac71ed500332cdc937340e6849c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:27 imports invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildZImageGraph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"6768be0632858e50f9e367d79d635c34c2fd5c51d59dae3a81f456aef2e2b14e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:29 imports invokeai/frontend/webv1/src/features/nodes/util/graph/types.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3d922c256a6ab0888ff6205b822a73e9cbbc89303257e00c1f1df6925d94d7a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts:30 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueGenerate.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"38e4d25b35cd746df4e782389a67309c38997a8a5a7a72cc5812ce4c5b372c51"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueUpscaling.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueUpscaling.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1b344bda0f32e8278e0fc7fcb46250e0153014bb145c8f80d1d977a08ce0c92"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueUpscaling.ts:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueUpscaling.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a651e4e0998ddc4f0117d32c5919eb7d811b3f54761417ce75e233d85fd926d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueUpscaling.ts:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueUpscaling.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"5879ee8cd0dc5b65cc116cf062a28592eeec7912ac37577f7ab2ead0dec9bd97"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueUpscaling.ts:10 imports invokeai/frontend/webv1/src/features/nodes/util/graph/buildLinearBatchConfig.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueUpscaling.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"8db8b8e6ebcff10b67e1027777562ff3e5632920c3d4b94f883ab5f44c0fa841"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueUpscaling.ts:11 imports invokeai/frontend/webv1/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueUpscaling.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"36598d9b41188c3dae0a62099fc2dd143ec7a3835112301baae1f0d46a23f882"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"98f39da8b35658fb47881c5cd55ca34e6fbce15654de34bf4a276a95db18f08d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts:4 imports invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf80f09bacc3d19f5668ec6f4f71fe9b8b04c276fdc659a584b9672cde1a43b1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts:5 imports invokeai/frontend/webv1/src/features/nodes/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"e484e76d609d86b262858c61ccbabcc85ccf93d8179ce9e6016e94dc47f7c5ed"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts:7 imports invokeai/frontend/webv1/src/features/nodes/types/invocation.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e764fa48a495b62eba3ec4de8b808d3ef987a475cabb5172e38e0a3876e45b6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts:8 imports invokeai/frontend/webv1/src/features/nodes/util/graph/buildNodesGraph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d04908f376205cb4d27022461ac3a75baa096dc000df8fc6bcbdb78d9a4fc24"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts:9 imports invokeai/frontend/webv1/src/features/nodes/util/node/resolveBatchValue.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"7251dacae308ce160385de5f4a60f7eefd9f00561eaa98f6530eaddae4d82b6a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts:10 imports invokeai/frontend/webv1/src/features/nodes/util/workflow/buildWorkflow.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useEnqueueWorkflows.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f3fb791cfc8c5cefa69c3a400a6414defc0503a94a649247b5fdec3de5354e5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts:2 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"35c415bce8ce47e0bee1b041e577baedd31ed1565538867440ad52db341f4528"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6fad2fa140b1ebe0ccf368bc8762d7bbfc89c17f42d95167b975f9ca2501de0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSettingsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a18727d379d2409d647cafe62cc3136b06ec76b74e965e95f88417bf1f24ad3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts:8 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"b57a2f4a8e579c43fda0015952ca3398e209895da0c8954bd65a2d582b868192"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts:9 imports invokeai/frontend/webv1/src/features/ui/layouts/shared.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8619c86d16141a76c34454561bb9a1d034d1003f9df6f3b9289f9148d408dc8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts:10 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"e14e033826f33d40da5e9bb6d603b31671fdb2f85170267021761fa2ed115e09"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/hooks/usePauseProcessor.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/usePauseProcessor.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"0460321b2da7a40b6c3236fc676eab0961accd09547c75ab90fa8b193677aab9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/usePauseProcessor.ts:3 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/usePauseProcessor.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"71379efe253eab1e75021bda17c95d3412066ef82fe536d5b01c601a0647b4a5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/usePauseProcessor.ts:4 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/usePauseProcessor.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcb0fc73204deff298adcf90966ad3a07da6414f1e4499a706302c85eb300d02"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/usePruneQueue.ts:2 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/usePruneQueue.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"70af3aad54c397b39180c0a283025376ec4d45b6235906413e757da0ef9a193b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/hooks/useRangeBasedQueueItemFetching.ts:1 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useRangeBasedQueueItemFetching.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d44107d850c8c39e11bc64401f810e9cadd11ccd6cd69a4e3c3b1617252c1938"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/hooks/useRangeBasedQueueItemFetching.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useRangeBasedQueueItemFetching.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"022387d908e99a2c2f703cb597b1f5b20bc0604f4e8412fcfbd0f561b6d93c16"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/hooks/useResumeProcessor.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useResumeProcessor.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bedd0e12e308e077d661496bcac06b9903d97eecbd46f3bf460de8135cf3839"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useResumeProcessor.ts:3 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useResumeProcessor.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"edc593ed97a43ea9ca195041e3a26d4fe148fa4f14ac18b39966b69fbfe4cb40"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useResumeProcessor.ts:4 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useResumeProcessor.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"f24bfb987b40440ffccf722c817a20b74f51f17992fac2d60464f8ca9f16061d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/hooks/useRetryQueueItem.ts:2 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/hooks/useRetryQueueItem.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ab63a633a172852a4c120325f0932183dd94b6ebaedacd3f21bda23b1b64f66"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/store/queueSlice.ts:3 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/queueSlice.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b06abca842cbd61981c42fd17fd01867b97a78d7cc5a44448ff224a6fbd35e10"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:3 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"39d593f2143d9d140acbb54daeacb50f4452a4a2a09bcae8b13c324007ba77d0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:4 imports invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/wanComponentSync.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"c653179d475483bd5414d441dbb6ca0b1163fba63b728f5143b58d4e7cb99881"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:10 imports invokeai/frontend/webv1/src/app/store/nanostores/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc7576e20b3b2e91ef0373f035a03fc8fe612a3264d6211405cf02613fe14a97"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:12 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"207bef77a15a873c9b6c42b0fc240a1ad0406d55deaa0add9c004087a46a4e90"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:15 imports invokeai/frontend/webv1/src/features/controlLayers/contexts/CanvasManagerProviderGate.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"372410341018623df25fd7325cec73f9978053adbe313dea21071fba40ee6305"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:16 imports invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"987fd8edb5af44119ef19b674ca3807a107e624b6549f6f3f308641ffa941912"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:17 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"9603c7ab2b10ebf35a0bf4e34bedd51d94d7f611324937ad7693256c1acb4923"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:22 imports invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"7048595303da311527136d841b52fed4ba304956277c6b6ca6da6f4077de9814"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:23 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d2fed5b8c1ae6943484c9cadc7e1f26369cf10597f89d40fdd903c8a64157d1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:25 imports invokeai/frontend/webv1/src/features/controlLayers/store/validators.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"52eec54db11e8e818e30f26ec72eb44f78b97ff1f7136fe6590e9365d23a752d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:33 imports invokeai/frontend/webv1/src/features/dynamicPrompts/store/dynamicPromptsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"00158936e04a2d62d4bbf49d703b96dab7334e933a4cccad443d956b56bca3a3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:34 imports invokeai/frontend/webv1/src/features/dynamicPrompts/util/getShouldProcessPrompt.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"836a407beed17527dc7974d75d3cd122b203f36f623ad1184a5dbb9edc691012"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:35 imports invokeai/frontend/webv1/src/features/modelManagerV2/models.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8f62fa135be42d9dec39cae24e79782f6efd95e7e9d802630707d1f900dcd62"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:36 imports invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb9d40838d8d714c6adb81ea2e90ffa9ca2a1ff4a9c3914d27f34a2206ca8e98"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:37 imports invokeai/frontend/webv1/src/features/nodes/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"9222e58fdf986eef3aecf0dea3938073e342b91feb0be3f7de50e3409b1ca2de"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:39 imports invokeai/frontend/webv1/src/features/nodes/store/util/fieldValidators.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"c60737f37a095f04d0cd8e5179c5bb36cc28f21c371ce9a7f2233a95685f55f1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:41 imports invokeai/frontend/webv1/src/features/nodes/store/workflowSettingsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"827d2e995585888b6eb0236275444a3ed0a2747df29df92c6015834c549ab081"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:42 imports invokeai/frontend/webv1/src/features/nodes/types/invocation.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ce546b4648dc8f491ba3114ee746cc782d97086659436ecae834c2e24018958"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:43 imports invokeai/frontend/webv1/src/features/nodes/util/node/resolveBatchValue.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c5060754cad70a1a444c3a539ad813e8bcce7fa8529b86a2d5d538c73bcd12c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:45 imports invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"838a10d903cd14233e0d0bee3a2de9b591b0f18547f1bce93e093708427656d5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:46 imports invokeai/frontend/webv1/src/features/parameters/util/flux2Klein.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2315321ae56ad1dde1c5ac69b54b43d7125e4815d6945e6ab4b05ff9ee65f8e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:47 imports invokeai/frontend/webv1/src/features/parameters/util/optimalDimension.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"3df657af202bf01b4d87d6fdcbede82f01303de274a9244ff6e2cbff89601bb5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/queue/store/readiness.ts:48 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"e13bf3e348f4fc3ec583ad18552a247d3e493f320bc020953720998e9f92a94d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerCFGScale.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerCFGScale.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6c3d9b8862db2db05f438a8aa4165530bf0a72095384f2409959dc399b57852"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerCFGScale.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerCFGScale.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"de38d8635660406dd516d37cebf0bb420286dd0bb90aadaaf9722b9c100cff78"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerModelSelect.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerModelSelect.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"059af4a6f6ce58ecf4691eff85f9a85b9d69b5e3a400a8323cb7b1bda3b606a5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerModelSelect.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerModelSelect.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"85b9cd0585357a99f372dd377c42e44884f7e2287c642ec8412bfe9387260b13"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerModelSelect.tsx:6 imports invokeai/frontend/webv1/src/features/nodes/types/common.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerModelSelect.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"873cf35be8851ee9f37e780286d61628a9fff8819a97a93b8a0fe8c652ad15be"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerNegativeAestheticScore.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerNegativeAestheticScore.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfd2d2a520bdc4ef497b4d938e2c6cc053ee2e5b81e3cd5d392a1b7abb09d46c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerNegativeAestheticScore.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerNegativeAestheticScore.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"868f3b74e71add674c6a95e1c7f7cdcb80ac766389511e68a4a834c8856561d8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerPositiveAestheticScore.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerPositiveAestheticScore.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa902748cdc1a5166f7accff3a64edc4d43d32820866bf76cf9fb2d1ed724303"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerPositiveAestheticScore.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerPositiveAestheticScore.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"91ed7d9806a421a59d42ef6ad33c8f2779f83ea135a7859bec2d17cdc0ccfe1b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerScheduler.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerScheduler.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f7f7c8e9d558240c28bbf2be265a4c2e6eafd08e4b067659c2341b5d5f96929"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerScheduler.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerScheduler.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c0dd767cda0f84c7864ecefd9592b8afaf8c3e52d7108689c165537e3467758"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerScheduler.tsx:6 imports invokeai/frontend/webv1/src/features/parameters/types/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerScheduler.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fccfb755c63fd8e4578828e8f15569ab2266bdfa0bb0954d900651b69da882b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerScheduler.tsx:7 imports invokeai/frontend/webv1/src/features/parameters/types/parameterSchemas.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerScheduler.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"f428e16d6613d7026e9edae51888762d7113686d16747d883aef0f1325163f1a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerStart.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerStart.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb4b1186e7dfbf98fd57b244120cdbea1b33b05ba5a72970cdabfbf171f9b719"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerStart.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerStart.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f458a36bc28ac66155d1d71daf98b9367fe8571319d0ee532ba10b8e7c1806f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerSteps.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerSteps.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3b80572297e93c08bf2246fe29cf89411296d603cacf13ebf3747f5a42ea30c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerSteps.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerSteps.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab76eea43190bc1bcbaa6a294b3f43c89ed1f2442eaddd8e9de6b3190aaf7f6e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:4 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ba476b851bd412f0ee01babc1796cfc164f256fe375dee26d905ff8194599dd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:5 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ae2d5eb27a15f62d243056fa78079fc7c22fcf61ea78c92e87ca7d1af3bef9e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"0961adcbe21bcca2f0dda51949806a06f8d06fafb2ec048298aeb7354dc8ae7e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:23 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c1b8b12dfe1e8bd4fd9c9e8e3ac6454baff4220c45cf49a50ecfa12288532f9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:24 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCFGRescaleMultiplier.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"f37a7a08c1dbef36663b8a6e95323fecf0cee9be897090d028196865f5277021"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:25 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPEmbedModelSelect.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9fdbb7fec61aff6857edd4c9ddf9cc0839b98ef2c6e6e5615ee8bf0079682e3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:26 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPGEmbedModelSelect.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"be406eadb957cbb391f90578e77325349fb875f9ffc7b26e9b429eff8929a072"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:27 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamCLIPLEmbedModelSelect.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"91d51dbc4320f3d524475d9af3039e130f93be5fef4b932da61f91b26336861a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:28 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamClipSkip.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f9f9e14c885efa1545c35a264705727a33da3c7012a85e8e4de5145cdd81011"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:29 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d5d27bdefb1d475f86d6e384f161f375f6e2018ea627e51459424fb113295d9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:30 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e59c4db667d23ef0b8306147b7896a292a09b271afb5d744a750347723007f0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:31 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamHiDiffusionToggle.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"a68cf7cca1cd208a5463dab9b0dea9d855838cf16d49d268c95586acaed10fb3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:38 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamKrea2ModelSelects.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"10c07872b774185b6610d4d64a877b7eb6b6dc20936b44eb1b323a6d785cf98d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:39 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamMiniMaxH3ModelSelects.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"376f37ef5703fca361a99fc83717b4b9e970c7c1ef3ca96e2129042a47214111"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:40 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageComponentSourceSelect.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"c542559cbd6bd6b425b7dc50ea43aa2eccb89a70c0f8186cd8098bc8fc0c9f60"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:41 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamQwenImageQuantization.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"d55787217c90ba1864d6c04424301cb193a3705a9dcefc36eefa663c55b99dd7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:42 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamT5EncoderModelSelect.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"3de33875d0f3cade7fe6ef6960c90c5baf8ea94090f92267c5ba9f192d625676"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:43 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamWanModelSelects.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"9590ff3fe19103ea48723328657cb0a51bad1c29e923e2360535930a753ad35e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:44 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamZImageQwen3VaeModelSelect.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"25c38542b925eb6cb48fc8f1614311edffb7009f588370388bc7cdc597d0a4d5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:45 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImagePromptEnhancer.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"08d0b493929d9255e86c7b0c81b8a6e4d624ea8285c4ef4425653c2d1027f4e8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:46 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4ColorPalette.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"2583edc65efb08fb9500d9539317abbbd252a703523f21535953621fa483b978"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:47 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4GuidanceScale.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6ea6b0195dddf7676185ec6624bcd418e028846e42b8c782dcd51c4bacff1fc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:48 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Mu.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"30bf52eac63e26aed33bdb2fb4ad977e87c88b20f671e35f544f5cde4abd2d09"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:49 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4Steps.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e46957c701f4ccfc08b8c9dda9a93993e2b5da129229c8271caaae03712f1b1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:50 imports invokeai/frontend/webv1/src/features/parameters/components/Seamless/ParamSeamlessXAxis.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"86a99da79d05ad34644aeebebe8f5b8b89824b1b877107ed4f7b2130b7b64a10"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:51 imports invokeai/frontend/webv1/src/features/parameters/components/Seamless/ParamSeamlessYAxis.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"b12b8b709d3fed4667b08379d7cbb95aafe794d3e8c9ad3f7c5b6df09fd20297"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:52 imports invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamColorCompensation.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"3687b4763bdbecb2a6b5422fe6497f99742460bcd7ca6fb6b5e2baca0e66daf5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:53 imports invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamFLUXVAEModelSelect.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"e53ff96fea27a56f385af8d3e22d5f2e553ad52b29cb011b00ed5d509c720295"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:54 imports invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEModelSelect.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1204f3ea8fab28b2c3b3c66eb08db6dd41c1d5932fef92fd833ec230f043479"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx:55 imports invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEPrecision.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6bd2005a661a6fe1a4d81bca82b77c0d426c940e9a6485e42ba7e9cef428e92"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx:3 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9981bd45568e3923667bb497cf6262edde6d22e222240a01c8d4bb5e546973d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"0280219f2b335c51cd9ce9fa4adbc600becc55e1aac904c4927a2df5f509f49c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0eb0923a190124df7ae30e1f9659446de704137c0d860226edfc0e2632b12c2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx:6 imports invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeed.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea89de63f699b684fad27e1d1a190768d3fef9e9cc4fc5d50b9b2790c68e12f0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx:7 imports invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileControlNetModel.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba2f3d6278bd3adaf7eda2425bafab7e1a34d0c2f8f3d37d7d7ace782c8c523d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx:8 imports invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileOverlap.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"01fa2c9620cd8f6ad0428e889d7c5b54aa0c378f8658fe7fe0400fc9fde60d47"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx:9 imports invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileSize.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbdb757aeb48d58f14e45e7feb743b5f50c09867279a407e30bfe251044afaf0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx:10 imports invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamFLUXVAEModelSelect.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"81ce0d346dd0d71b12d593ebcd4e25373c89d8f15ec6c90dce840d728d0587be"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx:11 imports invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEModelSelect.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8220e6efd43dc6694c6a7c71029549c0d9cf0c181bdb0e22fcf6dbb2fa63693"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx:12 imports invokeai/frontend/webv1/src/features/parameters/components/VAEModel/ParamVAEPrecision.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"05febe3ee4901fe76ad5ad6fb8850c05928f8f0b1d6a5f8c4c7bbe9be730edce"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx:12 imports invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceEdgeSize.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"68d53df0010fbf383d745b416d141f091c9dda8d1f1850a043848b196bd1f722"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx:13 imports invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMinDenoise.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"79cacfc9fcb986cda50e6a5dd8a4190818d6ffc6d307628978734f72e0c8ba7a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx:14 imports invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/CoherencePass/ParamCanvasCoherenceMode.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"d51314fbcfba7af3632553202508988f72371b33f6df9143ddbdca5d88a28cce"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx:15 imports invokeai/frontend/webv1/src/features/parameters/components/Canvas/Compositing/MaskAdjustment/ParamMaskBlur.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"25b3ce8c2ced36f71e1d82f51d4affe248c7622f68eda7bc2411228c066a6d88"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx:16 imports invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillMethod.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5e40dee7129dbd1d6244ad7862db50d9fc1f8b3775c7f7653679967d7ad09aa"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx:17 imports invokeai/frontend/webv1/src/features/parameters/components/Canvas/InfillAndScaling/ParamInfillOptions.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"80b77530bd8aaf24776ff17e95ff1aafbf51ff7ff932931d9de71cf07c41ddb1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b01fbde83b3850d0fd0eddcaa7892e49c310f7542418c365d2ee3dfd20605b6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"64dafca4b3dc5df127375ebfb8a47be9911d74913c8aa01e3ab4557cdef169d0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx:5 imports invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelImageSizeSelect.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"b30df50cd6aa6e8194690a49720a50c85ab08de9c543d61ea69ae3a427806838"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx:6 imports invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelResolutionSelect.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"55ff2d56f2862436ac0311988d890da7e59d8686d1a90068c00baa7c6b33e8c2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx:7 imports invokeai/frontend/webv1/src/features/parameters/components/External/GeminiProviderOptions.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"23c339d270df2ec1ad3210dd593e06e3ec00dda61ae20c696dc16d791eae7921"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx:8 imports invokeai/frontend/webv1/src/features/parameters/components/External/OpenAIProviderOptions.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1f480d721bf195d1589b2d09928c95e1a93d31f48a7e553602777f649ff7e85"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx:9 imports invokeai/frontend/webv1/src/features/parameters/components/External/SeedreamProviderOptions.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d316446d7c73c5821016b8785b37e86fa0b41a7b82c095dd764ba056cdb8bc5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:3 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"76536e069c2ae78b02b3b5d09adc961a4dc89fc045ec083b2295731ef3c61728"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:4 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e0ebe688de59a7cad7718c5772318fdbe46c20c266cd08e5acadea0d3127b39"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:5 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"daf580cb4189480afd3851c4a6112a8eaf216d0fbbf79b30e579ffc2cf7504e3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"434349ac89787cde170cbfe60dc02dd85619f3b42486b23e96e20075466ef1c3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:7 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"319d692bbc2d4938dd51420ee66c6094629bfedb8d412ea00a204589e080ca5d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:25 imports invokeai/frontend/webv1/src/features/lora/components/LoRAList.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f7ec5defa7a08edddde3fa4443414a18a2556c8ae929189b7d3e39aa53d5b03"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:26 imports invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"edf922a89735973a9b1516371d4b8acd7d6610a1f72af902ad4ab5fdf63ad93b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:27 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/PidSettings.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fe82ef481a48f1b7632569ee1b35f7d0365f829a5c4df776698313b540cf957"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:28 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamAnimaScheduler.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"38e56141f59bf160a51449bbd6d715ba7d654b891e6815d64fdd68008f4be73e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:29 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamCFGScale.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"e70697b8cbd8b4fc374ed7eacbd4048ea0fbd493bd6af038bb675381bd444e13"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:30 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamErnieImageScheduler.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d35470c699715758095105c070aa15f42dcd0f6998e35513d41b61557f6c06e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:31 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeExponent.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f6b8c794ca1120745dc675825971937accaa2ec3543458317effa70387ccd33"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:32 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypePreset.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"82ad9b40d8d6aceb39ae84685fc4058143b7b587ce37fc7e669950ed7ed83011"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:33 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxDypeScale.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1ec6713fe08003d4f58bb61ee889657aa7575d1e1fd4c0b2286f89f91491485"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:34 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamFluxScheduler.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"b68cde659cf3f83f97ab2685179cb0db9d7caaf107b4d28c6aa2272bd25658e0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:35 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamGuidance.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"b21fad7f0bfae1e90a80ba3c117bb0f749e42fd3d8b093ef46757003fcc0182e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:36 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamIdeogram4SamplerPreset.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"fee5ed65a787de00f9733470aa27aec1c0c78bd7f5feb74f605841fb803d90e5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:37 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamMiniMaxH3Duration.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"acadf39d6225ad1761962feb966a933626d9492a42e1f6c043d3f1c172d6744a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:38 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamMiniMaxH3OutputMode.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"97da1547a037770d41f84523486a1cb17264feab77fdeebc367dbda33067ccae"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:39 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamQwenImageShift.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"e282ad93ae87b7f2232569f8fcbb0510c11dfa8f3c3b4fbccec9c4e657bd068d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:40 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamScheduler.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"521baff98742835fdb3c9fffcc03740e0021be69eb05442cd44aaa404bf1763d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:41 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamSteps.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfc5b84ca97d6f38f71294b7b1567704335c6e48fd7bfddf4e1eaa9c1def215c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:42 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamWanGuidanceScaleLowNoise.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"a52b7fbf2576706cfa67d5974c53e2ca6c13cd9d5fe8980fe9efb22c99c9f1db"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:43 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamZImageScheduler.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c57e26886f09396beefebfa5b091d6fb7ca9911431c6ff3ac43075ed70c2e9c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:44 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamZImageShift.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"84b063cbacda607ba5c2618fa493e58bd6a70809c02673932d84259e44ee6e2d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:45 imports invokeai/frontend/webv1/src/features/parameters/components/Krea2Enhancers/ParamKrea2EnhancersSettings.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4a2191818d5f417cff0b184331a928c77c23d96fc2739236c378403baf2f9f0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:46 imports invokeai/frontend/webv1/src/features/parameters/components/SeedVariance/ParamZImageSeedVarianceSettings.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8f384aa680cc3ea5928c618f8355469d749c594c3ce8544f31724e4af6a71cb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx:47 imports invokeai/frontend/webv1/src/features/parameters/util/pid.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fc3ea27cb21a8381947c8da049c923e34266e9a1f59a867294f21a4a00caca0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"81d46e53c864618b95a4747ea6df46b7342b655895623a574d4ea6da4e21153e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx:4 imports invokeai/frontend/webv1/src/features/parameters/components/MainModel/mainModelPickerUtils.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b884f2840d728323ea15307ded4332dd5b6cf61d31c0280013441ebe98be129"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx:5 imports invokeai/frontend/webv1/src/features/parameters/components/MainModel/UseDefaultSettingsButton.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ed3728f5faddc3fb77ea5e9428d1d477d1b48b92968ff60c343d02694eaf01a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx:6 imports invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"59509a99a27f9360c0f681e89307b32a881c3353c6387f8de0c182f9201ef234"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx:7 imports invokeai/frontend/webv1/src/features/parameters/store/actions.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"a000dddbe4fc41b43d77bc80718b84d91130bb3ea05060e00a00adbf85a8df11"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx:8 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/MainModelPicker.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"72a97c2cc69ac23469f783a9ee208baecfffa7d99a342023b473c9ff9fe77901"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx:3 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d2302dfd8a3c46c2e2abebb3dd36bdd246092b3984f74c492263fd78c56ce13"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx:4 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e77c572e9dfe4d3982973b295e66948ec35db3f2470b232743c6be409a2672e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx:5 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccadf143da4576e480601e381be46105f501bbacbf1631f68003d1eb6c4d3182"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/lorasSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"a11cc5b1cdeb81a969bf068714a82d7058f1330f2cce92c4ad48a39bb578f2f6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx:7 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"33d2665ba67a11beb599aebe25e0b9e7be4ada48169f54c80706e9b4fb500c9e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx:8 imports invokeai/frontend/webv1/src/features/lora/components/LoRAList.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"32096f25f5b0361fb8d33733567beacb32aa05957b6d89baf031700992f25e3d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx:9 imports invokeai/frontend/webv1/src/features/lora/components/LoRASelect.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff77266e5377947024e983b1382a7172153d7580fb9cbbb6a7ab66d87b76cb5f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx:10 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamGuidance.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3dcec23c525f9a39ce560490bfc492f3b78d5a7c6533cb590c45a47e715d44b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx:11 imports invokeai/frontend/webv1/src/features/parameters/components/Core/ParamSteps.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"62f1f1ce18fdd118e595658de3c588e3ee22cbc1c38f094ddedbb1b455653fbc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx:12 imports invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleCFGScale.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"789bcacedfaba9a774485a8afdd9413f06fb2952333aca63288cc54df3f9a8f8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx:13 imports invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleScheduler.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa733ba8fe5158b7ee8dccec118c70ac08d5e1ccd41a3357e51fd9b6bdb1de06"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx:3 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"47554c3b8aee8ae451d71d65562ec972b5cd0de5bf8227e8785e391cf4b56ff9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx:4 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"28a74962cf717f7165af366a21d95f91e6db38cb349f84a41d82d1bc3939eac5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx:5 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a36390186074a87de9be8bdd8b38b22e1951f1b6e44e8226c91fd93017ba565"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d71a5b98fb35bc1a58a439cb13bed51ad355b934f67c51776faf21d36aec811"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx:12 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"498d57a835fbebd86d225271ca69e6b549ae455961473cd6c380d9e582d2aa81"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx:13 imports invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamOptimizedDenoisingToggle.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"091f42888bb55885f3bb081a80ea6e48f29fc42452b7523c16c3c05800c9fa10"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx:14 imports invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledHeight.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d0e2f464e55cc7b9aab33f486d06824ea89f00a857919f382cd0182cc38caf4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx:15 imports invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledWidth.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa423799bab9cb8c6fb3fc0c6958238371bcf2bde13286faa069ccbb6b9fac96"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx:16 imports invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaleMethod.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"404cb1fdbd9a93c2b151b982173fd058b3a6fa56033549aaa98b52bc17c1db85"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx:17 imports invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSettings.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"df77729fbcde44281a6fd6ae808903b4933976cc51058d781894c9fa75aaa5cc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx:18 imports invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeed.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8411090b85a41d9bf2878a630b3c4e6b1f378b6bbeb228c6b66fd747e53e926"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx:2 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"89b73dbc3fcee7e1fab590c98308395d4a15285b35c025de5e9b34e315ca31df"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx:3 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7f11b2ae9e39c9d21af9735df9405b8b9626b7ffd51c7d853faa26382714d78"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"bebeeec723262e90340c60e1699df5c92152b3ee07988eaa27ab24c982f5af9b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"5915cbf789f677a011a0c7a70506aeee528ea9a1ea9b5a774a51aa5fe0ceb458"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx:14 imports invokeai/frontend/webv1/src/features/parameters/components/Dimensions/Dimensions.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"e63e3fdfd589ac86a2b84a1e6ee8d82c8d3a6a615afa4f55e4d7fe520594e978"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx:15 imports invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeed.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"49050a3fc8a21e6fce10a5d3a85970f48c373d6a2950d0f08e5d070114b1316a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx:3 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c590caa8404d72dbd80f86dcc08159c6bbbb69433672563bc07a5846807771da"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e5f6a65cbf0279daf386e2527b04b9ff308b5355ea5b265aa04ae3ba8b3c66d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a87e4e071142948386fe47adbb2ea32d628d7397823f3f2a9ed19f4608288aa"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx:6 imports invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerCFGScale.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f61a8f8bc10a169a151f29057745681654c268b044f540cdb2dadf2cf5a3662"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx:7 imports invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerModelSelect.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"70d2f13b13cf1f19506364001565492acfd933265c85472447593aafbb457767"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx:8 imports invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerNegativeAestheticScore.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"faa3dd72022335cae2e330be77466ae595444d348deb69a7d2bac2b62d3f0f99"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx:9 imports invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerPositiveAestheticScore.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"e447de133ce704e466d7d0eb928a8cfb93af372ef9e75b8db21b37370ee4da30"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx:10 imports invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerScheduler.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a863935665b9437a3c6c18cb200f1ad662e8f6b128f6a562f07f871f24c1697"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx:11 imports invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerStart.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"702560e17c5c4acc469b20b0bbf51edd00db53510af593fbcabccee183783c54"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx:12 imports invokeai/frontend/webv1/src/features/sdxl/components/SDXLRefiner/ParamSDXLRefinerSteps.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"404f29ed446968275880922f6cdca513eafb9e07432494e54933b6a788bda0f6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb5d141c76f2cb7c3354d0004a814951cb761d019c71bcd22b09860b24bf94e7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"0931ba7f747d373e9b3ac76b2b47ad6ee22cc69a3e668596f1e3dbdc961bfdae"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx:6 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"7102dabc2f66ab17eff6ed73d497037ccf7514dc5ebe52ea7b491b87c6087b03"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx:7 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a4166f96cbae956d01562b827cc523db3b5629d72686021dc5ec608435931c2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx:8 imports invokeai/frontend/webv1/src/features/dnd/DndImage.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"643657f8ca2b0e786f7bc6c68a00e02a9c8c5633f093247f22c45b37fe4b8808"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx:9 imports invokeai/frontend/webv1/src/features/dnd/DndImageIcon.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"2aecbd4594d17abb42bc629199b21293f93d8b206cabe45374d48d8cbd4033c2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx:10 imports invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"af4c419728997ab77ec32f985de25d1cde94653c4853cfec1c9cf3fb306f29f5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleScaleSlider.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleScaleSlider.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"86bf7bcc5ae0602cb18bf0b05e513cac4aefc0fe639b49b697a630154069a2c1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleScaleSlider.tsx:4 imports invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleScaleSlider.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cdfba0ef8ac4f075afa0cbe364a0e0d385ac8328366440a191cad700521193c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx:2 imports invokeai/frontend/webv1/src/app/store/createMemoizedSelector.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"3eb28c2e44112ab35be859002f7bca1bef8347a3608b457b73e153ad2ec020e3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"14786a27cc896cee73f950b4184f3f2b290fc981a2e8117ffe61b637643a6e93"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx:5 imports invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamCreativity.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"414ee0c3ba30f66b699d8961c93dfe66393a5552134dfcd5c5dd1bc581930bf0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx:6 imports invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamSpandrelModel.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ba260aa7c8adca66d544345507bf4dc6855e6e703b05a36d3610cd5b3e2e1ca"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx:7 imports invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamStructure.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"4453a537cdbe33ed0b02a4c974fd6419caafe2a05f9264c5370d682319c5340b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx:8 imports invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"71d7edf672feee9ebcf8b93188af73edb38de02e8bdbf57c9dec7247d39421fa"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx:9 imports invokeai/frontend/webv1/src/features/parameters/util/optimalDimension.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"deeb481e0057c53313237965fd90e1e7811b60ba34879818699282a12fee58a7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcce0ce050006255198256f378080999df71d46056a886e6bf74b06df84af159"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx:3 imports invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c427b9887a93b52b7a3ab20785b2ea646fc50ecd7f9fc906541ef608dd1388a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ebcaad791da497ff493550af28511384d3a489fe5471ee10e3564708cf05921"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx:5 imports invokeai/frontend/webv1/src/features/modelManagerV2/store/installModelsStore.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4ffecdde2d38c908334644bcff18787d42c5b35321710f1864b128a21bdacce"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx:6 imports invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"47e7da5a7b1bf1928a8b86fbf9f39faa3f68ec2efc907141d45aea39a7abccb1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx:11 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c0eb9c13bb5d9a1455029266a5a8cc5e5b331096c4a3355c8b076b4b942fee7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/hooks/useExpanderToggle.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/hooks/useExpanderToggle.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ce9e1ed5c3aca076cbb5b5e254190f66287f66b9048e0047a38ede3611e542d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/hooks/useExpanderToggle.ts:3 imports invokeai/frontend/webv1/src/features/ui/store/uiSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/hooks/useExpanderToggle.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c778915e8c31395e5ec908c3883450edbaf891e270ac6ce4384bdf9fa13606a6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/settingsAccordions/hooks/useStandaloneAccordionToggle.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/hooks/useStandaloneAccordionToggle.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"b411f0d1512c289d50cb65fca28455496d5a902ce197c644b40a277660aff490"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/settingsAccordions/hooks/useStandaloneAccordionToggle.ts:3 imports invokeai/frontend/webv1/src/features/ui/store/uiSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/settingsAccordions/hooks/useStandaloneAccordionToggle.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"aef7883971670f414346023087c56bd4efe2aa0b4bd79e2e902f494ae1de7213"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/stylePresets/components/ActiveStylePreset.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/ActiveStylePreset.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e815c92d299e7af51a738ebf13f039503f749208ff5b25d89284506d75a84725"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/stylePresets/components/ActiveStylePreset.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/ActiveStylePreset.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e5b2131ad6ef1fe2323aa9c8fb7f6fe7ea75c186964b77667bdbae3a93cacd5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/stylePresets/components/DeleteStylePresetDialog.tsx:4 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/DeleteStylePresetDialog.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"15c74d859be59c522a3fcbff4562fd8f1bb12fccfe1f62939ec9ef8d6eea825f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetExportButton.tsx:3 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetExportButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e9f003419f442b7f2a676b15deb05df5ea1080bdb3def2bc0a66d2785301604"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetExportButton.tsx:4 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetExportButton.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"783297c3bb8c55b1cca0589f95c639b1617898a8e9c9b1e9f20c57236b721343"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetForm/StylePresetForm.tsx:4 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetForm/StylePresetForm.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"c40d2a2033430eb2570f2e2ce1d75836eecee02b447b32b4f22d20f58448887d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetImportButton.tsx:3 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetImportButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc45c06ea5030fee9d0690585131dde6a308593ebd3600b79f6d6139209b6bab"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetList.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetList.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fc8c4c2049c0f7e47e15cfbc7e1450776182a3e16b60efe4d3107eb23b2a0a9"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetListItem.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetListItem.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"985e7549c538869d0ed5cd81eec0e3534997a616644c98a7a13deff89098f3e7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetMenu.tsx:2 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetMenu.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d950dca868f9680f6dc1e1a4884c846077a073f9153f99ab5075e51e41709d88"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetMenu.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetMenu.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"74072c812830bd93698a860a3c39d0bd8b93f174ebac144c167c7341ab6ad8dd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetPromptPreviewToggle.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetPromptPreviewToggle.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9663576d08920831f07bac68b7b30b33b51e9ebe962440fdb8641556500c27a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetSearch.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetSearch.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a9a1a0313f656b2b088a6ba8fbaa90684d1bfdb4a483f2bc0f177cd70d83bbb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/stylePresets/hooks/usePresetModifiedPrompts.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/hooks/usePresetModifiedPrompts.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b8ac84c2ae795647f748cedcbf46b83273c9f8913bf48d151a28395ec3a6322"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/stylePresets/hooks/usePresetModifiedPrompts.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/hooks/usePresetModifiedPrompts.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"13f76891c63ff0b6e536b685d28fec4ddf20bd3b336826c274bbcb17e270056e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/stylePresets/store/stylePresetSlice.ts:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/stylePresets/store/stylePresetSlice.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"cecfd6e02c7aa41980b46a9a7fba326248cc49060bac4faf6c6a758e69d22b43"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/AboutModal/AboutModal.tsx:18 imports invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/AboutModal/AboutModal.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2f899e2e68c640f6d094453a30972d5f13967f5d904c2b6aea667e3011efb0d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/AboutModal/AboutModal.tsx:19 imports invokeai/frontend/webv1/src/features/gallery/components/ImageMetadataViewer/DataViewer.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/AboutModal/AboutModal.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7c125000022131f7463344b2d5d9fdecc78b99fd663f9599b8a0ed861c8c325"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/system/components/HotkeysModal/HotkeysModal.tsx:20 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/HotkeysModal.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f05671afc393e037de0bd17f3f2fce172a80df27291ae790ec9ea38d6adee35"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bdf713aecc0914f50fc539996553be485d8db21ddc4cfcb0a5270f69bd4191b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts:2 imports invokeai/frontend/webv1/src/features/controlLayers/hooks/useIsUncommittedCanvasTextSessionActive.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d29f4ed555b2d004c2256bb0060089bd748461a68979dd81aa1d8e8f94ae50c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useSharedInfoHotkeyTarget.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useSharedInfoHotkeyTarget.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6322b7275de7d810896507d57d15ddacf38736031308a7e416bb70394bc54af"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useSharedInfoHotkeyTarget.ts:3 imports invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useSharedInfoHotkeyTarget.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"59567252adba693b288954edf12918a8d9199f7bf4289f8f7dec1316696d1f60"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useSharedInfoHotkeyTarget.ts:5 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useSharedInfoHotkeyTarget.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"552d3d2e9ae167f9082bca7b82d109e6eb1142d8243f6d24c45753344c3055ac"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useSharedInfoHotkeyTarget.ts:6 imports invokeai/frontend/webv1/src/features/ui/layouts/shared.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useSharedInfoHotkeyTarget.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"75da76db7a2438d29f192b2fe33cd380957dd207752f4058ee83822b1ef9d0e2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useSharedInfoHotkeyTarget.ts:7 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useSharedInfoHotkeyTarget.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"836d7f513b50872598d8ae3ae76925f5cfe62ace8f7c1e7e5658412c237f7cd0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/ProgressBar.tsx:4 imports invokeai/frontend/webv1/src/features/queue/store/userScopedQueueCounts.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/ProgressBar.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"c158e0dfe110e1b8a21f770c47c837e42cb51b2d83eae99daf430510fafa8953"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogIsEnabled.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogIsEnabled.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"85710763c0db359f76caffef5a0eac1cb950980aa6391c6ad673ce41e4b39094"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogLevel.tsx:3 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogLevel.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"044da979dee8347b6a2e658b218e1846481bc0f5dd4fe3c603cb3823ce89698b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogLevel.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogLevel.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"60206c3f35389eaeb92935726b23c52ffaa68e57277597709c2951a9d48d7993"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogNamespaces.tsx:3 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogNamespaces.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9c507f0ed1ea2fd273cc5b0ee0fb1db45551db31b713c2f66234ef23059240d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogNamespaces.tsx:4 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogNamespaces.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"e65d0bfd9386c6b7c474576d87387f858ebffa5396557cbc6cbb1f0eaaaded44"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsGenerationDevices.tsx:11 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsGenerationDevices.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"cee0e7a099f28c79dfb4b8b1c9e544bac04bdf93057efa44eb0b78ed24d25a3c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsGenerationDevices.tsx:12 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsGenerationDevices.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"a266ac716e1313defe0aa0b82985291a33f01119892b07c2a6740d860bb9952a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsGenerationDevices.tsx:13 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsGenerationDevices.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"08136c216e6bfc9f91f32b3dbfb2c861e1b214d2dced5e374bebe3b3a9d29219"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageStorageMaintenance.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageStorageMaintenance.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d586f14f55c4b07a272d638867f7e88e0652a5458ea3570ec3b4aeef7a57241"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageStorageMaintenance.tsx:3 imports invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageStorageMaintenance.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"23e08c3e9c00049302b0d44c3f31f3741e844302ff5408a933826509dc2bd74d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageStorageMaintenance.tsx:4 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageStorageMaintenance.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c5bd238aa1cf01678ef1a53ef66a66d63d62727a4cccf4b00089987284f6f32"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageSubfolderStrategySelect.tsx:3 imports invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageSubfolderStrategySelect.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"af79c136d721b4ca2a87db6d1a8504862ba103a251bf25a0055bc05b2efde7c4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageSubfolderStrategySelect.tsx:4 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageSubfolderStrategySelect.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ea4e0f64734a04c8176863c5f18ddd05808a803b6c79ac0e7ce0aa9ad246361"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsLanguageSelect.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsLanguageSelect.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b94691486c73d4bfa664606a150a42f9e749c84e295b57ad2f88de6b9ee350d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx:19 imports invokeai/frontend/webv1/src/app/store/enhancers/reduxRemember/driver.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7ddd5da9999a5fdb1e95c4b6b1273797e0545383110b7f9457e1afef6029e30"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx:20 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"970e90dd70112f0ebcf936abe554cce9983c3907dcbfa244e959b7e3ba0fbab0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx:24 imports invokeai/frontend/webv1/src/features/auth/hooks/useIsAdmin.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8ec2a5303266519b8240ea295ef474831ff4a806112b8ed753031bca8ea76cd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx:25 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"3beecce0e190d0cb4de53842bce8d8e7683d294c9aa7eb0b7f72458eeca37380"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx:60 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"5672bee3b95eba21560ea942535f3739a594b86a3bc1527cb8dd96964724f9ab"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx:61 imports invokeai/frontend/webv1/src/features/ui/store/uiSelectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1efcf536b8f820192b7a83001f3103b1d89427d364377745fdfd2a3008a904c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx:62 imports invokeai/frontend/webv1/src/features/ui/store/uiSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"f39c7f322ebb9f709da6657a7a81312a49ff7c3094b8b03ba1ba3f1bc91f6c81"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/system/components/SettingsModal/useClearIntermediates.ts:1 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/useClearIntermediates.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec56d3d8014d63506345e693d4335fe953692a357493f2ddd615e383a6fca818"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/system/store/systemSlice.ts:4 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/store/systemSlice.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"20995ad577ffd4217e13320ff3a5e7bf388c85056e24f1b3ae7e80581596d520"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/system/store/systemSlice.ts:5 imports invokeai/frontend/webv1/src/app/store/constants.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/store/systemSlice.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"804af252256b52e9f53402dfba1b6d9ad29f7a9e1c1c0385a69b0712f923012f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/system/store/types.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/store/types.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5931400aeca8992c14d36af7d3a53cf76a1b2376029d21a88a9bfe91afdb9191"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/systemPrompts/components/DeleteSystemPromptDialog.tsx:4 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/systemPrompts/components/DeleteSystemPromptDialog.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"a988c3b44205c1cc573ffc31e4a8ac992e1e8680dab35c9febe8909bdffc1a7f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/systemPrompts/components/SystemPromptForm.tsx:3 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/systemPrompts/components/SystemPromptForm.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"42664c2f3346308a2adcc1657bb80e0fdeabb0245235d0772647f03dfe620b38"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/systemPrompts/hooks/useCanEditSystemPrompt.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/systemPrompts/hooks/useCanEditSystemPrompt.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2533e17cad02242de5767d0bb34afbcdf00ee0101d46bdb9f7b3dc2b853052a8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/systemPrompts/hooks/useCanEditSystemPrompt.ts:2 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/systemPrompts/hooks/useCanEditSystemPrompt.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"4892d8aa69bf599fa3a9e3a327a947dd7a0648868499f0a539eb107ad76bf00a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/toast/ErrorToastDescription.tsx:2 imports invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/NoContentForViewer.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/toast/ErrorToastDescription.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"46ded591854666cfde41dfcc6dbc6779973a200dfcfc16c0d2364169d99dc66c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/toast/toast.ts:3 imports invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/toast/toast.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"1abf2f239132cc6d487b1361a7be4e34c2129244bf33d57d1d2509c6d9862a4f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/components/AppContent.tsx:6 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/AppContent.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"b678456bd657ebea0464c25d66c7267d0390f4b1926dbc3d868c1ac29f13f5ac"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/AppContent.tsx:8 imports invokeai/frontend/webv1/src/features/customNodes/useIsCustomNodesEnabled.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/AppContent.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3b69fab64be6e65ec81437d4a598711f956f60036d6956f1e6f94e05d4dcf8d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx:2 imports invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolChooser.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"3aba273eb73f1e34d39a86d8ef02e9528bd5e969a84087c9b5ef3b90a2135236"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/contexts/CanvasManagerProviderGate.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b9c7399862f1e79d068bfbfaa4fb1dde70dc7575c3ba4f62b4445345da2f4ce"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx:4 imports invokeai/frontend/webv1/src/features/queue/components/DeleteAllExceptCurrentQueueItemConfirmationAlertDialog.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f2ddd16c83a73cb663d1077a121ed1b0f9ff31e9c4c15a888fd2cb3a396cfec"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx:5 imports invokeai/frontend/webv1/src/features/queue/components/InvokeButtonIcon.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"4de0d461a46567e5904de9e3244f5f1536962778f2edf6bf7615ca731213d87b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx:6 imports invokeai/frontend/webv1/src/features/queue/components/InvokeButtonTooltip/InvokeButtonTooltip.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"e39f5281dfd1fc6e9a6250cfd01b5f051a2dffdebb18da462796117f6c697e22"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx:7 imports invokeai/frontend/webv1/src/features/queue/hooks/useDeleteCurrentQueueItem.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"43ebe30db18451bb308c504503edaf7eb22e0525a984f8c6ad05a73bb3966294"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx:8 imports invokeai/frontend/webv1/src/features/queue/hooks/useInvoke.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d118d5431e0c51c262a03b8cc88a226b2835171afe990a09565b9e1d0aefcff"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/components/Notifications.tsx:15 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/Notifications.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c3b2d586f1fc21b3e8024ada4db2ad7c85d404604d9932102c41dd263998056"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"32a99ec6b744b42ecbb501a4f55caa718b652ae2dd8df7abc544817726d19eae"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"95cc90352194b52a0e50c21aebb66d87f0e5988ddf00da56ef63092cd158549d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx:6 imports invokeai/frontend/webv1/src/features/parameters/components/Prompts/Prompts.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fbc78cdb54e93086593b747ae9627b1da62040ff1c8ff7ebb8adc49d1450543"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx:7 imports invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa0ef2a38d7a656aa8277b2559e1f61d0887affc164a18d06051a2c3c4c82250"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx:8 imports invokeai/frontend/webv1/src/features/settingsAccordions/components/CompositingSettingsAccordion/CompositingSettingsAccordion.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"025f19e384129e95d799f163afc2a4140be39961b070d529e127910028122860"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx:9 imports invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"554a7fb9f402826c8c0e2d5b3ab663d45a8dacfbce203964f00510baa929d1f0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx:10 imports invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"87b85612412164499a2d3275b3968d45eb417964a9dd719d041f7636b4326aab"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx:11 imports invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"9be71b8f1021687ba73b61028e4957b564c9ad828cbc78d7eb62acc87008ca86"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx:12 imports invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"e94f89eac1310c4a03dd96db81e6943f1eb5e6e8bd779eca5e7dadc044c442fd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx:13 imports invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetMenu.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"16b3cc31dc60a28e1483fe56ba0d91efa390733504c7b2755c451c3ca5279a2e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx:14 imports invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetMenuTrigger.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb6c788a831aa21f036a1fb3776d1120d9223bac0abc4f9623c96b3fdc08408c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx:15 imports invokeai/frontend/webv1/src/features/stylePresets/store/stylePresetSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3862298c49a06733e535ef82958c9cca6386c64c4e6d62b0775412f38626322"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"074d022f7de5614d3dbca0cf64cadcb465cfe173788bc062afc060c2153ef7fb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"69bd1690b3030e4dab5e3d4349ba4f827b298d3375422e5cb46c5feff91a166b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx:6 imports invokeai/frontend/webv1/src/features/parameters/components/Prompts/Prompts.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c32173bae66a2e60651cdb2909cc64950b967c3035c283aed7fc29b13558111"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx:7 imports invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"9efa5ce2d5dfa8c4ea5a218fc2196b35761faf909880cb3478cf9a60b39a033a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx:8 imports invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1278f27da36b11000c36fb8942763a4b2fbec25ac86433d1141335e137cd6f1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx:9 imports invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"977224349961b1e5054442ad87ae1bcc68b5a67bf6571a071b633dfcdcf76987"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx:10 imports invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"1aad9e1c76a79c8ba809c1896307fb1c8ad9749004904392a9367370afacbba4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx:11 imports invokeai/frontend/webv1/src/features/settingsAccordions/components/RefinerSettingsAccordion/RefinerSettingsAccordion.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cdd7e3e050c472fcb3547c64c59e5cc48662cf6c623a3f3139e99e914abe7df"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx:12 imports invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetMenu.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"86a2498c3f315d534a62bbafae311cec2e9de9b727a418f964930a63a93ecf0d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx:13 imports invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetMenuTrigger.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d131259051daf22b58c0466048ff43d3bca891b1ef268579a239a0125c8323e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx:14 imports invokeai/frontend/webv1/src/features/stylePresets/store/stylePresetSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8ee18234ab5aa903ae78d4122c9289857f5849cb47bf8e5f82b7f9b249b6b39"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx:4 imports invokeai/frontend/webv1/src/features/parameters/components/Prompts/UpscalePrompts.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"da4c8b7117cfc812ea271c966681ff8e4be489099950aae9e2a61250c08ae733"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx:5 imports invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"943a1cb0b66ed23e209473f57758b7a5ac65f9aa3c86a9b54e864b59f88cedb2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx:6 imports invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f2b73254033c5c3730d55dcbad81396b89fa908c6e314a4ca7c2eb2dc8828ec"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx:7 imports invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"66c77260e41e32f9a60164cde2587b46029c4547a287a9b7c238e189c93ba415"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx:8 imports invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetMenu.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a44dbeb00ef662e0e606777251a9fafbbab8a593e02a5744d7be12a97754ded"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx:9 imports invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetMenuTrigger.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa81d64199571506a10e4c844869830e0f29fe5b3fca70092ae536b6a58ee636"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx:10 imports invokeai/frontend/webv1/src/features/stylePresets/store/stylePresetSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"97b8de975315d5f1fbf47ef53707c2c3347023a3184aa2c05147577d0b8da574"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/components/TabButton.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/TabButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"683e2ad09c1548a6c33d87569bd0887a3defcd137bff674275ba6d65e18747b5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx:2 imports invokeai/frontend/webv1/src/features/auth/components/UserMenu.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"697e0f174d8836ae22882c6ee4f926d502443529f04aa2aa6ad5daeb3ee728bb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx:3 imports invokeai/frontend/webv1/src/features/customNodes/useIsCustomNodesEnabled.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b31d6a5762f124b40bb9d0b0a6586396f3cc691d7f2a6a4fce17316a14a3d2bc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx:4 imports invokeai/frontend/webv1/src/features/system/components/InvokeAILogoComponent.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"91428ecf58813760fe6c98074813a03812a66b4864234119f7b353824122b078"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx:5 imports invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsMenu.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"eaa19150d37665d35cf9c8c3065fd34b20cce005269ce37b43d602ae351dda7e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx:6 imports invokeai/frontend/webv1/src/features/system/components/StatusIndicator.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"82415bb5d5bf159d38b0aac958173b551875400d94cd3717babc8658e6928666"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx:7 imports invokeai/frontend/webv1/src/features/system/components/VideosModal/VideosModalButton.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"da1bb9f8bfbfdc6585c078dda0a73964fcfed4d9b6aeb334794c7427d11c734c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/tabs/CustomNodesManagerTab.tsx:2 imports invokeai/frontend/webv1/src/features/customNodes/CustomNodesInstallPane.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/tabs/CustomNodesManagerTab.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"61d170a0e038d6f5db5c73e201c2932d129d79f6f9cfe985d38f29a0f81bbcdd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/tabs/CustomNodesManagerTab.tsx:3 imports invokeai/frontend/webv1/src/features/customNodes/CustomNodesList.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/tabs/CustomNodesManagerTab.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c1984a4ebaf09b36ed82459a8b9bdcb87693d414588b6c2cdad1ea2062399be"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/tabs/ModelManagerTab.tsx:2 imports invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManager.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/tabs/ModelManagerTab.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"c14fb1765ae7ef624952e2fca1b4e37e7d39c5f719beb0b63d174a9c5751894a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/tabs/ModelManagerTab.tsx:3 imports invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPane.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/tabs/ModelManagerTab.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8b6d37f8ead3dd3d9e3b3f9000030a190e120efefcb39f557868c480a804972"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/components/tabs/QueueTab.tsx:2 imports invokeai/frontend/webv1/src/features/queue/components/QueueTabContent.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/components/tabs/QueueTab.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9561f12ccfb1745a26a10de34a5b320aedaf20858fc98417dbd50ef8d1ce2ff"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/layouts/AutoLayoutPanelContainer.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/AutoLayoutPanelContainer.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9639b57008cfc84a51ff4d25e523e77fce594a8a80b6582d3d931ffaa453e91"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/AutoLayoutPanelContainer.tsx:5 imports invokeai/frontend/webv1/src/features/system/store/systemSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/AutoLayoutPanelContainer.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"cddd8cdb46de079d765f08023dba2939e92accded911e3760256e6dc23b789df"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasTabLeftPanel.tsx:2 imports invokeai/frontend/webv1/src/features/queue/components/QueueControls.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasTabLeftPanel.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff9725a83af4f218ad4de14d0f675444efc418ab081a08afc27f6932a5b53939"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4dac7b5aa72912a76f5d65b30f3561c4dc45be614b2bb55b25c4a03acfd11a7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsBboxVisibility.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f15423756fc41a5c7294ac03eb0d01f1619abadbfb7a6803e704d8289af0380"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsInvocationProgress.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"31dbc6710244a7321f80a839d473878c9d6e186950b29b2411e01eb9c289ffff"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsPreserveMask.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"07ef421aff6da0c6257e24596a4b41d23d088b244d91d6cfadaed4ac291ba11d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:6 imports invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsSaveAllImagesToGallery.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"37ef18523c0ff5df44786779035b967eb3db1a62ec3b872dde163ab04cffae8e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:7 imports invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsSelectedEntityStatus.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"42fbddbbd0121678c47329ea45922125d928a1b50ead676d47c3624228883c0f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:8 imports invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsTextSessionActive.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd502955db99e9e210cd6c955ead93b5b5d42fed9f949be75fabe50fc90fcdeb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:9 imports invokeai/frontend/webv1/src/features/controlLayers/components/CanvasBusySpinner.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"5129d1323963461eb6aa45468172579b4bad2b1fd0e282dd2fde4e3730c1513f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:10 imports invokeai/frontend/webv1/src/features/controlLayers/components/CanvasContextMenu/CanvasContextMenuGlobalMenuItems.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"03857e5797471bd5a3407e310dd960b85db164fd5ac605d18d6e0ab1d354eeff"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:11 imports invokeai/frontend/webv1/src/features/controlLayers/components/CanvasContextMenu/CanvasContextMenuSelectedEntityMenuItems.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"12eb76b0b73b992fb85e14e2a3960bab7365adb0ff6c7d5df26cb0e21e2bc8f2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:12 imports invokeai/frontend/webv1/src/features/controlLayers/components/CanvasDropArea.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"71a215a285036c385ecd7182e9d8b8ae56d910ea7cfeb6d3835ef9dff7bf8064"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:13 imports invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"6270a06e3e235860c0b3273b45c496bfe35f6c0c7943b973de22ba9d30ff034e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:14 imports invokeai/frontend/webv1/src/features/controlLayers/components/HUD/CanvasHUD.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"5125416a9bc78d7eec770391bdf94d42d41276d88bca7d00042cfd873264e2da"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:15 imports invokeai/frontend/webv1/src/features/controlLayers/components/InvokeCanvasComponent.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"9034e8863f3427dfe2468846bfe75c2e69abfdb89774af01e3e956fd7641de56"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:16 imports invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObject.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e73394b0e7e9e72c44f4784c65411c9876a3b341d7ec1f6287b6b767e570aa0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:17 imports invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/context.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2eb24d2f8d809eae7a0dab0ebeeec087a7d4ba0b417d5f4629dc6674e8ff102"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:18 imports invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd29c3d3d07133a73e2d26bad9f4367ea7f3e50bdd0f6a6cd8b98f5c20236da8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:19 imports invokeai/frontend/webv1/src/features/controlLayers/components/Tool/PinnedFillColorPickerOverlay.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"478a156e71de198134b15a9627300f9960bcaf4a8f85689066a7298334b6ba45"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:20 imports invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbar.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0dd5bb9276b4c22026b958a1ab7aab5a9648fa442c197728b310393d241deeb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:21 imports invokeai/frontend/webv1/src/features/controlLayers/components/Transform/Transform.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a2461117a6b90c162a7a86aeb0f2a6cbd246c974d068f6a5a1142152bb9ab16"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:22 imports invokeai/frontend/webv1/src/features/controlLayers/contexts/CanvasManagerProviderGate.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3db99aedcf50b4e9a163999062f58fc9bce7c7c4df6777384581f3bbf928826"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:23 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSettingsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"45d1e2f94eae3f9a319ab08d71b0825ab75c87ffc2d60a57fa49677280cb0341"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx:24 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6c7ef2429c6bae1b822c17ea6d91dec711ffb344328cb80bccf12410e1c7bfb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/layouts/DockviewCanvasHeaderActions.tsx:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewCanvasHeaderActions.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"7759bc1438ea0c5b903a3b1fa9e3422756596c69133e88f357677a7ae27f5058"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/DockviewCanvasHeaderActions.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/contexts/CanvasManagerProviderGate.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewCanvasHeaderActions.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"387fd8c3876cc64e997043b7807e1c38d94f4e3a15086be9a2dabd7cd37d351e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/DockviewCanvasHeaderActions.tsx:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasSettingsSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewCanvasHeaderActions.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"a08679f2e32ab1b39f4d8cc94edb05392a26253e44ca4331d7c2811ad154c83a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/DockviewCanvasHeaderActions.tsx:7 imports invokeai/frontend/webv1/src/features/controlLayers/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewCanvasHeaderActions.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fb6e5fe02647bdfd6ac8777ebbfbf7a0964c684eb9ef40a208dbfaf229d279b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/DockviewCanvasHeaderActions.tsx:9 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewCanvasHeaderActions.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e840e9fc0d1044dca85bf03312f4deb2e877f3aef5845ee34a67588d5a3bebb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasViewer.tsx:5 imports invokeai/frontend/webv1/src/features/queue/hooks/useCurrentQueueItemDestination.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasViewer.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb8602a64546e0a60587d9326ddc0047dad2651ec08958af980ae5cf5d18a0ac"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasViewer.tsx:6 imports invokeai/frontend/webv1/src/features/system/components/ProgressBar.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasViewer.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cceb745cf6f79a4d68f30b77df905f0876a7d2c9a84c4c74685c485600e18eb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasWorkspace.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasWorkspace.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"038c32f96813e4dd51e83cbbc748fedd5069a90c0439c621de80f0d5465523ba"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasWorkspace.tsx:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasWorkspace.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e10978423ac4d92fa917f3ce8a320962a014e72b0bc0b24efd377e5f83e454d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasWorkspace.tsx:7 imports invokeai/frontend/webv1/src/features/queue/hooks/useCurrentQueueItemDestination.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasWorkspace.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"57301d9ac0e9a16462e2f48a298efda073ca9874a5f8cd80af4acd860e4114d3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasWorkspace.tsx:8 imports invokeai/frontend/webv1/src/features/system/components/ProgressBar.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasWorkspace.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"225793e8323788b7670dff21e977e148f55e52e95dec8ec79770cc6d68ceb153"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabLaunchpad.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabLaunchpad.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"831d531e7065f02f594f009bc92aacc3691720147bfbfa6a79a4ab4a9ab32dd6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabProgress.tsx:5 imports invokeai/frontend/webv1/src/features/system/components/ProgressBar.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabProgress.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"89339b8c5bedee83adb19fb9e997c27f21d62ea9e43b984c696cb83f71d79870"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/GenerateTabLeftPanel.tsx:2 imports invokeai/frontend/webv1/src/features/queue/components/QueueControls.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/GenerateTabLeftPanel.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0e2a66df417f6946ba20ae9cea4b3f2706ee43b0685e432dde0a2ced907a779"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/layouts/InitialStateMainModelPicker.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/InitialStateMainModelPicker.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c1790e0bf8c7a721f172ca3563e06945415b4e0ea7a2e84ca44861e9817c7ba"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/InitialStateMainModelPicker.tsx:4 imports invokeai/frontend/webv1/src/features/parameters/components/MainModel/mainModelPickerUtils.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/InitialStateMainModelPicker.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c6bfd932526690b6b0ef6b3c84028505784e00ca97d7e04ffff6ef41003ff3b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/InitialStateMainModelPicker.tsx:5 imports invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/InitialStateMainModelPicker.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"2217cc27db9d3f04ff2e30189455117e6fe98ce142c9bac3137dc805a34b753b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/InitialStateMainModelPicker.tsx:6 imports invokeai/frontend/webv1/src/features/parameters/store/actions.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/InitialStateMainModelPicker.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ffdcc5b559a37fffacfaf5c43a5818e2904f1e103b92065f0ce45e5acf5109e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f5fd0a15f8b8d78a0be132ebd7fc410cb962f6df5b86f09c104a5d4ca2204b7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/hooks/addLayerHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d3e0558ba9e9a5f75d3471ee6b047b1d8516c30d0610b46ef793e24d4aaf9de"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/store/refImagesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"096f7122e9399b0f2f3930d97f159ec0b5abf621ad2a929a031d0769750b680c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"80908999eba2c38b756dcffa94232f3c8213c1cd04242ab2f042e4927741051f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx:7 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"5df5893e44cea82d379aba0409be2f103bec0efe9c5b96fc6a773959061bc5ea"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx:8 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"56c0afb8c7c0cd011d3e5d4facf4ef6496bca8e3d6f1ec3556852406c48ee873"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c48d1e3584096e47e8d39e6c41e6078a25d8e23450bc58f9f7149aba34e7a5a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dbfda888ccbee1edad1f9cb1890eb4fdbf7bf313326eaed01b40809a4be2af0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx:5 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bf7521c5c4b9316c2f06fd803b2e6c1e5e636bab54da3f351528914a384b64b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx:6 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e14b85e6f01cf7c29ddf51b5935d6aed490f8a3f4e076238c489a2b395ac5e8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx:7 imports invokeai/frontend/webv1/src/features/imageActions/actions.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a0554c86d3040637044a9a875106e49f53740ec3d63df02db5e6c246014f224"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadGenerateFromTextButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadGenerateFromTextButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"38b87a9f15d02d5d336c5fc0afdc60e5f551c4015bfe3f54378a7edaac13eecf"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadGenerateFromTextButton.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadGenerateFromTextButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"0463b8903374a9766c44403946acb4789e40ce5bc63a3094d97cb7e349d1866f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadUseALayoutImageButton.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadUseALayoutImageButton.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"2de8ccf6440bab6babd6c47e7cb099b3f511fd8ea289ac289d3676c0cffaee92"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadUseALayoutImageButton.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadUseALayoutImageButton.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"b17b9d5551190759bf8043057f7d7bb45eca6b97b6db492b66141e053d77fa33"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadUseALayoutImageButton.tsx:5 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadUseALayoutImageButton.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ec14363ec6463e2a51ca2f6ac5c842954272fe0594ae5757d06fe153e5c7a08"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadUseALayoutImageButton.tsx:6 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadUseALayoutImageButton.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"5772d5f2b336abea7f4b528c8d237645a209363bdab31360b9878ba1ff13e369"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadUseALayoutImageButton.tsx:7 imports invokeai/frontend/webv1/src/features/imageActions/actions.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadUseALayoutImageButton.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"147ffd1fed6adf9ec249f09f8bfc3e5f226e5ae33bee46293d785fede118bc37"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/PanelHotkeysLogical.tsx:1 imports invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useHotkeyData.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/PanelHotkeysLogical.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"02cd88342d9c80bab340ef31fe574bc53e98a09f3f1260d9ee2dc2154e6ca832"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/layouts/StagingArea.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/StagingArea.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"c98df436b34bad4203735e4647f9e2c61210e29d3d38b335a7bc7a6bfda2f60e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/StagingArea.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/shared.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/StagingArea.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"22c07ec99bdfbe36986a7bb1801c3ce8147baf4cf1ff4341f3f3369f1ab9e71c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/StagingArea.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaItemsList.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/StagingArea.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"69799ff75383ad8ba0f249e4298d990d2146c5a3f1f0c697eef1ea8b54b07585"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/StagingArea.tsx:5 imports invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbar.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/StagingArea.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf28241588939bee57e6a95832544316624c03b6f84c7e655e49f2e7d36480cd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/StagingArea.tsx:6 imports invokeai/frontend/webv1/src/features/controlLayers/store/canvasStagingAreaSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/StagingArea.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"15226290a71da806ab045aef94eff72df5cdc23236d5f6df56e4f19c64b1380e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffeb37957bf43faddd6c240737f39e8ba1871d6c3edc6976018c12c7c0ff994a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx:4 imports invokeai/frontend/webv1/src/features/controlLayers/store/util.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"0724be21158dd75588e62a53cba9a5168a2a1000b2b56fa7e5c61622db82db4f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx:5 imports invokeai/frontend/webv1/src/features/dnd/dnd.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"637fea2d333fe21347bd91f6c54cd9bb351b0debdffbc42dc412590e491a489f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx:6 imports invokeai/frontend/webv1/src/features/dnd/DndDropTarget.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"6349c6802cdb3df9ef800ebdc345c22f6c35f7cc40a9df73b9d69b703629f60b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx:7 imports invokeai/frontend/webv1/src/features/parameters/store/upscaleSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5a79f5e1321719c3637e498b22d9cfebb174094eacfc04e4ecb2a0124ecd5fb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/UpscalingTabLeftPanel.tsx:2 imports invokeai/frontend/webv1/src/features/queue/components/QueueControls.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingTabLeftPanel.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"785a85bd2d7495d7a6d3eebbae36f6f8a0ec4f7fa51000c6c7516cc6b4e90fbf"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/WorkflowsLaunchpadPanel.tsx:2 imports invokeai/frontend/webv1/src/features/nodes/store/workflowLibraryModal.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/WorkflowsLaunchpadPanel.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"4418fa874f7361960623c8536a270a5104b1dc3f9b01de25fe327f35e60557b5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/WorkflowsLaunchpadPanel.tsx:3 imports invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowConfirmationAlertDialog.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/WorkflowsLaunchpadPanel.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"205887bfbc55f90d1ab79d1257833f1a4af4c026d828936356d60ca24dab4c22"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/WorkflowsLaunchpadPanel.tsx:4 imports invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/WorkflowsLaunchpadPanel.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"84a20b31652c7f787a0b7de5796e74b4f6ef85b3bb0c21bfe8ff696331976dfe"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx:3 imports invokeai/frontend/webv1/src/features/controlLayers/components/CanvasLayersPanelContent.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"22c5edd0e9a798dc02c0001d146629574ed054ccb27ae03ec4fd327501eb8651"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx:4 imports invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fa19976a7a5ce44b1197d1a753024f7737f2b46fb7eee32b5605a8aeb272d8b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx:5 imports invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e3433ee0f76d2be09dacdebb7d3c2306204c1cc8c14db680b685e0eb22dbafb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx:6 imports invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewerPanel.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"eee64999270746cc2fb18cdbefd6156bbfab13573ba4490790a6f3e7afab16d8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/canvasToolModifierHints.ts:1 imports invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/toolHotkeys.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/canvasToolModifierHints.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c39d23baa3f3e322ad0be8f283727624b6c3fe2623f583d61e1531883efa7cd8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx:3 imports invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e6b0f7005d22bdec6084fd51b033ba05d4b5dce504b15a551253ea905031bd0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx:4 imports invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"612853bed1d7f513fb241bfb720839e72e5e875aa2c48360855e04ffe716899d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx:5 imports invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewerPanel.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"7363965a35644deb968053921d93888049940ba47fe46a8bed8335fa77c18b65"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5525e8e582d5f66356bc03fde97550989f204c30a72eb8d30322d5fd767e6b1e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx:3 imports invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"8987f639f09153bea1573de3fddf03346c50e019d2276e8ad4c003305b7578c0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx:4 imports invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ec06470a39bd926b949e33d7c2e1b3d9bad20b7a2f7f76235388323a3b8286e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx:5 imports invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewerPanel.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5479cbb6a80538faf7678cd84189fff5f81aedf04af8a5b31aabc77ff1c86e8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/ui/layouts/use-navigation-api.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/use-navigation-api.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c81e984b10064aa147132387b6819fe7acb1515466166478163c5fd27e6916a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx:3 imports invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d65dc6c040406d74b8ccf7005f8c70c1650e1f71cff317843ae9d77474b5ac7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx:4 imports invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"171c5af4cac66580bb0c03cadd516125de3d239fb8bf938d3538b40670312129"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx:5 imports invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewerPanel.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9ab80e9e85c6e799a1ae785e009d9b12cb114eccecac7294c719326888b3c99"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx:6 imports invokeai/frontend/webv1/src/features/nodes/components/NodeEditor.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"86568ede2b64f9ab2138d22e3d46e2610d2b21e3e6f248ed1990528c26d8f6af"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx:7 imports invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowsTabLeftPanel.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d5498ffd8962ee4f4719897935232c917c4badf46d91c86145eb00163eb0db5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/components/DeleteLibraryWorkflowConfirmationAlertDialog.tsx:4 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/DeleteLibraryWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f432bf9b8636582658e5a587d3078d36867932beae07a776b3df22e9a2f69db"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowConfirmationAlertDialog.tsx:4 imports invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/IsolatedWorkflowBuilderWatcher.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"315178520a17d54f30406f69feed7b28b1258bffa1fe997bd8389a280cef87a2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowConfirmationAlertDialog.tsx:5 imports invokeai/frontend/webv1/src/features/nodes/store/workflowLibraryModal.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"4184be090dbabaa8ad9667493e2700d5aa7a56343c8be175b9006fcd0f66a337"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowFromGraphModal/LoadWorkflowFromGraphModal.tsx:17 imports invokeai/frontend/webv1/src/features/nodes/util/workflow/graphToWorkflow.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowFromGraphModal/LoadWorkflowFromGraphModal.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c579c2c58a02add13a5ab33b5321b443e1460464b683b9b2a6b22d57ae3749e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"7557e693929ec21539b240fd71ef939b62a42943800bd7aae44c081f7cdf7e2a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx:5 imports invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/IsolatedWorkflowBuilderWatcher.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"760198f8c6223610c811c9bab7a802d0aaae0df1491a722a4ca4e7c70892403a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx:6 imports invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"443f839d9a28747aee78a20f68fe05966b25bbbef9a657154ea24d6c77c4bd05"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx:7 imports invokeai/frontend/webv1/src/features/nodes/store/workflowLibraryModal.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dca4792a7652d7d2ea925e32a9af9dbd0cc982e9663effbc23b7637421457b1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx:8 imports invokeai/frontend/webv1/src/features/nodes/store/workflowLibrarySlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"29209233939777c91dd13f512ff8e02115d74d2c2146c04b3564b7055ad4044b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx:9 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5a9cfc079900cee58812ca735c078a784affad9bbccdd034891159f9604b254"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx:10 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"581f44dc35ed9ae5e4d509149d044c235c049fdb16a992855c3dde9f4385bb4b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx:11 imports invokeai/frontend/webv1/src/features/ui/layouts/shared.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"578ba7bdcd3490486c991efadf986f925f75cb1a629fce71bee059324b6d82d2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/LoadWorkflowFromGraphMenuItem.tsx:4 imports invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/LoadWorkflowFromGraphMenuItem.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1dec80405d1d8d987463d86120883efcc47ac8859d975313647e4ccfcf43c6a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/SaveWorkflowAsMenuItem.tsx:2 imports invokeai/frontend/webv1/src/features/nodes/util/workflow/buildWorkflow.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/SaveWorkflowAsMenuItem.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ebf0583778b5344e64b725a6ca3bf1d87fdaa728312e907c7ba8a68e32ed9db"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/SaveWorkflowMenuItem.tsx:2 imports invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/IsolatedWorkflowBuilderWatcher.tsx against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/SaveWorkflowMenuItem.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"672902b1c10e85e45c890d0e88fda9104ba73c513bde267a230dfac14c5cb399"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useCreateNewWorkflow.ts:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useCreateNewWorkflow.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"65a74dc7fe87d576dbd4b81d9c36f5dde19733be3893c08abf06ee79b4769716"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useCreateNewWorkflow.ts:4 imports invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useCreateNewWorkflow.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"8589b37329136090d216934f40c7c62f4f7f32ef1dfe183a4bc43cb47746c283"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useDownloadCurrentlyLoadedWorkflow.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useDownloadCurrentlyLoadedWorkflow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"27be0d7efda16265b288fc10e8389f07511bd7d23c18742730fef89919a7144e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useDownloadCurrentlyLoadedWorkflow.ts:2 imports invokeai/frontend/webv1/src/features/nodes/util/workflow/buildWorkflow.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useDownloadCurrentlyLoadedWorkflow.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3a291e220ce1905da890ff1a736162db1a1fcdab860b937a41f579a01636698"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useDownloadWorkflowById.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useDownloadWorkflowById.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"53d5589a56e539048ab09e91d41f7d07c2cd4f0fa234013900ed7b685512aba2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useDownloadWorkflowById.ts:2 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useDownloadWorkflowById.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"baa7c58bcca2063266a871897d2ca1ba09784365956b36da630a6b861bdbf3e5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useGetFormInitialValues.ts:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useGetFormInitialValues.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2ac71c97ad540f99b16b6cc4de0eba1c8e867b70a60dc3eadaf8c08e3cbb74d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useGetFormInitialValues.ts:2 imports invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useGetFormInitialValues.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"908447c15f566bbd64f00e9c01fc831480ac8010ae17bf0e1910e577a9020e2e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useGetFormInitialValues.ts:3 imports invokeai/frontend/webv1/src/features/nodes/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useGetFormInitialValues.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"725693aabf6bd16a4c18bc99cb25dc3e93b59822b561eb7d74e1a617b45ed583"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useIsCurrentWorkflowOwner.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useIsCurrentWorkflowOwner.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b66baaa27fcc3b523fc0b5eb963b1a23baa021a41f12298e25ff316612e6a9d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useIsCurrentWorkflowOwner.ts:3 imports invokeai/frontend/webv1/src/features/auth/store/authSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useIsCurrentWorkflowOwner.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7904a3bfe20b94140e35e8c645635fb27d8a5087e943937c6e583a0c7832848"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useIsCurrentWorkflowOwner.ts:4 imports invokeai/frontend/webv1/src/features/nodes/store/selectors.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useIsCurrentWorkflowOwner.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e75a98a0ecb43e8decbceb11887c4613aa4391cebaf72b05dbeb81dfd01d5dc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromFile.tsx:1 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromFile.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd2897465f80436745d6853e8845aa7be0c2b153b905e42cbedc0a333b5d3b51"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromImage.ts:2 imports invokeai/frontend/webv1/src/features/nodes/util/workflow/graphToWorkflow.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromImage.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"28a5ca43ca5b308fcf4505f740252c13362f0d823376c70386fabc22bc6ba7dc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromImage.ts:3 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromImage.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"28329a59d814affb08e0a7564d4f0e06af6252a9c4aea885397e0ca6e6ed699d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromVideo.ts:2 imports invokeai/frontend/webv1/src/features/nodes/util/workflow/graphToWorkflow.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromVideo.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f00c44f65c259355c1758e01c1af16497d3c712c5a57284470b9e44afda9ad49"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromVideo.ts:3 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useLoadWorkflowFromVideo.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f5876476d630c3f8d500163a65cf9cbff73be974fdefc62f5843064dce16843"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useSaveLibraryWorkflow.ts:3 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useSaveLibraryWorkflow.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"9098b2e094662f022b2c6def0866404781c5b5018496a7af4d6e6c83fe2aca2f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useSaveLibraryWorkflow.ts:4 imports invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useSaveLibraryWorkflow.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ac51298ea7142eddc1c66378777a967e89aac408ee7a94721619b1b0f115ca6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useSaveOrSaveAsWorkflow.ts:1 imports invokeai/frontend/webv1/src/features/nodes/util/workflow/buildWorkflow.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useSaveOrSaveAsWorkflow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc82c8ca6f266cd40a86d268924f8c56d53596adbd59df744b2c75e282aeb85a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts:1 imports invokeai/frontend/webv1/src/app/logging/logger.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"039b16aaa8d55b7742fe9842ce55f11e7c687750f2a7bf2df0742a1768ba096b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:upward-import]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts:2 imports invokeai/frontend/webv1/src/app/store/storeHooks.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7eaccae48c4cc9f2d98cbe8fb0f6ff6b85b9ca6858adcbfee7415c5e014cf38"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts:3 imports invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/form-manipulation.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"1701fc952f11643bb38837010968d3d4316bf732aa12d7cc07aed573c7226990"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts:4 imports invokeai/frontend/webv1/src/features/nodes/hooks/useNodeExecutionState.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e60a55e3a916915b7d7c781d4c7fa46afa2c7d9e66cb6cb5d33ae7372c51857"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts:5 imports invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"2634aa3336c41e23909c22f957d0a82e1a61506bd217b07bcab93ea03e07d3b0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts:6 imports invokeai/frontend/webv1/src/features/nodes/store/reactFlowInstance.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fce331b49eabaca4e98acf850989ac44ba1d67b105c04d4c8b94494e6603901"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts:7 imports invokeai/frontend/webv1/src/features/nodes/store/workflowLibrarySlice.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8ded1a5e2c76438aaa6ca7b02ca35a13205f89513e4be5af5794e6715a89cb0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts:8 imports invokeai/frontend/webv1/src/features/nodes/types/error.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3c32bf588295eb1cc57ea233b2a63b1d104dd13b89b6d755a4f3ed069805e90"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts:10 imports invokeai/frontend/webv1/src/features/nodes/util/workflow/validateWorkflow.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5757c62c3f250b277b4767bf087d2f232881a5df5d8920d300e6e4e3b731659"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts:11 imports invokeai/frontend/webv1/src/features/toast/toast.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c44eb9ded3e01b6281395a91dd3d2ddaa17becc1ff7bb897f64bd0e3f3de371"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts:12 imports invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"d49fae7ea697f0d43eee8ce87e24ae815f20799723e8f446ff3c6f36fbec4464"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts:13 imports invokeai/frontend/webv1/src/features/ui/layouts/shared.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"69c5c88bc73cd68e0b241a70e25fb62ff927a382121ef4cc24408c2dc72721b4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.tsx:32 imports invokeai/frontend/webv2/src/features/identity/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"917ec141db61e293b2cfa734e60b37a59aa8e62b7496caeb6e24d2fd285b4efe"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.browser.test.tsx:32 imports invokeai/frontend/webv2/src/features/queue/contracts.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.browser.test.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8958a195431fbca22899f02eb84708792f37328d3273955febaf9a39c058aa1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/gallery/ui/GalleryProgressSection.tsx:5 imports invokeai/frontend/webv2/src/features/queue/contracts.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryProgressSection.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0f7955b79c9233bab454f5f3376bfac7316c94c0ed6fac7b4fc823c543bebe8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/gallery/ui/GalleryProgressSection.tsx:6 imports invokeai/frontend/webv2/src/features/queue/react.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryProgressSection.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"09fbb974c4c06f93f87afe342eb9c2645c733d670794e574b876eb31eab7580d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/generation/data/referenceImageUrls.ts:3 imports invokeai/frontend/webv2/src/features/gallery/utility.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/data/referenceImageUrls.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"5170f713811c828b5e512d8483866431e26590d6890bc6ab9fd5d38b97c045b3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx:27 imports invokeai/frontend/webv2/src/features/gallery/utility.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"bca30814149a092f7c2f23290f0974d237228af7803d1571c5461b2d6f60f238"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplateEditor.tsx:15 imports invokeai/frontend/webv2/src/features/gallery/mediaSlot.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplateEditor.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"40a43a94cb700fa2d89825616e3787408998586ef174bdc499e6f0fb07ea3bd8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplates.browser.test.tsx:7 imports invokeai/frontend/webv2/src/features/gallery/react.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PromptTemplates.browser.test.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a3f6b4ecc2e6ac8c4f513d732096903e57a34a16e54abc64d131fb8f6ce98a6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/generation/ui/promptFields/promptImageDrop.browser.test.tsx:4 imports invokeai/frontend/webv2/src/features/gallery/utility.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/promptImageDrop.browser.test.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"41d1db1d4af10d8c94de2763cad51d1de9933e9f003522fb77a1b3a2b230a3ee"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/generation/ui/promptFields/usePromptImageDrop.ts:4 imports invokeai/frontend/webv2/src/features/gallery/utility.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/usePromptImageDrop.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb3fcf96181fa58916861b32c3e2723e479e01d764eced620b42535e928473de"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/generation/ui/reference-images/GenerateReferenceImagesSection.tsx:14 imports invokeai/frontend/webv2/src/features/gallery/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/GenerateReferenceImagesSection.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"580c92deb1ad4d944e27333a710f261abfab3a4b4bed5503e3d73d7fcc5f4f5e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/generation/ui/reference-images/GenerateReferenceImagesSection.tsx:15 imports invokeai/frontend/webv2/src/features/gallery/picker.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/GenerateReferenceImagesSection.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e4465e9fa5a5bd3a09b85a5b83db17929915d03ff550005793043d29285326c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/generation/ui/reference-images/GenerateReferenceImagesSection.tsx:16 imports invokeai/frontend/webv2/src/features/gallery/utility.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/GenerateReferenceImagesSection.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"1350fbebfd29e3b604f45956d958f840ca7caf57473c9cb809b70ebecf382a71"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx:11 imports invokeai/frontend/webv2/src/features/gallery/mediaSlot.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae4bdd9677e69e40d4c7c5cfc22e9bf11444c2e9c11604eab9262735d80726ad"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx:6 imports invokeai/frontend/webv2/src/features/gallery/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3e94505d8bcb922e8f2f282eacd83186dc3a38cb3f1ebac763d8871b4668ff8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/intermediates/ui/IntermediatesSettingsField.tsx:4 imports invokeai/frontend/webv2/src/features/identity/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/intermediates/ui/IntermediatesSettingsField.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbc0217aa7d0f009dbdd4ca579e7d9474041a5d0dfeb4b49625e4b4b0e4ecf3b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/models/data/apiKeys.ts:1 imports invokeai/frontend/webv2/src/features/identity/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/data/apiKeys.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"485e2d0e7f7c09b46c2a256f706695a19c21dbd96e8c9a7f9c19d00276115256"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/models/ui/detail/ModelImageUpload.tsx:7 imports invokeai/frontend/webv2/src/features/gallery/mediaSlot.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/detail/ModelImageUpload.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c4014c7bdd69b78e7442e47a001a403c20425207d657cfffb80df9d4c213fdd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/models/ui/detail/ModelImageUpload.tsx:8 imports invokeai/frontend/webv2/src/features/gallery/picker.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/detail/ModelImageUpload.tsx"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"68ea591c9b221f7902ee131fdccc5a515464167219e8c0b788c54e990f7a3719"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/nodes/ui/detail/NodePackDetail.tsx:6 imports invokeai/frontend/webv2/src/features/workflow/react.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/nodes/ui/detail/NodePackDetail.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"de9c806e0e9bc3effc8173bd6c76f30246962cb11034bf02c3beea3f3ebcb5b0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/nodes/ui/detail/NodePreviewCard.tsx:10 imports invokeai/frontend/webv2/src/features/workflow/preview.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/nodes/ui/detail/NodePreviewCard.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"046b4bb761c3b315e38f8803cf696e0e451262f96c65dbdcccef48437b5a0523"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/nodes/ui/detail/NodePreviewCard.tsx:18 imports invokeai/frontend/webv2/src/features/workflow/utility.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/nodes/ui/detail/NodePreviewCard.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"222a07cb6ea1181244a10f9bb747874982a3998859824146ae68b48d596a1bd3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/upscale/core/graph.test.ts:4 imports invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.testing.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/core/graph.test.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"299470cea295daf691252d8666a5224370f3f85afbd6f80fc33f7ad5dc383ae8"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/upscale/core/graph.ts:9 imports invokeai/frontend/webv2/src/features/generation/graph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/core/graph.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"f037fa10a2732a453097b53f4b876e326876e2104fd4803d34ab9ed5c2c99854"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/upscale/core/graph.ts:20 imports invokeai/frontend/webv2/src/features/generation/settings.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/core/graph.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd61572bc9e313ad7d51a86cdfdbe06add97fb7d6ccd0b13a54b352f4beed152"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/upscale/core/integration.test.ts:3 imports invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.testing.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/core/integration.test.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b95d95823beb0fdd657052b892de4967ee4130c83e25a8d4925895dbe1ed324f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/upscale/core/settings.test.ts:4 imports invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/core/settings.test.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"7776a4a8c118bdb47cbae70617204d1a80d3a98bd80850bffb5d32cdcf82fc7d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/upscale/core/settings.test.ts:5 imports invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.testing.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/core/settings.test.ts"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b4849c2091d13dbee25b6eafa65f34508383f88e79a19eba79b0f6c7e62496f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/upscale/core/settings.test.ts:9 imports invokeai/frontend/webv2/src/features/generation/settings.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/core/settings.test.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d47ee6114de6e078287540b04e1b970c6127963543a29b82e93ddcf145709ef"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/upscale/core/settings.ts:11 imports invokeai/frontend/webv2/src/features/generation/settings.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/core/settings.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3e916d849ac363064d6f05429cd7be0a3e3d3398daeb7b8e20a46f77f3e547b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/upscale/core/upscaleGraphCoverage.test.ts:6 imports invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.testing.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/core/upscaleGraphCoverage.test.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"46f99317bb40b4904cb3cacd7a7bc91e0e080298fc11af143411ceea211a3ed6"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/upscale/ui/UpscaleFormFields.tsx:6 imports invokeai/frontend/webv2/src/features/generation/components.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/ui/UpscaleFormFields.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2b9b9531d6cd5e3f698db54ef47bcb56a0274f8a551ef24f0e10b8c2e1a3160"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/upscale/ui/UpscaleFormFields.tsx:7 imports invokeai/frontend/webv2/src/features/generation/settings.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/ui/UpscaleFormFields.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"9defc7c02da933607c4e3fab05a76892eb0515f678358321d43cdefc15dc0118"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/upscale/ui/UpscaleImageField.tsx:5 imports invokeai/frontend/webv2/src/features/gallery/mediaSlot.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/ui/UpscaleImageField.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"e60c348e167a4e3a347173a78708eaa6a6b7e50154ae6e8f3b50b8442a7fbf1c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx:19 imports invokeai/frontend/webv2/src/features/generation/components.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"d48872bd96b1523caf5cb64ffec3259e64d328ddc4e40f1959c78963cdc8680d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx:27 imports invokeai/frontend/webv2/src/features/generation/runtime.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"3394746083ee2665f401d60fddaf8f830881470830ec3bd876af3235a57bcd31"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx:33 imports invokeai/frontend/webv2/src/features/generation/settings.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"e16347f799b622e9bd886463da78ad4881f777ce0a0858ef495146bc46d58a15"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx:42 imports invokeai/frontend/webv2/src/features/models/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"0af69f264e540d152abeead07746c8c6688adfebe23d36438abfc2862de3dbc3"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx:50 imports invokeai/frontend/webv2/src/features/models/react.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"67704badff3c37356bf0b22dfc404509a96f01590f4799fc9ac3ff9c8d04379a"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/core/graph.ts:8 imports invokeai/frontend/webv2/src/features/generation/graph.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/graph.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"a111f00ccf34a0c22b01c4ee58f11ef078b4b3df5dc715429ebdb809b1a16e30"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/core/graph.ts:17 imports invokeai/frontend/webv2/src/features/generation/settings.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/graph.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e05643443a89d6e63ee6620dfff8606be9b86aa43be2826caaf127d7e0a3d8e"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/core/settings.ts:3 imports invokeai/frontend/webv2/src/features/generation/settings.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/settings.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e6c063b7dcc9a54448eeb5a1819bbf4435067f29c496e2fe0c8999a4a53f94c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/core/videoPolicies.test.ts:3 imports invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.testing.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.test.ts"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"d410f9f32eebaa5f539c62c580077a91c61cf8ce90ffcd636aa881e13b6af243"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts:11 imports invokeai/frontend/webv2/src/features/generation/settings.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3227a28766d5e043d093dd5ff916602f892d01e10ac5e57ac675022a7c4bce5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/core/widgetValues.ts:7 imports invokeai/frontend/webv2/src/features/generation/settings.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/widgetValues.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdcc774029eac628734b7eb06979222c89becef3d7c3216de3176f87a3429b08"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/PlayClipSpanButton.tsx:3 imports invokeai/frontend/webv2/src/features/gallery/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/PlayClipSpanButton.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"689af6c18bfc9c8669a20c2e743057a367948a75055bafb5f92ae03547ca4e4c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/TrimBoundThumb.tsx:2 imports invokeai/frontend/webv2/src/features/gallery/mediaSlot.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/TrimBoundThumb.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"df255638681e3f258eb00cc5effc1f0ed2a071f7243df87899c7868b5d8abce0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoComponentsSection.tsx:11 imports invokeai/frontend/webv2/src/features/generation/components.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoComponentsSection.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"428d7a8418db6bc0592c239580e792722f5d310addf31d02fab2bc2d63bb78fa"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoComponentsSection.tsx:12 imports invokeai/frontend/webv2/src/features/generation/settings.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoComponentsSection.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"4857fa99b2618afb989088db77aeea7d8c0164ef6a896347a8ff3522438238b1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoComponentsSection.tsx:13 imports invokeai/frontend/webv2/src/features/models/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoComponentsSection.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdc68ce673bf7cf7e34c7f5e34c948f8f9577bed56ef29b7aa0c47471fd80537"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoComponentsSection.tsx:14 imports invokeai/frontend/webv2/src/features/models/react.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoComponentsSection.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d3d4e8f24f1cc1a093f94fbd8e1a0196d4e069a75d4d7ff6f6be934aff9d628"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoConceptsSection.tsx:5 imports invokeai/frontend/webv2/src/features/generation/components.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoConceptsSection.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"becdfabf9ed271aa46f02310a86daa08a73b29dec3a575e5be746b37e62ee9d0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoConceptsSection.tsx:11 imports invokeai/frontend/webv2/src/features/generation/settings.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoConceptsSection.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"abe300ffa79e439fb771244a84db481cd04d4585f670349d9d165f235e1e2756"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoConceptsSection.tsx:12 imports invokeai/frontend/webv2/src/features/models/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoConceptsSection.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cae6c438cb322781116c697e53cac90d4b49c4c66415f61ee9f1c67dd5bf00d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoConceptsSection.tsx:13 imports invokeai/frontend/webv2/src/features/models/react.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoConceptsSection.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1072d9536f2d0bc74581fc313aa343cfee9341f137e4e4ece5016d93803aa18"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoConditioningClipField.tsx:5 imports invokeai/frontend/webv2/src/features/gallery/mediaSlot.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoConditioningClipField.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c7b9c1f05a1759a01dccf4e2a98939dcd4a909925bf045f119cd4a39d269915"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoFormFields.tsx:10 imports invokeai/frontend/webv2/src/features/generation/components.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoFormFields.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"351615629e8c18cca2fe6971f72a57c3d2b4b99d132f47d334e172712732945d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoFrameImageField.tsx:5 imports invokeai/frontend/webv2/src/features/gallery/mediaSlot.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoFrameImageField.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"feb4447bd7f7ed1f7e60172fe1d75986f10f4d54ee389d22042b0e40b2cd0734"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoHeaderActions.tsx:3 imports invokeai/frontend/webv2/src/features/models/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoHeaderActions.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb351489226d498bdd274c5b0c22cd91b8761df18cffda5f47926d0e3c9dfac7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoModelField.tsx:12 imports invokeai/frontend/webv2/src/features/generation/settings.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoModelField.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f7007e34e6477d3c0790b4aaa84be96f9d7cef6e54e5e57445cd3c4131df6cd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoModelField.tsx:13 imports invokeai/frontend/webv2/src/features/models/react.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoModelField.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"d44172b3c5b1717eb0d39c1e613655ea495d428f1f8b471d16a38a2b5d38f117"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx:13 imports invokeai/frontend/webv2/src/features/gallery/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"75bb196a7117beb8bfc2c1c0ea78042f02ffcd9072c8d44920b458227c0558bf"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx:14 imports invokeai/frontend/webv2/src/features/gallery/mediaSlot.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"57166db7699b723590c7540a10f6d953e3dc39c4266b2572ca87a1cced16c5da"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx:15 imports invokeai/frontend/webv2/src/features/gallery/picker.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e73e4f85f2bcfc5096a2703d5900d3b43249731b08cc28982e9dc798a0d1cc7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx:16 imports invokeai/frontend/webv2/src/features/gallery/utility.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c180b02d2cd1922906bc21f5184580e2e24da99466e002a0ebc774e32d95cc7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoSourceClipField.tsx:5 imports invokeai/frontend/webv2/src/features/gallery/mediaSlot.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoSourceClipField.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"ece55903643e462fd2be1ac3f14aaa16434d408ff4a52c8c1e964dc4f43a266f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoSourceClipField.tsx:6 imports invokeai/frontend/webv2/src/features/gallery/utility.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoSourceClipField.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"76cd1e650748b0cf525ff7fd54e15bec4ab8eed18097222188d672ed622644d2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx:9 imports invokeai/frontend/webv2/src/features/generation/components.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"0620d65e3307af8703f9e9c6618fafb0ec0d073d29e5bd6e411bde0d05769046"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx:10 imports invokeai/frontend/webv2/src/features/generation/settings.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"99ea98cb617b4bf932d9f04cea16d6793fc1162c0da18ecd6de0d6c9cc016812"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx:11 imports invokeai/frontend/webv2/src/features/models/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"502027c8c66b157a865b11e923b8a8b531132fa447ed3926a1b80fdf59970f22"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/videoConditioningClipRole.browser.test.tsx:7 imports invokeai/frontend/webv2/src/features/gallery/react.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/videoConditioningClipRole.browser.test.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e60bcc80062028b806752015b258b846665b8395c3f7f19a6d2902c7000054c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/videoConditioningFindInGallery.browser.test.tsx:6 imports invokeai/frontend/webv2/src/features/gallery/react.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/videoConditioningFindInGallery.browser.test.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa6bc9715d6484a0c07e222255204e54b874de6cbeb128e85bcb9750c48f2a2b"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/video/ui/videoReferencePlaySpan.browser.test.tsx:7 imports invokeai/frontend/webv2/src/features/gallery/react.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/videoReferencePlaySpan.browser.test.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"34e186904f21175cbff96e3d97390173febda7e32a055826632cd995d8c4fb6d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/core/fields.test.ts:1 imports invokeai/frontend/webv2/src/features/generation/settings.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/fields.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0542ef2059a84c3b930cc1289c574329ca8a8c5b6899de8b26e1c39b61a3bf1"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/data/generatorQueries.test.ts:1 imports invokeai/frontend/webv2/src/features/gallery/queries.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/data/generatorQueries.test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1cea884d26314715d03834e7831211151d42a877fb42cc9c7a067cc446366e2"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/data/generatorQueries.ts:11 imports invokeai/frontend/webv2/src/features/gallery/queries.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/data/generatorQueries.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"17ab5442e22c96d363031d71186dbe5fc9a3166330b56270e3392760e46ed795"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/data/generatorQueries.ts:12 imports invokeai/frontend/webv2/src/features/generation/prompts.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/data/generatorQueries.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb9bfe003310dc99f4f10067fac4277f31e12e05040cd8f9ea872112b5be19a5"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/editor/CurrentImageFlowNode.tsx:5 imports invokeai/frontend/webv2/src/features/queue/react.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/CurrentImageFlowNode.tsx"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"001fc1520fcfd6d435662c9b37188dd45691a9e9b90d5658d1f08e9af9702bfd"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.browser.test.tsx:13 imports invokeai/frontend/webv2/src/features/gallery/utility.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.browser.test.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"18f4d7556cd5106e41eaa30c85521a922e8819557d5786ed3823a2dca09dcf72"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx:4 imports invokeai/frontend/webv2/src/features/gallery/queries.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ff04fd1e8e33497a7b392159374fd918b894abc6999241ac11bdc2f9d295b38"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/fields/RecordPickerInput.tsx:2 imports invokeai/frontend/webv2/src/features/generation/queries.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/RecordPickerInput.tsx"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e82af9b0e0af1164f554fea37ded978f69639dddcb284155e9bda48112cfb8ed"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/fields/RecordPickerInput.tsx:3 imports invokeai/frontend/webv2/src/features/generation/systemPrompts.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/RecordPickerInput.tsx"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"699478145395b4778b9986640db3a03b9120b8dc2dc8a4f50cb4342fbdd652f4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.browser.test.tsx:6 imports invokeai/frontend/webv2/src/features/gallery/react.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.browser.test.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"0465cb74b50cd0f2ed197d4861a5448aaab4e2308ddd559fda2874e27cbfefbb"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx:24 imports invokeai/frontend/webv2/src/features/gallery/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"9506603b97dcb19e08c54b75594334088496d61b2d1204fa2b0c16d9cb6b0b63"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx:31 imports invokeai/frontend/webv2/src/features/gallery/contracts.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"1beae1e588fb77b95d34136566596292fd1c46bebd41677388d7fd787e2c8631"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx:37 imports invokeai/frontend/webv2/src/features/gallery/mediaSlot.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"5da8bcaac6bb8da0d047dbd3980545bb8fea03661493c6a90f91fe7ac7fee4e4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx:38 imports invokeai/frontend/webv2/src/features/gallery/picker.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"138b5f125e4255f95476eebb71e7ac563ea3adf2726b9ca50e03dcdf13a52e26"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx:39 imports invokeai/frontend/webv2/src/features/gallery/queries.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"38d797b9168a920c500f895ccbe45e16ff362bb02f2d64ed0a8949428c63e292"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx:45 imports invokeai/frontend/webv2/src/features/gallery/react.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"4762828d5802f80877fdc6e6bcfcb81a137767dce4cdf22583cef8884f644dbc"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx:46 imports invokeai/frontend/webv2/src/features/gallery/utility.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"8354b964e292f7016b821ce61369125684c03f2f0afc9cf7069c513715604e37"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx:47 imports invokeai/frontend/webv2/src/features/generation/settings.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"99138ff36ab6f736ca3ecc259e2de60f30c42e62aa06c3b5f98add66398829fe"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx:129 imports invokeai/frontend/webv2/src/features/models/react.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"839c59a9db9079819d964a704156665f0943f16dea08fa1131694f7e69daa54d"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/fields/mediaFieldDnd.ts:1 imports invokeai/frontend/webv2/src/features/gallery/utility.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/mediaFieldDnd.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b00aabbfe066fb43bba00e8996a2781414f4632ee64fda8dbf6a427fa301b1a7"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryCard.tsx:4 imports invokeai/frontend/webv2/src/features/models/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryCard.tsx"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"52a9f642a35b5cc4699a364b3747810e0ca9f0ff379b1db731487d9c4cbe6ae4"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.browser.test.tsx:10 imports invokeai/frontend/webv2/src/features/gallery/picker.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.browser.test.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"e26160fe794c4856be9375d127f05cce95d874a46857549720a8da3f3de7697c"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.tsx:7 imports invokeai/frontend/webv2/src/features/models/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fa469f19efd41a8f60292998f53c1624f3ef466dfe736fa35076f32de40ef65"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDialog.browser.test.tsx:21 imports invokeai/frontend/webv2/src/features/gallery/picker.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDialog.browser.test.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ee5090512ea436654102409843f8a5374ada8b66b835bdd038e3d7c26dab5f0"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryThumbnail.tsx:7 imports invokeai/frontend/webv2/src/features/gallery/picker.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryThumbnail.tsx"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"90be6b26fd8fce54dde55db05848eafd9e15bed3d20d3ffaa2c68ac8b5c6d048"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowRequirementsList.tsx:11 imports invokeai/frontend/webv2/src/features/models/index.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowRequirementsList.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a7d7c2adc23624821893b9487bf25e0ce607d9e7d52539b6698762e504d260f"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/library/projectWorkflowEntries.ts:4 imports invokeai/frontend/webv2/src/features/gallery/utility.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/projectWorkflowEntries.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad3be7574461989d51b7817bc5b636d4fc6e0399ad51149a1ea30a61add1bf95"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/linear/NodeInspector.tsx:10 imports invokeai/frontend/webv2/src/features/gallery/mediaSlot.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/linear/NodeInspector.tsx"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"daf7106a99ea8a20e17ba513e0cf712f8dd6ce11eb16d0e55dd5e47d59802b38"}},{"ruleId":"R11","level":"warning","message":{"text":"Boundary violation [fsd:cross-slice]: invokeai/frontend/webv2/src/features/workflow/ui/linear/NodeInspector.tsx:11 imports invokeai/frontend/webv2/src/features/gallery/utility.ts against the feature-sliced rules."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/linear/NodeInspector.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"15ff261e15c40c77865892285a8895b5b9fce404ba09db527ecbe0e12730347d"}},{"ruleId":"R11","level":"error","message":{"text":"Slice dependency cycle (6 slices): invokeai/frontend/webv1/src/features/auth \u2192 invokeai/frontend/webv1/src/features/toast \u2192 invokeai/frontend/webv1/src/features/controlLayers \u2192 invokeai/frontend/webv1/src/features/cropper \u2192 invokeai/frontend/webv1/src/features/gallery \u2192 invokeai/frontend/webv1/src/features/changeBoardModal \u2192 invokeai/frontend/webv1/src/features/auth. These directories depend on each other in a closed loop, so none of them can be understood, tested or extracted on its own. Verified edges: invokeai/frontend/webv1/src/features/auth/components/UserMenu.tsx:6 \u2192 invokeai/frontend/webv1/src/features/toast/toast.ts; invokeai/frontend/webv1/src/features/toast/toast.ts:3 \u2192 invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts; invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx:12 \u2192 invokeai/frontend/webv1/src/features/cropper/lib/editor.ts; invokeai/frontend/webv1/src/features/cropper/components/CropImageEditor.tsx:17 \u2192 invokeai/frontend/webv1/src/features/gallery/store/gallerySelectors.ts; invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemChangeBoard.tsx:3 \u2192 invokeai/frontend/webv1/src/features/changeBoardModal/store/slice.ts; invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx:6 \u2192 invokeai/frontend/webv1/src/features/auth/store/authSlice.ts. One verified cycle inside a mutually-dependent group of 26 slices: invokeai/frontend/webv1/src/features/auth, invokeai/frontend/webv1/src/features/changeBoardModal, invokeai/frontend/webv1/src/features/controlLayers, invokeai/frontend/webv1/src/features/cropper, invokeai/frontend/webv1/src/features/customNodes, invokeai/frontend/webv1/src/features/deleteImageModal, invokeai/frontend/webv1/src/features/deleteVideoModal, invokeai/frontend/webv1/src/features/dnd, invokeai/frontend/webv1/src/features/dynamicPrompts, invokeai/frontend/webv1/src/features/gallery, invokeai/frontend/webv1/src/features/imageActions, invokeai/frontend/webv1/src/features/lora, invokeai/frontend/webv1/src/features/metadata, invokeai/frontend/webv1/src/features/modelManagerV2, invokeai/frontend/webv1/src/features/nodes, invokeai/frontend/webv1/src/features/parameters, invokeai/frontend/webv1/src/features/prompt, invokeai/frontend/webv1/src/features/queue, invokeai/frontend/webv1/src/features/sdxl, invokeai/frontend/webv1/src/features/settingsAccordions, invokeai/frontend/webv1/src/features/stylePresets, invokeai/frontend/webv1/src/features/system, invokeai/frontend/webv1/src/features/systemPrompts, invokeai/frontend/webv1/src/features/toast, invokeai/frontend/webv1/src/features/ui, invokeai/frontend/webv1/src/features/workflowLibrary. Break the loop by moving the shared piece into a lower layer (shared/entities) that both slices may import."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/UserMenu.tsx"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"20a4a0d05158d3a7d362ac74966715a7d848b840050d0db80d127d2532485f78"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 586, cognitive 957): (anonymous) has cyclomatic complexity 586 and cognitive complexity 957; 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":"invokeai/frontend/webv2/scripts/mock-backend.mjs"},"region":{"startLine":937}}}],"partialFingerprints":{"codehealthFindingId/v1":"dde354fcb43527a090aee15ba5ba5896c46c551d66d6cf1d184823623bb51fe0"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 241, cognitive 183): (anonymous) has cyclomatic complexity 241 and cognitive complexity 183; 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":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":3894}}}],"partialFingerprints":{"codehealthFindingId/v1":"27def0815f8bb67d7b1cc62237d75a9f80c4145fbd1490bfc897ea2580bb7df3"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function effect (cyclomatic 209, cognitive 574): effect has cyclomatic complexity 209 and cognitive complexity 574; 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":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fbfbf2b18237a3d80c551168d49375c576d2f76057be24879ccd903dc4ebcc4"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function getReasonsWhyCannotEnqueueCanvasTab (cyclomatic 145, cognitive 294): getReasonsWhyCannotEnqueueCanvasTab has cyclomatic complexity 145 and cognitive complexity 294; 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":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":773}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e12cadf166cedd1e1aa62eb719e48478a12ab12b549b02d4e41b15726489005"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 111, cognitive 147): (anonymous) has cyclomatic complexity 111 and cognitive complexity 147; 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":"invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts"},"region":{"startLine":497}}}],"partialFingerprints":{"codehealthFindingId/v1":"088aa496cf9def743bdbe15a09d0a93c0a0f4ca021a44b37da3087a1ca80577b"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 102, cognitive 126): (anonymous) has cyclomatic complexity 102 and cognitive complexity 126; 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":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":2291}}}],"partialFingerprints":{"codehealthFindingId/v1":"13f06ae8305aa4f88c5d44d67f807786e1e70417ec94ab179565a32b2b9ef2f1"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function GalleryImageGrid (cyclomatic 97, cognitive 86): GalleryImageGrid has cyclomatic complexity 97 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 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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.tsx"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"cccee93a156c2829b2ffb5da2b61347000e0d91607fc0911a508bb3b71160150"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 95, cognitive 129): (anonymous) has cyclomatic complexity 95 and cognitive complexity 129; 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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/canvasHotkeyCommands.ts"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"e737a90d65ae96e4fdf7c9e948a256c7fad6dcc6e1426a474eadcb2dfa41644c"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 94, cognitive 159): (anonymous) has cyclomatic complexity 94 and cognitive complexity 159; 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":"invokeai/frontend/webv2/src/workbench/image-actions/recallParameters.ts"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c1902c030cafedfca31df10bb0c74a95db4929e169df61a6f29074de8d388ec"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 94, cognitive 61): (anonymous) has cyclomatic complexity 94 and cognitive complexity 61; 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":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRunRestoration.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"517b29ebaea2185958be784288520983db7ed7979232d267caa88da99fd83d1b"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function getReasonsWhyCannotEnqueueGenerateTab (cyclomatic 89, cognitive 148): getReasonsWhyCannotEnqueueGenerateTab has cyclomatic complexity 89 and cognitive complexity 148; 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":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d87a3f4625acbb40ac3689fb84d9cca1d09f99605ab08d1c3487aaa742dad20"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 89, cognitive 77): (anonymous) has cyclomatic complexity 89 and cognitive complexity 77; 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":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryData.ts"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"364f588f5e3c465378f9541d83ce1f7aff4a8d31ee952054db157999214aab94"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function VideoWidgetView (cyclomatic 83, cognitive 75): VideoWidgetView has cyclomatic complexity 83 and cognitive complexity 75; 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":"invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"c738a8b4d3955348a9b5424377c29566082c4443d4c6124546b12173898adce8"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 81, cognitive 72): (anonymous) has cyclomatic complexity 81 and cognitive complexity 72; 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":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":3555}}}],"partialFingerprints":{"codehealthFindingId/v1":"c09440900cfe3f3f4bb53063bab14a80ecab9ac13120820e80bf7f64df238d1c"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 73, cognitive 164): (anonymous) has cyclomatic complexity 73 and cognitive complexity 164; 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":"invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"c894f2cb12a39b144e4de3372440c7de913ca81348e78aa9f1fe9e1e16bec973"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 73, cognitive 57): (anonymous) has cyclomatic complexity 73 and cognitive complexity 57; 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":"invokeai/frontend/webv2/src/features/workflow/core/document.ts"},"region":{"startLine":907}}}],"partialFingerprints":{"codehealthFindingId/v1":"618e635c280346f7dfcec1e78e5b2525a81f2537f37ee4a01a094e5e917a9239"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 72, cognitive 122): (anonymous) has cyclomatic complexity 72 and cognitive complexity 122; 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":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a43603ac4d1ca1924f1888e08fa8f757d1878754bb2e95546a2adde75e49b1d"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 71, cognitive 90): (anonymous) has cyclomatic complexity 71 and cognitive complexity 90; 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":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":1972}}}],"partialFingerprints":{"codehealthFindingId/v1":"835f1d79323e31a38107937b50b08906941d4d32ef8864e96382d7ffa8c00cbb"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 69, cognitive 129): (anonymous) has cyclomatic complexity 69 and cognitive complexity 129; 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":"invokeai/frontend/webv1/src/features/nodes/util/workflow/validateWorkflow.ts"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"edeca6a5c305c6c5d919d72dae8a227bd7a2d78e4d5b469376c9eaddb2b7f0bb"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 69, cognitive 73): (anonymous) has cyclomatic complexity 69 and cognitive complexity 73; 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":"invokeai/frontend/webv2/src/features/video/core/graph.ts"},"region":{"startLine":654}}}],"partialFingerprints":{"codehealthFindingId/v1":"be56fec9dd5f4924afeaf91d1ac689c8b665ecc9b9fe4811ec59426b16a917de"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/workbenchState.ts: 5287 lines of code: invokeai/frontend/webv2/src/workbench/workbenchState.ts has 5287 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/workbenchState.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb4fdbb9f0cc953d1937b514e182d35f94cdf2dae40601dae581b1ba764e910e"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts: 3700 lines of code: invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts has 3700 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b21691dd06fa4a718972aca3dc2e401842d200afaf9daa995d05234cafaf99a"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx: 2950 lines of code: invokeai/frontend/webv1/src/features/metadata/parsing.tsx has 2950 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a1f6ff72aeeb1eede445150602c308ac9dec9f1fbc360ebcf6d4a711652b0ff"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts: 2790 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts has 2790 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc14b474a7002cd3fb88ed9f73a4bef4483a88a61824624acdd6fe9dee653cbc"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/queue/runtime.ts: 2388 lines of code: invokeai/frontend/webv2/src/features/queue/runtime.ts has 2388 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"915df53c11a29146625e656ff8dc88cd0b54afbe5a50d81dc10e67ce9d0cacb5"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts: 2277 lines of code: invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts has 2277 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"96342a4801c31c09a583838eecb66345c53aad76d597af0246dd3a2d9e57c8a2"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts: 2001 lines of code: invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts has 2001 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/canvasSlice.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"02701fbd40ce9471102d14e6f55550bf234630cbc61984815611073fd361b854"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx: 1961 lines of code: invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx has 1961 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6265d989ab96da5c9cf92b6cec2f9c26110ce5b239b85c257f048e4858006d7f"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.tsx: 1927 lines of code: invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.tsx has 1927 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryImageGrid.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc7b618756c10e8d789957b1bdfeebfba7b89633a839f2d4e8069b710067d69e"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/nodes/store/util/testUtils.ts: 1841 lines of code: invokeai/frontend/webv1/src/features/nodes/store/util/testUtils.ts has 1841 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/util/testUtils.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"276319e27a5f685c5aa45c9c05a19b03965a5e7c1d6b6ee510f8803502b84f2d"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/nodes/types/field.ts: 1629 lines of code: invokeai/frontend/webv1/src/features/nodes/types/field.ts has 1629 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/field.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed06a2c5b2e011d699f98f18b828acd1562c91ae411259b03fbf25ea34cefad9"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts: 1625 lines of code: invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts has 1625 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1779d8c26e2137dc97919e2b46c2574c722e9e2eff25365557f72dcfea20367"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts: 1583 lines of code: invokeai/frontend/webv2/src/workbench/projects/draftStore.ts has 1583 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/draftStore.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cab3d6dcfc00f3cec877f47f76330e29972d23df9cbd5cc84f70c8cd9c1f493"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/generation/core/graph.ts: 1554 lines of code: invokeai/frontend/webv2/src/features/generation/core/graph.ts has 1554 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/graph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"960e03528cf3f770439d99bc47d7caccc1ad571722a27eed5addc2a3fcf5b445"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts: 1542 lines of code: invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts has 1542 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1644b74f9d5cc8ca53017f27d0e20c57eb62a4b560d2be02fce162b20a54fd3"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts: 1527 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts has 1527 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"17946c606848412d64b6c6c882d510749832ba186a18919a6ea8e5a561fbae0c"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts: 1471 lines of code: invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts has 1471 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a0eea1ba31920375a71514e7a40fe11e3897086052c23220981db6787d83a07"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts: 1446 lines of code: invokeai/frontend/webv1/src/features/queue/store/readiness.ts has 1446 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/queue/store/readiness.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"40f1e661643dd62c8f686bc566514c9f6a54bfe5c503b862d6f23b460f23f944"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/gallery/data/backend.ts: 1391 lines of code: invokeai/frontend/webv2/src/features/gallery/data/backend.ts has 1391 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/data/backend.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3de6a85a7ead7b2f5c931e90653e7d8b0f3304ee791b770e459770e450187d7d"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts: 1383 lines of code: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts has 1383 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5929aa4bc2945c9126cefaaa59d57137647a395fcf94bb70ffa4fa564b3c850c"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/cropper/lib/editor.ts: 1336 lines of code: invokeai/frontend/webv1/src/features/cropper/lib/editor.ts has 1336 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/cropper/lib/editor.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed6c8e52f8cce3079a7443af37d8fad47ddd0ad67743719a868692ddcf29d19b"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/platform/ui/theme/recipes.ts: 1333 lines of code: invokeai/frontend/webv2/src/platform/ui/theme/recipes.ts has 1333 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/theme/recipes.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f7a20df33014f98f651101248df6b0d982ead8d0b45e60ebc0155cb1ad5e79d"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx: 1316 lines of code: invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx has 1316 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"11965e9b42a134186af294da35422c17a06cba84bb4e733c7501fbe371a89d0b"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayersTree.tsx: 1278 lines of code: invokeai/frontend/webv2/src/workbench/widgets/layers/LayersTree.tsx has 1278 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayersTree.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0640242937ecc00046361bbeaefae0f972d9ff822285be06a83e57a32ccec50"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx: 1234 lines of code: invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx has 1234 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/WorkflowEditorView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"825b3a39b14bbec5d5b021e1bac058a74c145a32afca904f9140f207ac2ef14f"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts: 1203 lines of code: invokeai/frontend/webv1/src/features/controlLayers/store/types.ts has 1203 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/types.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"30612e97a747c713c99cac05474ee42c7537c10db66bbb4add0ef716c6f16cfc"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts: 1162 lines of code: invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts has 1162 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/imageRecall.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a0df453bfe341ead20a14762f9f43b8ffba22ad3d3e01dace8c155a65018c79"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts: 1113 lines of code: invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts has 1113 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/useImageActions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9960c246eb353de537102834ab0737349d823ec0835c05a110a9bff0736ce405"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/services/api/endpoints/images.ts: 1108 lines of code: invokeai/frontend/webv1/src/services/api/endpoints/images.ts has 1108 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/images.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfe5fd2e95eeeaed5763a7a4bc7384150858ceecfbbc8136e901f7e8de8cf1bc"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/queue/runtime/coordinator.ts: 1105 lines of code: invokeai/frontend/webv2/src/features/queue/runtime/coordinator.ts has 1105 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime/coordinator.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8faf24acd002a843d528720b165320db1ce731c11d6a305022a90b8eaabbcb94"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx: 1086 lines of code: invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx has 1086 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/ImageContextMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9510b299468519e62b6d8a8eab0754273fbbc8d9093779a2b5d9145d7c8adc6"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/core/document.ts: 1081 lines of code: invokeai/frontend/webv2/src/features/workflow/core/document.ts has 1081 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/document.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9ab8aad22cdacf18597fbccc062ddb6e4fd5623e981cb8614f4f469de61c9a4"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts: 1067 lines of code: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts has 1067 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityTransformer.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"80afed38096f64276b73c5ac899090461aa3bf2954fd336e6edc8e9cb7f56e2f"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/video/core/graph.ts: 1059 lines of code: invokeai/frontend/webv2/src/features/video/core/graph.ts has 1059 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/graph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"91d507c85376f9005ca7e2a4c642aebe71b08b41c0cd2d24f78c8d0e3a8e15e2"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.tsx: 1041 lines of code: invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.tsx has 1041 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/InvocationFlowNode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"23c8faa22c85b19de8bd3a6136904a8e3edd72a6a446252168a16f1d165abd71"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx: 1033 lines of code: invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx has 1033 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/components/Picker/Picker.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b033bb3864022e7f302a29f400ae2f2df6499a68b4b96627cb70858a7a708d8"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts: 1019 lines of code: invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts has 1019 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/store/nodesSlice.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8b4d5bf69e4ac6460cd4d00e949e69164a172ab47aea73f074466924017cbd0"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerContextActions.ts: 1008 lines of code: invokeai/frontend/webv2/src/workbench/widgets/layers/layerContextActions.ts has 1008 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerContextActions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"21ef42bd1d9f974557d0b1c636ee296ca4a627f40812a2190ae662fa7f1113f1"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/upscale/core/settings.ts: 1004 lines of code: invokeai/frontend/webv2/src/features/upscale/core/settings.ts has 1004 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/core/settings.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9c01371ee52e8dc21344e51f8beea5f8a8fea487364f0167bd832c50cc1a564"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/video/core/settings.ts: 991 lines of code: invokeai/frontend/webv2/src/features/video/core/settings.ts has 991 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/settings.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e2ea9edd96eea5b78d0bdb56869d9f1096dcac4df72f37b0baadba25a21e13f"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/gallery/data/queries.ts: 978 lines of code: invokeai/frontend/webv2/src/features/gallery/data/queries.ts has 978 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/data/queries.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8383cf9b1f6d1ffccca89baac164169d010149cf1864f4d1007e676c082c3449"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx: 975 lines of code: invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx has 975 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/PositivePromptActions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a68f99d906d336be8bb46972a637bfcef4e3e2c3308167d6b4fc8b10fbee9ba5"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts: 973 lines of code: invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts has 973 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"85d2eb7d4456ba3c2ebf0b52059dff3c1afdbb74866c895cab288f4022e524b5"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/upscale/core/graph.ts: 966 lines of code: invokeai/frontend/webv2/src/features/upscale/core/graph.ts has 966 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/core/graph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"499912d0ad187abb72f26d01d3f14b04e162a3797097b6e2d5fddc0aadb8a9d6"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx: 954 lines of code: invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx has 954 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a242df336bf695fdb56f018b9d19d245b9bd3ae777a1a72c66565560409b40ad"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewNavigation.ts: 952 lines of code: invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewNavigation.ts has 952 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewNavigation.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"732bbb99c78e5e677e6e12f08d9a254c6bb6a09889762c1954b9253bf96d7ae8"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/workbenchStore.ts: 949 lines of code: invokeai/frontend/webv2/src/workbench/workbenchStore.ts has 949 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/workbenchStore.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"194fee9d5fd337bc98fa7ab9d4243f4ba4dee228f92136d4fa9c9948d11269bb"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx: 943 lines of code: invokeai/frontend/webv1/src/services/events/setEventListeners.tsx has 943 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"19964eb00a1994f7884a25acf5734bf574b786b897fa1e20a8ed9de3d39e1892"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts: 902 lines of code: invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts has 902 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6145e42b204739de401e63f7383f28959f0433f35df9c04b915f19148a98de09"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewWidgetView.tsx: 883 lines of code: invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewWidgetView.tsx has 883 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewWidgetView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a9bf67a75f4b30813973f534cda971c5b26c6a3722514fe6479cf07fd1663d5"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/services/api/types.ts: 870 lines of code: invokeai/frontend/webv1/src/services/api/types.ts has 870 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/types.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2ea268b7c7d2e0b5311669588928775d01e54512f2d6b9c658d9451533c420d"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts: 862 lines of code: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts has 862 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"147277742481efbf182df368d817006a899da933eed9324c6c62439b4302ee6b"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/generation/core/settings.ts: 856 lines of code: invokeai/frontend/webv2/src/features/generation/core/settings.ts has 856 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/settings.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"31ba7d728c438063be832f59e0b69b044cfc349e02f9bf7403a8b7d006bda3c9"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx: 856 lines of code: invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx has 856 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/ui/UpscaleWidgetView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"250ecd57c086de82349ad0bc311a8f1aaa2989232661decb88b475934d169b54"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/identity/session.ts: 845 lines of code: invokeai/frontend/webv2/src/features/identity/session.ts has 845 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/identity/session.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fd8da4bdc442e58a64463ed2c64e43dbed2642925c81e5a4a6c6db500431e32"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryData.ts: 842 lines of code: invokeai/frontend/webv2/src/features/gallery/ui/useGalleryData.ts has 842 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/useGalleryData.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ba3902b931ff75b5fe2a69cb5eb0d48d892e3d550be94f82097779936ed384e"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts: 831 lines of code: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts has 831 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildFLUXGraph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e371239bef174096a838a0d98af79b1e6c1d655fdf498f69e765167370af53df"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/ui/editor/AddNodeDialog.tsx: 820 lines of code: invokeai/frontend/webv2/src/features/workflow/ui/editor/AddNodeDialog.tsx has 820 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/AddNodeDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc4e0e99267522f89e145909f84ce09307166b73fa59027a0f54b8d72000ded2"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts: 810 lines of code: invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts has 810 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/draftStore.contract.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"55f0e0042e77b783dfae981475229e1a52c907b390c714e592b99343e9340892"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/TextOptions.tsx: 806 lines of code: invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/TextOptions.tsx has 806 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/TextOptions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfe8f6e071fc5a7eb3fc60aa5ac19a5f8c1421e4e51dfd9e37234766f0a61e70"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/common/util/promptAST.ts: 805 lines of code: invokeai/frontend/webv1/src/common/util/promptAST.ts has 805 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/util/promptAST.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b0c68e10b3ac3c7ccbb6df6654100e423d66fd738897118a6337fe1af351567"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts: 801 lines of code: invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts has 801 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/unloadJournal.scenarios.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6572b1cb3b0caf89cef42ca09a95f0d10157a833382c1cd48a5a28f10c041bb7"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx: 792 lines of code: invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx has 792 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoWidgetView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d55cecf9abce6638c024ad0cd2e3bed10e9b696e6dda817f4c6fe2a30623b3df"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widget-frame/FloatingWidgetWindow.tsx: 762 lines of code: invokeai/frontend/webv2/src/workbench/widget-frame/FloatingWidgetWindow.tsx has 762 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widget-frame/FloatingWidgetWindow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eee98159e6da094bc718d7ad170e4783fe5fd1b64b85ad353b5a5fdc54c6038c"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts: 760 lines of code: invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts has 760 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/videoRecall.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5873ca294a62c3e5ab32d9ec51b16583ccbd80e4481bcca6d96ff45892b3ccc"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts: 757 lines of code: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts has 757 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"82b91069bd23b75510267ababfc90ebe3a82dc2eba30a6994b293edcde7f6600"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/capabilities.ts: 754 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/capabilities.ts has 754 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/capabilities.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b0a6b3f8697b125cdc9295ae0f059e601ea1ff378e17f1da9d1a9f1b6ea59fa"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts: 750 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts has 750 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c02c3b579dedcc5fffd4b8f2186dfa4169a869e4af1e494f0065a7bb54f95e7c"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.tsx: 746 lines of code: invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.tsx has 746 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/fonts/ui/FontsPage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e530a5446b5f457e03087f01bf579a34fd7e17238fd6baf032fd14022e1770ca"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/ui/editor/workflowImageExport.ts: 745 lines of code: invokeai/frontend/webv2/src/features/workflow/ui/editor/workflowImageExport.ts has 745 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/workflowImageExport.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"72c2e54905a7013a7fb8bb99ff24215a1c36175ff616a78384bf6997fc6b004c"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts: 738 lines of code: invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts has 738 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a68d04e8b9cf02cce74dfa3b198658a022b1e608561ff0e53b9446f9725c0789"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts: 736 lines of code: invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts has 736 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8c84ced69b5728fd8315067e092fc61825133389730af0ebaab99c7a6e262c9"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/gallery/data/queryCache.ts: 735 lines of code: invokeai/frontend/webv2/src/features/gallery/data/queryCache.ts has 735 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/data/queryCache.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b433d6b9a05004217803384a263d0bab00c6034d186e977766450e3a8fc9c7f6"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/core/batch.ts: 734 lines of code: invokeai/frontend/webv2/src/features/workflow/core/batch.ts has 734 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/batch.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af518debd7aea89d175588b5cac647ed5e0dbfb794cd2d0eaba9dd210ff47948"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts: 721 lines of code: invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts has 721 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/prompt/ast.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f533fff5eb8333d054c4923526532d9f61f9e6e69acd8254f72681dddb82194f"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts: 719 lines of code: invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts has 719 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/executeVideoRecall.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ec3aeda480f37079598b519130ab76c6a94cdd09f51b5dd47c9d8f1c2774ce4"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx: 713 lines of code: invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx has 713 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/ui/VideoReferenceListField.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6376f61a7e70ea7d1f4d765de6566f3f799d59d7b52e000e6e592849dd966dbf"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/ui/linear/FormBuilderTab.tsx: 705 lines of code: invokeai/frontend/webv2/src/features/workflow/ui/linear/FormBuilderTab.tsx has 705 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/linear/FormBuilderTab.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d2e5e02332effad14025b6d140189e824398e77af99bd7aafe7c5d5e23d99d0"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx: 701 lines of code: invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx has 701 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"433daf29d90abefa51c35cc87375f2e999afd9c237d67b94a0d2c65fe2b3eca4"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx: 698 lines of code: invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx has 698 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bd10c18deaa55951eabe66fa16a0030730effbd49d8859cfcb3a8c6afdd4086"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts: 698 lines of code: invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts has 698 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/forLoops.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aab55c99875c224fcd82068c7703768a383e898e9ae4ba19a999482ea9dfeafc"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvasMigration.ts: 698 lines of code: invokeai/frontend/webv2/src/workbench/canvasMigration.ts has 698 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvasMigration.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"107481076364d015d5b9184d648e3c5aec0d2f263f7fb49e9c1f01a3529fb8d9"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/dnd/dnd.ts: 696 lines of code: invokeai/frontend/webv1/src/features/dnd/dnd.ts has 696 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/dnd/dnd.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce9bea1d2bb6c1eca0d5236b6575f8e9f4eec5794108a91996d176da4d886aef"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/persistenceRuntime.ts: 693 lines of code: invokeai/frontend/webv2/src/workbench/persistenceRuntime.ts has 693 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/persistenceRuntime.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"048114e7e2269f890ece15a59f6012bd178776d00de768a0529497ff0de4694a"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/platform/ui/ScrubberField.tsx: 691 lines of code: invokeai/frontend/webv2/src/platform/ui/ScrubberField.tsx has 691 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/ScrubberField.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ceb6ecb584790adb1a22190a9f970f1adaf6f44d5a0fe3cf9c1652d147a3cfd"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts: 686 lines of code: invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts has 686 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4892bd953d995abca5dd76a57c95598bd334682d8f37d1118ddb26f7b202d786"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowPublicationHost.tsx: 680 lines of code: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowPublicationHost.tsx has 680 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowPublicationHost.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5a6b00b69e3c629e2f1768e760edbaa185b1e7741d4955048050c50be3903e4"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/layers/AdjustmentSettings.tsx: 669 lines of code: invokeai/frontend/webv2/src/workbench/widgets/layers/AdjustmentSettings.tsx has 669 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/AdjustmentSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"52dc31aa594ffd996a7b23a4b03024d9102169d4a3de9f8650b55ed6c5ed6835"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/engineStores.ts: 661 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/engineStores.ts has 661 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/engineStores.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7903c9cd393151fc3fc6e3dc718b2d97e78cd52d2c1fe245d4cded018b212c9f"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/generation/ui/GenerateRenderSection.tsx: 660 lines of code: invokeai/frontend/webv2/src/features/generation/ui/GenerateRenderSection.tsx has 660 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/GenerateRenderSection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef40bdc1ac8d76a25133db1f2a887964c435d530c8a4327a5a1f24e829d5bdee"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts: 648 lines of code: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts has 648 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"99a503c31737b5421104a2b64af9d17533392cd62838d3782e4954af6912a252"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/konva/pressure.ts: 646 lines of code: invokeai/frontend/webv1/src/features/controlLayers/konva/pressure.ts has 646 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/pressure.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0348e7f47d79d01b58bc3b0d0ce0635c86adcde95dcbf59834aa7b8c3e04ff87"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/store/filters.ts: 637 lines of code: invokeai/frontend/webv1/src/features/controlLayers/store/filters.ts has 637 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/filters.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e89fee765341076e05e917d0359d317cdf2c5162d38e1a981254c569b80bb3b2"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx: 637 lines of code: invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx has 637 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"25f5ee1ce5e97da3f43beffc5a27357cd369309431e42b414a3ffce94ad980e9"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/fonts/runtime.ts: 634 lines of code: invokeai/frontend/webv2/src/features/fonts/runtime.ts has 634 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/fonts/runtime.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d83a205c641df256bb57a95b87f29eeb90cfa415347062229148b2bdd084bd5e"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositor.ts: 634 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositor.ts has 634 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/compositor.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1239ea3ab678508199d2b6db81de6c273dc2840dc1f58090570c2ccb9d29ef53"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/nodes/util/schema/buildFieldInputTemplate.ts: 626 lines of code: invokeai/frontend/webv1/src/features/nodes/util/schema/buildFieldInputTemplate.ts has 626 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/schema/buildFieldInputTemplate.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"651df5b76fbf04aa155de24714e87274309343c8ea5505bf814f87bea401ff4d"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/overlayRenderer.ts: 623 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/render/overlayRenderer.ts has 623 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/overlayRenderer.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cad387d558898aed0c38c4323d8ad2f37a17747506917e0091a8e62c7d174a5"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/projects/invk/assetTransport.ts: 623 lines of code: invokeai/frontend/webv2/src/workbench/projects/invk/assetTransport.ts has 623 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/assetTransport.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"378a837cc722d3a6cc913fd44eef5bb9d66375e46cb0bd743577066111350509"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx: 621 lines of code: invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx has 621 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/GeneratorFieldInput.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"648cebbb684d6e48a6e9835b900b8afb776180578cfdaeaf6b5ccbf1bd5a757a"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStageModule.ts: 619 lines of code: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStageModule.ts has 619 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStageModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"045dca3f64bd1a3da4eefd90f506359479dff21704a98086c9a5238672ac74ac"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/platform/ui/Picker.tsx: 619 lines of code: invokeai/frontend/webv2/src/platform/ui/Picker.tsx has 619 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/Picker.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5a64673026772181028ca4b976ea6f7e9b30641d1cfaa56f523431ada15e5fc"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/palette/entries.ts: 616 lines of code: invokeai/frontend/webv2/src/workbench/palette/entries.ts has 616 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/palette/entries.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0b3ee918a33ecdca59c2e170a5652099c6542fa42711fe310ce2f06c41e5f4d"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/strokeSession.ts: 610 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/tools/strokeSession.ts has 610 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/strokeSession.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f157f6b24200cbeb4153f680cf8c0c514d1dcbccca2f78c127a242d05e7085aa"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerChildRows.ts: 602 lines of code: invokeai/frontend/webv2/src/workbench/widgets/layers/layerChildRows.ts has 602 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerChildRows.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e714e197974bcfc2113fe16c460ed0dbe6ff18ca678642a45fbaf2dc43bba325"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts: 597 lines of code: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts has 597 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"40fbf8007d0e9ba0c3a71dd270ced2a8ab9a504a0dddc5ca763e2c3281c1cb1a"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx: 594 lines of code: invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx has 594 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"320eb5460d87ee85baa29966381cddf219cf8e4ebbb404195ffd03f5b36df925"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts: 591 lines of code: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts has 591 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d210e8ea5f08e1f3670c4073c57feff3c5c410b9fa69733f2592e8a279235a74"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts: 591 lines of code: invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts has 591 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/v1/workflowV1.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"62c13158864d2064cf559e55c31d1580f00ef8d3fb03f4974b5fbcba5cce904b"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/settings/store.ts: 588 lines of code: invokeai/frontend/webv2/src/workbench/settings/store.ts has 588 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/store.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a78582750a28d203d3ca064574423c8afdec5522167676bd21d6303ba542e9b1"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasWidgetView.tsx: 588 lines of code: invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasWidgetView.tsx has 588 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/CanvasWidgetView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"70b9e3060ac69da9d605aa4ead43410f8b693936e5b1a4718b611f953c09a383"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerView.tsx: 586 lines of code: invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerView.tsx has 586 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/picker/GalleryPickerView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"acb719250679de1527b6b7774747cbc838c5b6cd833aba4e4421f1c6ce408700"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetStrip.tsx: 586 lines of code: invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetStrip.tsx has 586 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetStrip.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c10c8f22bc6739c34d6bba8151b873a5572db6d61081425859daa9fd35989fb"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/auth/components/UserManagement.tsx: 585 lines of code: invokeai/frontend/webv1/src/features/auth/components/UserManagement.tsx has 585 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/UserManagement.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ae997000324062abb318a2725c8f5c32bb19796dbbb3b562d164c1b3a63e960"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/canvas/StagingBar.tsx: 584 lines of code: invokeai/frontend/webv2/src/workbench/widgets/canvas/StagingBar.tsx has 584 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/StagingBar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"885191112db08d8778c8cb3ad0a03a42538cf0d915f04ca14fb43c61a201ed32"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/image-actions/recallParameters.ts: 579 lines of code: invokeai/frontend/webv2/src/workbench/image-actions/recallParameters.ts has 579 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-actions/recallParameters.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e099fe5dadddc558934b116646e0a50f85264b5ddab461c7605d68f50390b3d"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/state.ts: 578 lines of code: invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/state.ts has 578 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/state.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7116ea38827d5c0efc303e5993d418c6011f31190ded7da96662b83beeec521"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerCache.ts: 578 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerCache.ts has 578 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerCache.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"047aaee4a9111080bcd29ebd9fc70f285b278ae197874a069f4bcf7c9e1ff88c"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx: 577 lines of code: invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx has 577 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac2db1c0c147496c121c9686f9ee81a9499ee45d2bdaf0461d13e4115e6c1ffe"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts: 569 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts has 569 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mergeLayerController.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dcdeb7cbef267267439c22f3de6b3307cd10fbbe474cb2d094fc75e587e44bb"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRow.tsx: 568 lines of code: invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRow.tsx has 568 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerRow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"817f33849316e09adc83f4654e3f4cf06f17734e7adce2e4f14b74d1e36d4ad0"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/common/util/promptAttention.ts: 563 lines of code: invokeai/frontend/webv1/src/common/util/promptAttention.ts has 563 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/util/promptAttention.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"161e523e66423ba13df7ebb0f5c621ff864c382ee24229c85a3e1a916331d519"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx: 561 lines of code: invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx has 561 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c54891acecea9358a83b70b60b74539b81bcbe094d8e5d7efbff486a66f5798d"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/SamOptions.tsx: 559 lines of code: invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/SamOptions.tsx has 559 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/SamOptions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"024e05629f758e30d51ef3f1cd68ee0b130a54af1b5aca4138aad1265bdb4ffd"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/projectWorkflows.ts: 557 lines of code: invokeai/frontend/webv2/src/workbench/projectWorkflows.ts has 557 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projectWorkflows.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a1d8678f1722583575cccaee72904412a0a0996579c119f6b990687d4a5b95e"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts: 550 lines of code: invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts has 550 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cfe81433c5c88630b2eb69b0624ac6ba8e4bf2bd2f9748cc41f18c3e6b7d910"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx: 543 lines of code: invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx has 543 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"60e3c2019b1cc21d0281f2073c608ff3bd2d7546cea80862cdf46357c0174bd7"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRunJournal.ts: 542 lines of code: invokeai/frontend/webv2/src/workbench/queue-integration/queueRunJournal.ts has 542 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRunJournal.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a181ef1cdb784ff36e25195f4d3fe5f1918147234cc2a5c12546ee82c92a13a0"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-operations/selectObjectSession.ts: 539 lines of code: invokeai/frontend/webv2/src/workbench/canvas-operations/selectObjectSession.ts has 539 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/selectObjectSession.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce5ea7e8525979354fb2dbc93d152bfdd56011a0430b112987e0a075e970ef8f"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStateApiModule.ts: 538 lines of code: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStateApiModule.ts has 538 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStateApiModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3950db4085fd62796a3cec9ba26aa853fab85102d9619d7ab4058aba19bb4aff"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapPlot.tsx: 537 lines of code: invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapPlot.tsx has 537 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapPlot.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"04627e7ec057b8b8e325a8914bb21f4df241e150b0eef0e819edaa3b257e39e9"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/input/pointerPipeline.ts: 535 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/input/pointerPipeline.ts has 535 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/input/pointerPipeline.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e4bcc61ee948c7b0320cec32a252a4058c6a11481cac8f2e7df8285498b879e"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/ui/WorkflowWidgetChrome.tsx: 534 lines of code: invokeai/frontend/webv2/src/features/workflow/ui/WorkflowWidgetChrome.tsx has 534 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/WorkflowWidgetChrome.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9df131c5a1913383beda752a2538ad8a1bc36b99c48546265108f285c2be519"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.tsx: 529 lines of code: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.tsx has 529 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDetailPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd3ee9f2b144878d59c4b589710e424e872aa0f2916591df30ec300bbe23156e"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.ts: 524 lines of code: invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.ts has 524 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1331b27164203855bfb051494e02f998b8cc9100d5e7a9f31be8878a5fa9aeb"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/HotkeyListItem.tsx: 522 lines of code: invokeai/frontend/webv1/src/features/system/components/HotkeysModal/HotkeyListItem.tsx has 522 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/HotkeyListItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc67af22f3d6ff63ca1d32a19c7af542b1b17c0185ef17efab058ce6a86b4a37"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/generation/ui/GenerateDimensionFields.tsx: 522 lines of code: invokeai/frontend/webv2/src/features/generation/ui/GenerateDimensionFields.tsx has 522 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/GenerateDimensionFields.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4de71fe035036a9e22df7aab84515345f99fba915530606dcfb817754ebe48c"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentIndex.ts: 520 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentIndex.ts has 520 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentIndex.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"855f1b78a1f29d9a3c57d76a0b6a178d5a8227668f828f929ad789f95730276b"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/models/ui/components/ModelSelect.tsx: 518 lines of code: invokeai/frontend/webv2/src/features/models/ui/components/ModelSelect.tsx has 518 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/components/ModelSelect.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"73774174b706b2abc7f3bb499fe21754c35d7b12f85cdc3f8fd76520f69eb4df"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueItem.tsx: 516 lines of code: invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueItem.tsx has 516 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"939324b4d4b795170f864bb7787595d06e81b2c11941ad1a1adbdd382edd6792"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/data/libraryBrowseStore.ts: 512 lines of code: invokeai/frontend/webv2/src/features/workflow/data/libraryBrowseStore.ts has 512 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/data/libraryBrowseStore.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"13ff3ed92d357773c044c0a6d7387e5497a43cdc65e654cd8d662da5d1eda735"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/core/buildGraph.ts: 510 lines of code: invokeai/frontend/webv2/src/features/workflow/core/buildGraph.ts has 510 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/buildGraph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"724fc306ecb346f6698b9bda1ee98e6bed046c25242f5b246f6ba122a30cbb2a"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/GradientOptions.tsx: 507 lines of code: invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/GradientOptions.tsx has 507 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/GradientOptions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"96afab91690610af850b4d57a5bd1deb234803c64452c1caafab2ead567a4cb8"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/core/validation.ts: 503 lines of code: invokeai/frontend/webv2/src/features/workflow/core/validation.ts has 503 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/validation.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"626cc65c9f4d94ba118f7a3818c059589653210da03928e4cc39729f03ee17fa"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewLoupe.ts: 497 lines of code: invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewLoupe.ts has 497 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewLoupe.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"96b3094be3b21feaa338c34ca49e1df3ecddc44ed3e1990065e923a9adab7c4e"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/layers/RunLayerWorkflowDialog.tsx: 495 lines of code: invokeai/frontend/webv2/src/workbench/widgets/layers/RunLayerWorkflowDialog.tsx has 495 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/RunLayerWorkflowDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"032430e407f5bc2189ecbb0a2aa9dfe5240625cd5e1b2e9f8c901899c85ddfec"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts: 493 lines of code: invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts has 493 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d19eb0f65e36b30e12b1c34dbe21586a88fb70b2468b5fa139a952a34c5c144"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/settings/HotkeysSettingsSection.tsx: 493 lines of code: invokeai/frontend/webv2/src/workbench/settings/HotkeysSettingsSection.tsx has 493 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/HotkeysSettingsSection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5173893baf5ddb4e10b82b3183332932bb92b27020294db60563afb71cd44a63"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx: 492 lines of code: invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx has 492 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5c44de1e0a6055c539bfca924058a45f9772d7a5881b91eb911a8ce11746ffc"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx: 490 lines of code: invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx has 490 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d314b9fe81b8f4bb43db41a8e831c0c21a88f9492f22c7bdc828d8ea098d248c"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/ui/library/ProjectWorkflowsView.tsx: 487 lines of code: invokeai/frontend/webv2/src/features/workflow/ui/library/ProjectWorkflowsView.tsx has 487 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/ProjectWorkflowsView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"282b660ba565309eb2b7c21e3a023b977e005aaa95f4b7c8309f185dbe29d8f3"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts: 484 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts has 484 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"354f7a2d699689d0387ab74a35a73a9d6bc43cc0a678a730c60b6a97519ef6d4"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/projects/api.ts: 483 lines of code: invokeai/frontend/webv2/src/workbench/projects/api.ts has 483 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/api.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b901cd7054c9bc38366ee1e91ebe904442e2e268b511b1f3532625a22c1a019"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts: 482 lines of code: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts has 482 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"33af00edc3054290873f45cafe3f2fcfd5603a1fc1eee5aced8cfc116de7a385"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/diagnostics/DiagnosticsPanel.tsx: 481 lines of code: invokeai/frontend/webv2/src/workbench/diagnostics/DiagnosticsPanel.tsx has 481 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/diagnostics/DiagnosticsPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"497d3c8eb6d3f1907a3daf03e02b145a6817f184b94c4abcee4c7787e07a143d"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/services/api/endpoints/queue.ts: 476 lines of code: invokeai/frontend/webv1/src/services/api/endpoints/queue.ts has 476 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/queue.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"58197e70321b855a41ec38cb6a05fcb87df7b53087a41c84f7e46f1a056f2454"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/models/ui/detail/ModelDetail.tsx: 476 lines of code: invokeai/frontend/webv2/src/features/models/ui/detail/ModelDetail.tsx has 476 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/detail/ModelDetail.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7826b0cf076e8c7aa571936a6544af106c198b8fa6f1649dceb53c5e32a8e593"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/core/workflowJson.ts: 475 lines of code: invokeai/frontend/webv2/src/features/workflow/core/workflowJson.ts has 475 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/workflowJson.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"12e220c3d7830cf06e4a6af457a4960303688db20c10a70e3b7cb495211a162a"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasTextToolModule.ts: 473 lines of code: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasTextToolModule.ts has 473 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasTextToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e186c2e63b69b9dd9681d3bc87fb2bbb5fb6f3b7e2a995fd6ad18767335a849"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/core/fields.ts: 473 lines of code: invokeai/frontend/webv2/src/features/workflow/core/fields.ts has 473 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/fields.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"99e8f58f5f5c6f73fc30cbd8bb74e98ab43be3950cb1d6ecf95013996ccce95e"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/image-map/imageMapTraces.ts: 471 lines of code: invokeai/frontend/webv2/src/workbench/image-map/imageMapTraces.ts has 471 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-map/imageMapTraces.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b305b35c88bc3130b40e972d38c76b1302d850630eaa8293e16bbdc2ce15bc93"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/services/api/endpoints/models.ts: 470 lines of code: invokeai/frontend/webv1/src/services/api/endpoints/models.ts has 470 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/models.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"db52c894e21dfebae415f2c8b7d6c2b21a2a0989981137954d8a1732948dc8b9"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-operations/filterGraphs.ts: 470 lines of code: invokeai/frontend/webv2/src/workbench/canvas-operations/filterGraphs.ts has 470 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/filterGraphs.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2c0e4484b31aabe46297b058067cc1b24e20771914034a211ad3c59dd6676cb"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/queue/runtime/utilityGraph.ts: 469 lines of code: invokeai/frontend/webv2/src/features/queue/runtime/utilityGraph.ts has 469 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime/utilityGraph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"23a2674c628088ddfbce5c3556a7a9e365a5410ef9e77e8f8221f01ea74a1594"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts: 468 lines of code: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts has 468 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b759ea6b594963240e1301e540ea605e60cc6a49054e93a57d6e2a28e45c7fb3"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/services/api/run-graph.ts: 467 lines of code: invokeai/frontend/webv1/src/services/api/run-graph.ts has 467 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/run-graph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f16f9137d12c2d5a9bc80cfbdecb50cf43f95bb09c84c70fe2f4fa790cb41c2"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/fontLoader.ts: 466 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/render/fontLoader.ts has 466 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/fontLoader.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c493bc365155abaddddf97a93336856f33640c4a1e6d938fb46e4fc662cfaecb"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/image-map/imageMapStore.ts: 465 lines of code: invokeai/frontend/webv2/src/workbench/image-map/imageMapStore.ts has 465 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-map/imageMapStore.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6afaa30614f0d52b267b58b97e6dcce5225d5f71a9def3abe52fbfdd34105f90"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts: 464 lines of code: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts has 464 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addRegions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a30cd319be004e47a224dec905b2bd7dd1e115980827677fdd2d505637e21fe"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/export/psdExport.ts: 464 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/export/psdExport.ts has 464 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/export/psdExport.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c56d6be0e358f43467e33a2e9fb04af1e7dc7fb71e22bae4d231ed33cf331a7"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/models/ui/add-models/AddModelsView.tsx: 462 lines of code: invokeai/frontend/webv2/src/features/models/ui/add-models/AddModelsView.tsx has 462 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/add-models/AddModelsView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb18c8898df4e6d9ffe9b8d52f22a3c46d5bb1862dda13f45573b4b41ce92dfd"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.ts: 460 lines of code: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.ts has 460 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/Graph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"46ba58af8e4cb94caef284c5966fc7cd018972977a6ad4ffb462a1d06ff42dc2"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/nodes/util/workflowImageExport.ts: 459 lines of code: invokeai/frontend/webv1/src/features/nodes/util/workflowImageExport.ts has 459 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/workflowImageExport.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5881c140503e74eed2953d158b4cb70285693fc2ef03ee389e3b7dcbbe38c48"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBboxToolModule.ts: 458 lines of code: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBboxToolModule.ts has 458 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBboxToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"509897b5efed844ab041a90fa698f3030814fb3d317feeea7cec163317fd08a4"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx: 457 lines of code: invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx has 457 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9e50708937d32d9ea9d749c02e057bdf6eb74bd8a01272b18d46c2a6605b65b"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/hotkeys/firstPartyCommands.ts: 457 lines of code: invokeai/frontend/webv2/src/workbench/hotkeys/firstPartyCommands.ts has 457 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/hotkeys/firstPartyCommands.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c4b521b68054edd7afd85558514c3a899d4cd315e823dfa1b01dbc81867ebd8"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardsPanel.tsx: 456 lines of code: invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardsPanel.tsx has 456 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryBoardsPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe3a29ded3f7a0f391f284ac4f04dbb35a0ea0cb8d84a3fe094c147b338618a4"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx: 453 lines of code: invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx has 453 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/parameters/components/ModelPicker.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"19d3a7d50d62abbaa502cae533451962a68056e4d2cd0fcaa04b9a1b1210211d"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-operations/compositeForGeneration.ts: 452 lines of code: invokeai/frontend/webv2/src/workbench/canvas-operations/compositeForGeneration.ts has 452 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/compositeForGeneration.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e99b47d643bffdab20ef9f21815048e89cad8b1bd8e000c224342a5df829029"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx: 450 lines of code: invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx has 450 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5091e95183b71fbf564ac5952d170c72f75f4a6e5b4ecd06afa67dbf7d44f0af"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/shell/CenterArea.tsx: 447 lines of code: invokeai/frontend/webv2/src/workbench/shell/CenterArea.tsx has 447 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/shell/CenterArea.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a45e3fce0908f851675cb03f5c9796b8d64d5e8250b48833c4b2030dbbba7a2f"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/canvas/invoke/prepareCanvasInvocation.ts: 447 lines of code: invokeai/frontend/webv2/src/workbench/widgets/canvas/invoke/prepareCanvasInvocation.ts has 447 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/invoke/prepareCanvasInvocation.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"45775a20a076d2e4610d2c28545c8af9b134a2a6df4b92aabed44c2dbb044c91"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolWidthPicker.tsx: 445 lines of code: invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolWidthPicker.tsx has 445 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolWidthPicker.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec5de51d0842b2d64c7741857eaa9d0edc9c7233136087d3369fbf4327eb0286"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/gallery/ui/galleryStateView.ts: 445 lines of code: invokeai/frontend/webv2/src/features/gallery/ui/galleryStateView.ts has 445 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/ui/galleryStateView.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3e92bd7b24d9157de97f368339137a369358814e7a1bdab331b5370e67ec3c9"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx: 445 lines of code: invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx has 445 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"836b72713b8a9930b8167484637749da9dbb8be9f35bc01b163ad5a99025319c"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/ColorPane.tsx: 443 lines of code: invokeai/frontend/webv2/src/workbench/widgets/layers/panes/ColorPane.tsx has 443 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/panes/ColorPane.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d70b91ebbe3340b7e2bbc15901d05557360980f5b7c8889367fe8387d38ce5b"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widget-frame/WidgetRenderer.tsx: 441 lines of code: invokeai/frontend/webv2/src/workbench/widget-frame/WidgetRenderer.tsx has 441 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widget-frame/WidgetRenderer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"41d8147ccc921db8dc08dbb697eb1f1da49960184b27dbc8faba0041d702555c"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mutationContext.ts: 440 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mutationContext.ts has 440 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mutationContext.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e5640e9a37c314b85ad45b19fe8a8488356cafa395760a1dc42b006d0253da9"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/floatingSelectionController.ts: 439 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/floatingSelectionController.ts has 439 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/floatingSelectionController.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b60356f60620cddb49ce61992d2a486a2746a84b8cbfe568722dbd7c522433b"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/data/templates.ts: 437 lines of code: invokeai/frontend/webv2/src/features/workflow/data/templates.ts has 437 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/data/templates.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b914c55a743331d61cfec0190ce3649b532c9a0f8d412b938f6dfce7766f8ed2"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasColorPickerToolModule.ts: 435 lines of code: invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasColorPickerToolModule.ts has 435 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasColorPickerToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cac8d1ba5cddca891d72e907df0ed5374e0dc94cd8c1403d8259363a73f7460"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/shell/StatusBar.tsx: 432 lines of code: invokeai/frontend/webv2/src/workbench/shell/StatusBar.tsx has 432 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/shell/StatusBar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4df3cb95110301037703cb3ca4ef88d4dcc9d4a67db37cfdb6df09736b68bb48"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/projects/invk/restoreProjectMedia.ts: 431 lines of code: invokeai/frontend/webv2/src/workbench/projects/invk/restoreProjectMedia.ts has 431 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/restoreProjectMedia.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aeb6b435f09d03e0b379cac5505139d18c340a1bbb7a62c4cbb7798c3e0aa4f2"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/groupSurfaceCache.ts: 430 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/render/groupSurfaceCache.ts has 430 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/groupSurfaceCache.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c86b54360b80fa097c844a4bec1dfec6e75729ebec9bc66bf586928f5de5070"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/controlPixelController.ts: 428 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/controlPixelController.ts has 428 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/controlPixelController.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6686414228ef4998574bd145fb777182a37f8118691b73d98744394dc1ea4ec8"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/controlLayers/store/util.ts: 424 lines of code: invokeai/frontend/webv1/src/features/controlLayers/store/util.ts has 424 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/util.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"296f1f63416cdda2af85c355bfc6d4917c439284927ba092a806e5dd24655b39"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/projects/projectFile.ts: 424 lines of code: invokeai/frontend/webv2/src/workbench/projects/projectFile.ts has 424 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/projectFile.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"83686e4e1395df4ee38eaef5e5c7d854df2ae5280b30db9f039bb1f14b455b15"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-operations/SelectObjectCoordinator.ts: 423 lines of code: invokeai/frontend/webv2/src/workbench/canvas-operations/SelectObjectCoordinator.ts has 423 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/SelectObjectCoordinator.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d77ec8418256c64ad05c1f9ae59c2f2562de08f54be2321f457dcff4c69e7e26"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionState.ts: 422 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionState.ts has 422 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/selection/selectionState.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bf1707c28600693f6c7a9b9c2f5df2564436ad56155d52471f73396311c2a19"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/video/core/dimensions.ts: 421 lines of code: invokeai/frontend/webv2/src/features/video/core/dimensions.ts has 421 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/dimensions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0dcf2ff170a0fd729eb1ccb022ceaccd6a2ccec72d529f99c75836a5e473ba3"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/core/connectors.ts: 421 lines of code: invokeai/frontend/webv2/src/features/workflow/core/connectors.ts has 421 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/connectors.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac9c5d4c6f14d16ce86dd501e1f274b7e6f22f5dfbfc73f55fc5be2345fa8b82"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx: 420 lines of code: invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx has 420 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c06cda7ba46f049e381d7e69863890a603080509b527a0cc63c8531b286f61e"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/intermediates/ui/IntermediatesManager.tsx: 417 lines of code: invokeai/frontend/webv2/src/features/intermediates/ui/IntermediatesManager.tsx has 417 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/intermediates/ui/IntermediatesManager.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e9df33d0331035e6c72efb70f8f21e775e6972833a3545eea2bf8a3106ded8f"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/platform/ui/list/List.tsx: 415 lines of code: invokeai/frontend/webv2/src/platform/ui/list/List.tsx has 415 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/list/List.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a43915c0238e64f14baaabd914dd8015b1543b32eb62be5e977685cb2b9c159"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/structuralLayerController.ts: 415 lines of code: invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/structuralLayerController.ts has 415 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/structuralLayerController.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"754b5baca8e8a78274cde4741484accaa8a4e6fd9c0b72b9384ab11a72aec7d9"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/settings/GalleryMaintenance.tsx: 411 lines of code: invokeai/frontend/webv2/src/workbench/settings/GalleryMaintenance.tsx has 411 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/GalleryMaintenance.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"17da20cb4260c917ce7b287e9f21d60807a78dfa0ff60c8f00efdf6f2e123df1"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts: 410 lines of code: invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts has 410 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/buildSDXLGraph.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"57526a5f7f80eb240c7ee63b79d055efbc4a69262f5751e21ae46e039fbaf622"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/ui/editor/flowAdapters.ts: 409 lines of code: invokeai/frontend/webv2/src/features/workflow/ui/editor/flowAdapters.ts has 409 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/flowAdapters.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"142aa16592303374335d9fa6959c97381bf799488def5886fd68dc3733282dc9"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/platform/ui/ManagerLayout.tsx: 407 lines of code: invokeai/frontend/webv2/src/platform/ui/ManagerLayout.tsx has 407 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/ManagerLayout.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"230af044fa424fd9125882a6fab9b307696738d7400317de60faec9dedc189cb"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/focusRegions.tsx: 407 lines of code: invokeai/frontend/webv2/src/workbench/focusRegions.tsx has 407 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/focusRegions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"122b4cdbaf7df1e96a4c32bcacb4fc53953c7d07d1869b62ad6278e0da2450eb"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/workbench/widgets/layers/ReferenceImageSettings.tsx: 405 lines of code: invokeai/frontend/webv2/src/workbench/widgets/layers/ReferenceImageSettings.tsx has 405 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/ReferenceImageSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cf86be92df82390350d70248db9259333b67cffe4b0991d1d10e82f9b86dace"}},{"ruleId":"R3","level":"warning","message":{"text":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDialog.tsx: 404 lines of code: invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDialog.tsx has 404 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/WorkflowLibraryDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"55352f0a41d9a9d5f42ec3557f9e4eb6e4a25eece31a605cb4034a7ce7c6a17a"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"31312bcaaa95d59d5d18a61985788d10399bf693c5ff0bd1b8b390654180d3f6"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3fbe88c784c21a9fdee43255ba7068a854910e061be57dd22734fef4c6d7b12"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasShapeToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb0e5fc8e3ddaf7a123d511b2712fbd24495d632a1f43dc3927d37c35cbd5ad2"}},{"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":"invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"56f4f66af4490392109cc8500c564d7e96177cb503f94c2b7f769708b4272278"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositorModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f782c93fd1b978a06b7b7099f44f3c0fc84edc6f1adf717f618b518784d643f"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"39c79c703f0391701d4410ecfbff5ff49d44e2f4f0123784fd6b000ca9a36e11"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStageModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2678cab9e4401fcc95efb56637cc0bf342140f76173e49510c6f0d389a6ff29b"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityObjectRenderer.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bb9859e5365815a32004a730deb09d1fad75ebf7002205fb9953a7ff5e6336a"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/store/filters.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c262b02bb769891ac745e7fb0bb91af47c706bc7b97d2411163314ac027305a7"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/Flow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"552e6395b549505143e61ce967a306d089e82ab154d535a982a829a168464f71"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7977e91bf37b8ddd2207eccb3f1f17bb6cf61e12166268a1e48a92b25fe4c62f"}},{"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":"invokeai/frontend/webv1/src/features/auth/components/UserManagement.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"76dd7630823d3e57846cec417fbca2bb9fa05d73a0f80002b38602edeea9792f"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStateApiModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"df6f7f10598f4e4ad9a69ffed2693621ea320af400afa634623ced6c11377ee6"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Text/TextToolOptions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c249ad91d3e6ac1ced749d69123f73f73b702c309f6198ca3f78df207d078a1"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/dnd-hooks.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a676c131836635c5ed8ea77f14bfbd59cd43b16e0ae5b895d62ecdaaf4481fc"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/AddNodeCmdk/AddNodeCmdk.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"41a4079a904b16c4891c424f7086ed565b19dce50ade84ba53d0d1cee6b68855"}},{"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":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/HotkeyListItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c892a5e430bafe81ff6f5c1f4a6685b1a85ddacd6c1591ea3486a18532bfd6c"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"87f960998cd0c1d54d60f235c9e31bcbdfdd857bb6665e51ce75a9694723e9fa"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasLassoToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"abf10e8eb2068ea72685916a67465618f1516f87b7ffa3d8a42afa9a85695a36"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a21a75835a4f54636dd3380f66d19e0ea23da4372d6017732602ea716c46960f"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f51d08020fdd3443ee23682840e8100baa4ae6fa4fc70060ae15d54152be100"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBboxToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"22c88575804c70405f33d0e7b8ad2c7d837fa88be358cac486a0e2279a157d39"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasTextToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6e760f0c3f8904897f2942e8f3736b9a00c48af8848b11dd916b79e5ebd803c"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGrid.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a38647a7fb737faa40ce7baf400fe2957267eb9e2990038830a2dc2eddd86f4"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolWidthPicker.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"20c15c5d0e32bd9b20b9fced394269efb375d7e24c8e41b8de6d0d2e54a05db4"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasColorPickerToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fd2d884e4a2098fc9ecca257a069613292eaf485b746421337e1def38f902ee"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e0ceb555474b2dfa0938ebe3c9be8a210bbb9f18f0a04ff453eba7fde80ed1a"}},{"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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c39c98b145f7d7fbac89aa63a69ddab14fe69742051bf90cb6a0c7f72ba6a342"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"afeab4a9f43fcfafa1c9e9fa3a5bf435eb2f47d4e763af6cf483b0e870cd32c9"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f84a65412d1fd58c8d018f9f747d6b757eae9b7dab95bc1b7ee833db84a40a25"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/RelatedModels.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f120d2b3cf5c63ee35f2e8f8e4e68ba4253e8d75c85f5c43834192863fa2a1c9"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a027111236749b857035526988e35011eddb4787a32b2ab3a39ce980f3a53d5"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ExternalProviders/ExternalProvidersForm.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eeb52e8b975103ff7f95ed89ed36b3d9c8cd3e92d3c89f5d1551e18d53569afb"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibrarySideNav.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d111f51e77e9b8ed8f3c5bdb8bb89f04f87aa2b7048293446ff7656227ffb066"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityBufferObjectRenderer.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d22d06d91c54b8bbc75030e4d0769cfdf42661f5935056f780efa95b24184939"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasManager.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"006db925822cbcc7d33aad983d5603451c4685f1106cc81a9d13c08a008763e4"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueue.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3254916c0d30ceca22c9c46acc7af53d71173fc32ead50e7a67670aa4cef43b"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElement.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"59dbb90f79f3b31de3f8535c4ee57d587497ae809ec4c91a9ba7f502729e842a"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/canvas-tab-auto-layout.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b20f6a6d20f28c555d40a5d159d089004e79d73f2d18e155aa226b32a0d922c"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1080bcd1be2e8d3b2bb9a249faad8957107df2a583ebfa332046f73d76b09a77"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useCanvasWorkflowIntegrationExecute.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef796dd6309713e34828c6182f98daeb8aad9371277953b16b46b814c6daa1de"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/workflows-tab-auto-layout.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"657d3fa7d5f845eb46215283c3151913c9954bc35105aae187b8d2ebc149e613"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasStagingAreaModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"de23335569f49bd8e5eead532555997006c8fcae97ca64fd000c182cf3e79143"}},{"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":"invokeai/frontend/webv2/scripts/check-architecture-performance.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"58b4da854a19fcbbb5136c5d863b75d529bf5468b9af9d2ffe822c5dcc6131f7"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectBrushLineWithPressure.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f95e50234486bb0bba85e8ef2bb17eb9b23f6595226d4d538fc6f45a3ac8d418"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7c4d4d392f2dae2cb4aea022dcb7a0d7138ca61944ff16cf24d9fbce000808d"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/util/canvasProjectFile.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e095de50da8c71ecf27692dbcadf72e131637e6761178924877ec08da7bb0e5"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/SyncModelsDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b25e4d0c987798bbb99bfe9d11ff0144273f4000d839f5ab4fd859a4314cf15"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/generate-tab-auto-layout.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb217397e378352340c57f8d9861791627354f94bfac5fe19a727b1a02299731"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"36afac43f609a12f16bea47995910b700ed0a6db2c7b0520dcd1b1453a6e849b"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/upscaling-tab-auto-layout.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"65003d3e101093ca367f942f417eff3593f81c829d02f2c96f048c31022996fe"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectImage.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"930a24e78b1b591abb8574db8cac00f5eefce020c5988f6a6814dcac7e8d2c5d"}},{"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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsGenerationDevices.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9d33583a203ba896a6a7bb9b2db5cdf1a240dbdc37d097b8976b64e71d932da"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/Filter.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a09679d561dbc36745bae4b361deb16105634957663ddeb927cd68ff8c8dd3ac"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowListItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5662975a82466ff1713053c5279a5c4edffabd017a568c2f3e8fbe12dff5182c"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryImage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d64f8119dab0ef11c7856c96b7ffa78bb23886c3fb961316147fb85f18583e1"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/context.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c334ebd7a179a5bf62ace2912189e71ed027f11a454d0842e2d0f2ebb681f584"}},{"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":"invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af6d9da9468a3573abff293f74b9d2f37e24e7044306775a213ebfe9b2d88481"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowGeneralTab.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0f66a7da0a75b32d2c16ab733967ba91a159391a7c649bb44800655a48d63c9"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarSnapshotMenuButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd9e8bbdc97a0803d15e2f020c12165855fc5a15798cf051522ff5c321adc9cc"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasBackgroundModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d221744c490cfe2c4874dc46e4a8c09204f4efa07675b57a5a9dca0555aaab9"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueItemComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"12079152bc8263feb399d142c1ebc02757f6356be5749c5c1eca45733787c577"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarScale.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eef2d2f3b5e3fca4223711ec38d3470c5163c3348e26c5b8d8804e842233f5ea"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelFilterMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"83aa598ad0e6ccad50a979cf3bc6fd13ccb4b3caa5248821cc644b8bd78f2ee2"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/DeleteBoardModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b20a45fe053e9f8ff402c841d25e945d8e9f320736b1e43196fb45fcad9c93d"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerFieldCollectionInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7f53deca77c92e73774c7ecf966a22bbe5cd3b65389ba7954b9b6519ab6fbc3"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b73ef0618699006e7921159d0483e664b90b432f4d5a2256f605f850f7311cf"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LoRAFieldCollectionInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8873eb27518f6060ba9062203a155fa24064e9cd29999030b7387c97e0078373"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSlider.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3243af3b9401585033dcfad22a0be9c664b03b77b0828af1fde17f38241f6d2f"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatFieldCollectionInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"479d19003cc696bd71e8294d69170919bc253cd604ecb44832bee864edc4766c"}},{"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":"invokeai/frontend/webv2/scripts/write-workbench-ownership-inventory.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6128754e7ed2d2068dd15506ac7cca82e7103a419f636b3bb22758047b6be954"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaItemsList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2fd3daf2aba554746e7eb8e5f9789d8dfef2fd55172f88d36fb5b51836968c1"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasGradientToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5abc797f1d5eade9ce0143deccb54804f225f4897b671635b921fe35abf2227b"}},{"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":"invokeai/frontend/webv1/src/features/cropper/components/CropImageEditor.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"77a1c4bb2eabdf71c19fbcbdb2e90ddd5efd7ac5d81ba9e33f5d9d95c7529a09"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementIntegerSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bd6187920b0b88640eb76c376cb08059d0cdaebf3d97196f7ea5eb447e84301"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a0bc453575bb13a9bd543f6ba0fb28356bac0ded1e206e3e68bb9b220d7abe2"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementFloatSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4dcb8f8e817b6803400664901b6f4d5b6a6291d0f74caf5a66c8fdc0d4cfc28"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/CallSavedWorkflowNode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9499c9e828bb4a1ba475af94176cce216e96b33f8d45e2fac4c70f7300d0af3"}},{"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":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/HotkeysModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"02caa259b84b4b87a0d2704862f3f1d97430016e0b9a7e53279ca2e287034949"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementStringDropdownSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e80cb4ce1bf3a7eefc5bab0e229f87d5c2a3e6bc3379523aeea526a807352c88"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/AutoLayoutPopover.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"14789d18c34fc76c043972a622a8d767b3453c8fb083ba3afa860624fbbb80df"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/contexts/EntityAdapterContext.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"408edbb4c6c35b2387ae09b1f685a6504d8636e02ea049d5a160c9de07bb54a0"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/filters.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebc3b2dcb08374807eeb4f0360c10e1423110675a60192c3f9ad2124c3f68cd2"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeCopyPaste.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9805f53d7f6ba0d86af32f9e49af4fa27ebaed9ddd00f4b98b899fc1882319d1"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardContextMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"57f471fe71c681db9d6ba56b7580e3dc680c52f20566937141d3b4b10e4ac70a"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/GalleryImageGridPaged.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3806017bcefb6cf464bbba3d6ff683f6e53895a6bf198e7353bacebf77aa16f9"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarOpacity.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e612618c281677e026ba4f6597876ca402f2596fca18eb46f6f3cedc4678b02"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRasterLayer.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6edd5a13d92027234c9f66661bb9f46b380fe978983bc0b39dccb3b8ab6d1950"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentImageButtons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc87571cd4b6a7bd30ba7118c6616b91f995575d1282791d29252865aef2b58d"}},{"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":"invokeai/frontend/webv1/src/features/dnd/FullscreenDropzone.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"63074967b57e9aa8baea20dd2ff7dbac236f1472b41736b39fc302c7cdfc9038"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopRightPanel/WorkflowEditorSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdac3ee06ff557af5db1dca0d83abb6da858c95232cb61f881cc6b57d062a0b2"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/components/SaveWorkflowAsDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"841302ee83a9e27f23a0e99b220a216ecb8a40704dd764a36ff89410b5615810"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"29273ea472725309fb1a66ef1974101e80181ec92a296d94d0b11057fdbc8b68"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityGroupList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"898c757aed2c82097c9f50bab0527c05a49d91f0adb9c89047fe1ac585ce8086"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelSettingsImportButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e663542ee93e823115de3546fc96d9cc341aae3c8598d57b9e2a84c58613379"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasSnapshots.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8af7e867084e761ff318857e2689904da57379b3416d22d6e83d27642d139a46"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListBulkActions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f16c7b3297ef97923492ab366fd5fcef0c8eb2b259d366c1fa8767dc9caa686b"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueItemDetail.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"60ef4b0a92bf2f66f6d23a78d9f414a41667167d1cc4ea6b137fcdf7759ebb22"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsEditor.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"68b9c6e4efe5da5a5eb1f79a0d329eb50bc11446f6f8fd5881adc72d9fc95170"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapter.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"561cf440cd16707b1c5bcf917a7c30fa69afbd8b070ba9bd48d15959c8c032b3"}},{"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":"invokeai/frontend/webv1/src/features/auth/components/LoginPage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e847e42bb73637f2d93f5f093cbe8089e4899cb2b043dcdaa1749d1bfcbbd7a8"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityPreviewImage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc94756c88c18b1ba6a206d532bf56c1bfd5585ba40c9cc568193dfa1b133641"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c522db1ca7529f9667587a2e69c17a4917bcd1280127baa745d3611fb35826f"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SavedWorkflowFieldInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2efa291ff6009e14b8597b517b91e1864f4e991167cd597bb782671934508ab8"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd37f5749a97adca8cadebd8661772fbcc9d9aa8d7c5978d312148c711f73584"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingLaunchpadPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc9e54a0449c0de8f86cf57f0009d8260353bc6026da17c5acd731a83cf378ce"}},{"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":"invokeai/frontend/webv1/src/common/hooks/useGlobalHotkeys.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f62a3cf6662ccf564da3f92c56557067fe97c20ec8a95def338ada20e37646d"}},{"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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsImageStorageMaintenance.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb310395e25843b215c65011d83517da09b4ed7724738230a0ab0d06c39c1534"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerAdjustmentsPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d27a8556775032441c09977f07c15cd8d95f05f89c64b770eca900d4ea6f77c"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolFillColorPicker.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b09a518b5b581bf3e09c238309ccaa4263f08decf023a935a34c81897066485"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc717f2d00a03b59bdfc4742c0f618265101356a4295e5f20b42d3c101c210d3"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useConnection.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfe6db49830cd251a93bb99577906f479371d03898925391709891879c0ad6e3"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"176af87de55ee5d8ec1008b69bbfbf04a60cbde7ac2a52893d6072b49f9568f2"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringFieldCollectionInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e718c5ad3ce0cd433230c01f6030a2b0471aac2e0286efd6aeb3862aed02d846"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldHandle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cf8c69a9e8d9c8db071350b7dde6bc51e2c2974ff3e5d3103da425d74f3f773"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/OutputFieldHandle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b56970fd005cc32bb0375a58fbf745d85b61a8bfe723a3efad20b8c24b8691d"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useExportCanvasToPSD.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a638cd6b5db782726ff823dce37d75a41d7d3023c7e0f14a97a0071f242a749"}},{"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":"invokeai/frontend/webv2/scripts/write-contract-caller-matrix.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e10f8169dee12857832afef5298d0c11598853c3a0ad47450a8f252f0c8f4a00"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectGradient.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"518d605bf234ce63dd0ffb39d42ffd0f4807b7be95a1b0faf0d15e0d90f87f78"}},{"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":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetListItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fa809cd7916bd490dfad07968a4a4c9aed68d690fe11c471eb77e3f765d51d5"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectLoad.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"255bcee5ac415bc63e4bd33b004810e96b4c2a6ada0f1cb418a8bddf338acadb"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CompareToolbar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"88edf23383ab0ef385b52579af5be5ff201933e0584b3cac21442e66718b924b"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntityRendererModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f711dedca4fcc6dc7d85ebba8848435f22f4a5aa4309dde13ec345ee37f17ba"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsExtractMaskedArea.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"85ef8e65fb17e4b86a63b987e581296a0bf1588a71b240a1561ebbe08670a249"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCompositionGuideModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1259419b67bd9083d02d77239be30684a7cbf1ff5a9ef6b7463aa8ccf17e591"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasPasteModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e68820e85dacc298b966743706749ae21546be873e3eec98f6e1671437678127"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasCacheModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f31b6b21b75f8b0bebda8d0a9a81d2cba3b05ee52bbb5b5f0534f6c86291471"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelImageUpload.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"114e9a94d99454a12d0f312ee4bfec66ee067075fe66bba3996e5fb3d9b4d13f"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Connector/ConnectorNode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7e7ea1a9bd1bd3ee36273726f9a4357aac20c0676c712aaaac74cf20b1c64f0"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/WorkflowBuilder.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"94d4bc1d5cbbd2ccedb33abd3307706c4d809a3320d14bd3724f79b85038c893"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d822f9abc236f124334bcb08b06cb2cd2b8bcea37e3c613ea9393caa9d40f09"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorImagesFromBoardSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"55a16284a289b08184659379fca6441268f23b7db617f5a85d7b8cc391a3bed9"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"64de5b32cc4e8283d5b19cc38ca6b3363f9126d0d3cb84e53d1d13e77cf80da5"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryPaginationPaged.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"29aa67f1e66ac1793f2dd32ae42fd16769eb5e2f14a866219feff5b1600d7da4"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/CpuOnlyModelSettings/CpuOnlyModelSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e497bce8b45aa39cce6e838c6815c2034beb07d58e811811ace95478b93dbc8"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/ViewportControls.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"42d41ee41dea45cdd1596b9de0743a905991096817aa44cfe88ebf2135de6581"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useAutoLayout.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d47cb05aa82ccf865cd5d044bde3992d187e9efb8c32de396d5b40b80909a590"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsPopover.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce2a2b6c03c13e86d014d8cffe0c6faa0c66a95f3c54b349d2d8de36819ad55a"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/context.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"91c569228d83ff26a8147e184dbd5b6f4242f136483ee4a0b458000f36720316"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelUpdatePathButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3efedf6d0aee106a71ccece629a7f24f9b541585c31c7bf007f027e7fb9cbd0"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/LoRAModelDefaultSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b4ba5717edb160eb2509698cc266bd2548e392d0823e752db8045efc926ea84"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderResults.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"30b76d39e1225d5677ef85588cf14e545125ae223bc5b03d7c471d5ae7de464d"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/edges/InvocationDefaultEdge.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a2adf35027ed2e9c9add0e94335cb38dd910566a4cde53b33739addceecf199"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorFieldComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"531ae48dd846a0be5595b92674a07afaf8a4c0b179949904f6d7c732c732484d"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsSelectedEntityStatus.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"214d6769143aed4f248e2d566e579ce7f83880af5163c8d348d60587b7a3d6cb"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenuNewLayerFromImage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af68aebdfeba29060e2ed3bdeb973a3e1aa6c258e96fa477f6426e53483fa72f"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/FormElementEditModeHeader.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d17eb223dbfdfe6d34551167a2d80dc9c0db3c8ee6cff3c94ac83c3bed1adde"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasWorkspacePanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"026dd4d3fc03c5a21b2fa76dda32bafcf21602550fea5bb3d2a15b3ecb8dd4f8"}},{"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":"invokeai/frontend/webv2/scripts/write-canvas-import-matrix.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fdd373cfead30996815243e4deb3e6b03399112439f2070991aed681f5ad234"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/worker.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0f4fa6dec53a40ede8e4b7c73e3f9df9f305b37f04d6b19b7b1baa4aa97b339"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorFieldComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f29434cee1d7d286240523b00bd4811a9d73afb1eaceda7cfc0d6a95f981cc0"}},{"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":"invokeai/frontend/webv1/src/features/customNodes/CustomNodesInstallLog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc758b8b37bf2137c0ddee8bef19a257ae796fb7331bee8d89f9ae3b2e96aced"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldEditModeNodes.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f154d076983e336981c8a6681a8e1bec104e5c1a888105d7bb1b81802e94c7a3"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HFToken.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c18bfb273f120485e45e8129845c9820d9936467544604dd0df6eb0efff8165"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeStatusIndicator.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbf9f6b54d7023e1abd9b2c6cdf706469458251f724218ff047d4d89e64f012e"}},{"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":"invokeai/frontend/webv1/src/features/ui/components/FloatingLeftPanelButtons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c01fb5be4326d470cc04506bbe0c7ba21b5b21354a986dfc7541c9ef48efc261"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/DndListDropIndicator.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c102fb34e1d3d30fd4a9f7ce942b7abfd2a7c9c5816212924adab0d392320ca"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterSpandrel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae0ae411a1711f42cca492179ccd7a97b09269568f58585c11cdfc33d389eadc"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldTitle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8436cecf0553b750e3f00157266291cd467a960cba68d848ce114b204d4c145"}},{"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":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetForm/StylePresetForm.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c12eab8cbe570222d23e5ac53db02e20996839124f2e32380f0a4555d64b97f0"}},{"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":"invokeai/frontend/webv1/src/app/components/App.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cdd05c0796b2323b682e03646a15bfed942c232763ea0cd3acae6912f8741c1"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonHover.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff075322ea794bb41937e71216f23b30a54df60e71d141d07282528974ff48f0"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d9f11aa3381572d10d83cea8fb16e0d9e45ed072f3130d14e075d7cd5e55278"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"71ba139b05dfdfdbe54308fb9f948747f3722ed4e118ff66524977c4406b8dfd"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringGeneratorFieldComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c47a7317acecb51c7f7103fd16e9e6311620ae51f866cae104641b3dd086bc8d"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementEditMode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"109638bde7b132e45d4ad873f6847f0317d0178ac60e641f276611bafe32c288"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowThumbnail/WorkflowThumbnailField.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"777b8e3d44f8e464413a5a0158ce5241a79c511caadef48292d36f6450e2c8dd"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewCanvasHeaderActions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdd140f01e5c892915f7a1199ba669a0129334d6b989055bb81a3e7d75c99c74"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/GalleryPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e167c30dbae5d2b570df1d7c38d7233211df692ae3997f9d6e84f3b964350c07"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/BoardFieldInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2764c5d027e8dec4eda326108fc6c76201badef33aa2e498b6d57dbeaee4bee3"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/center-or-closest-edge.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb22ae690acdddc3cc6a1fd745e3a2dbb76e11ef40377e6376ec2c9a5ac1bb41"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerSimpleAdjustmentsEditor.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"17ecd7ba05a3e8b3b64e4d401bf78282c6445971d92d8e34aa89f2e17e77f998"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsArrange.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e4ed289d0555de89efaf87654d764a98a4e558c6fd7d5598f6792e708ab99d2"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectSave.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b52fdbf059e5f9a4baedff7a166138ef79c5c6a579b5a8c59b5bdabfe6aeb5ba"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/VirtualBoardItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d02a6e181fb69ed173d12682d65f63b567dd95762e95ef36319ff0c45a868ee8"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/TriggerPhrases.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ce5c1c1c8235d3be1f16cec5e4ca833f1a7892050cae4dec380fe2aaa9c9da3"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterModelsResults.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b09ee119b093435d5c32ccf9c79b92dd96f7bd26e8255457fdee394c7e55002"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"93dfd249d58367250b6d99872cfce9028b078f5b49b1f2a67da60fe1d6669da7"}},{"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":"invokeai/frontend/webv1/src/common/hooks/useAsyncState.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c2db8446119939d3227267d11f84ff22dd74131ec9e8d9e331be77dd07ef070"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/LaunchpadForm/LaunchpadForm.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1abaaaec27593c4fecd19c2ab1afd64ec0773d318c938e4b100fa25cf4e698b4"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasContextMenu/CanvasContextMenuGlobalMenuItems.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"256a298b7ae30c5381a48d8cb003c05ca9231c75b2314fe70eab22d817722220"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/useFilteredWorkflows.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d097316be9eefcb36af8f78a771b565dbaba4d05da26d24878c472bd7df7d5f6"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/ParamDenoisingStrength.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c92bf4855b82b95b09d433c107db284d9d6430c379dee4a468b0ea150c2989c"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectPolygon.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4996286e744912a12b26390a0bda99b2ad7fe6764328ec192106325548da398f"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eec706080623e7a41749410e643fbb6998807fa9192ac08d38901b4498ad664f"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/WorkflowsLaunchpadPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a76a247fa32ed1397a4fe5277fe4ec15190b83496d06870ee79b4d5ae021d58b"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/CurrentImage/CurrentImageNode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fc2124a52fa20fc9226cfb2e69e79e8a49239851e2224fed2c68344051928f3"}},{"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":"invokeai/frontend/webv1/src/features/stylePresets/components/ActiveStylePreset.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8201052ebaa4febfe699cc0d8324778adbb860e8d16bda370926ca0a66cb3c3"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterNoise.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"000061106947845df37434d27af4f3a0a4db33722ec598ca60a8113ad6f6ee7f"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/ControlAdapterModelDefaultSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5ff26da15f6baf2874eb871b8c809380dde88ebb68cc4ffbc44a14d650bc933"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/components/LoadWorkflowFromGraphModal/LoadWorkflowFromGraphModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"402722c34511c3f675ae712762b424254583b9e794f855e7898d39fd47fa4ff6"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3caaeb2627a1e3fb1011f024b638f0b63edcf8fb1d23702deb3a30941d4465f"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Transform/Transform.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"33de007554dc9810808c975df52978708c2e096745b05fc120e7ce3044480e83"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/JumpToPaged.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed5170b0cd24a061812048ed7e54b0daf69400af439fde8f9cbbe18d4111cba2"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useInvertMask.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"df8a40bedc902c0b9e5c7abefc865aa41722550abea9a70a591071a058bb4941"}},{"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":"invokeai/frontend/webv1/src/features/customNodes/CustomNodesList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"416ae8005ae845d5cc766f46fff045433a2d15dad24e6c8f17d335802150c029"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/scrollIntoView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"073b280baa363bea30723217eeb5a32b96a1d53ee6eedfbd83234be3c1a72495"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorFieldComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"52d9dfe2e31223217d8780b67ca0a9f6d516e571e1c5b9dec59ddb52f2975ce4"}},{"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":"invokeai/frontend/webv1/src/features/systemPrompts/components/SystemPromptForm.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"697d73eca30ba4ebd8ccf93d17684c511cabdd9f8aede5bd5eb9c07c8a5473c8"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed86c58ac37ec274a4302600315eca94f144f760ad0f004ba778af1645548940"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useNextPrevEntity.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"da66b500e1c83273da2849d08bc5c876ea5dc1cb5c3f39ac5641d943a680aa79"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/InstallModels.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4183a61189cc120f9c254c541e597b3e3352c5e30d079430ade3e89676a723af"}},{"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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"657f49f6f09b06f144707bce0072547dd0646d314b99ce2c53ab671448e4385a"}},{"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":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetForm/StylePresetModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"66364bdc9f44d06e2b01bb036c077d98015b1b12f67defe5f1e069abefee3c59"}},{"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":"invokeai/frontend/webv1/src/common/components/ColorPicker/RgbColorPicker.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6c961cb727e129469ad84e1c64b8dbcbc54a73d09ce400c78b69fe3cd695e6d"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasMoveToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3bc3498ab3d8ac268009faba3f681ecd3f4b277c56d06693dc04d4090153867"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/useFloatField.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bc6b2e133138b222fe7f19fb9ddbacce74e470d5714def6d5efaf4ef7f24445"}},{"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":"invokeai/frontend/webv1/src/features/ui/components/tabs/ResizeHandle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"12eb94ff0efa1c29e8bdda4a1a2f2b97aca94519013afb8d378d85f3236fa739"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityHeaderWarnings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ff7d40993b0979b1066d766b60d36216503bff6321c8f529a56f5338c3175d1"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useCreateNewWorkflow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e36f85ddadd3bfa21bf8633936f7682f2f4c2180ae95bda127c9e4cf2f941d2"}},{"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":"invokeai/frontend/webv1/src/app/components/GlobalImageHotkeys.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d17a89a2af6a1b810a528d4e4e8e3a98f1e66b823a35d3e1a65179ab7d9ce1b7"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAddEntityButtons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7b81161e2f2ed5ad1b99ef76f8978ed0f03389e10e1658ee4ca334252bd7394"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterAdjustImage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b269b283e782aaa7ce228e0a1a6b034cc0190b3f5418c5335075a212e7c620de"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObject.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7aaca4bf6121a615c46ce72c988a595bb8ec212b8ccf01312e82b98970013ba2"}},{"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":"invokeai/frontend/webv1/src/features/customNodes/InstallFromGitForm.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7c57361fb3b1d069dd4bebfe117f0566a98f7190bec76b299561f156245b246"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementViewMode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b59329e44d568b4e9337dd1b8d89b7286f2e93aef9d64aa02450e03747853f27"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/PostProcessingPopover.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f7e542795a939af9c3549646440bcfb73db7d98b9aa5bd2f0a26fd79516da82"}},{"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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/CanvasTabImageSettingsAccordion.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"26cdc14826afe36dd73e0e93ce1582d93cee6daeca1de6143d6cca1c9737506e"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceResults.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cb51cc8884e0f1735f361bb709ee52ccc768737ba54e76f5a0e393659b4dc6e"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/edges/InvocationCollapsedEdge.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dce035f1173169925cd13766e313e5e18e56eb0a49a9d23af465eb6b4f5c6f0"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectBrushLine.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9e7cc7471a07725df9d127aad713abf84197600e9038412d2782a2fc2b2cc47"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelConvertButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"464d07e037bc5729b882349de81bb5f78ecc131bb9d81444913423fe4b899008"}},{"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":"invokeai/frontend/webv1/src/features/auth/components/UserMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9971c63800307becaabb07a668841c56113e7835030a3e841be536645820eed7"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectEraserLineWithPressure.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"61b8702e3630eecbd76534de06c3baf3bce85146063ecd4ba1fbdce90e7c157f"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/UpdateNodesButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4978d1949ef3dfa9c0476546ac69d34415716a79e86478a27ad43fbacbcc644d"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/EmptyState.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d00f3bb273ef159e325c8cf81ae357105a0da301eb8d5a2a772eb5bf6040ac44"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileControlNetModel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"400e5d6741d4b06dd13fcb4829c864d36decb8a5161671ad0ccf5773767eb849"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/PinnedFillColorPickerOverlay.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e65cfb62a23873ce814239e0620a63a8e44c90d4e289d4732549d7a5af12a14d"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelDeleteButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"df2c5a1e81dedd4d150cce1390bf2bda1b1a0e202849fb330bfd2ef0dce01019"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelImageSizeSelect.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1098515a818db4dd06664f588e839d7385577359a87439cbf22a649ef305989d"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/CanvasWorkflowIntegrationModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"456305da6116d7a440a31fa90ae8eaf7aa784d2375f1a9764b9682495e8955ed"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettingsEmptyState.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a46d0943cb597d17ffce3c77492791f705cd0893204ab29c57c35477fabe48f"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/QueueItemPreviewMini.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d55a74e3add11ee00b0179000efe5a86eeda468eb5d13460d1f54733bde1fb0b"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterRegionalGuidance.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d18e6643dc72541e026e61c4d1dea2763445e97eac993d24636e53b3124efb9c"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorUniformRandomDistributionSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f66a7c550b5eab74b33af8451df2d6c2ae045edf08ef845a9612218093b92bd5"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/CanvasWorkflowIntegrationWorkflowSelector.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdd5f6cf8d0fde6f0e527b873a4a6caf89fbea76340d0ad55c12e1928e715b3b"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/SaveCanvasProjectDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"18c5b250037cd89c87efc9c1e24ee0fe0f960748a5ceae655d5077c00bae75a1"}},{"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":"invokeai/frontend/webv1/src/features/system/components/AboutModal/AboutModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"116612c6562394896aa99daa53587811dbd5b7185841dadf0218a8b8e19b493d"}},{"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":"invokeai/frontend/webv1/src/features/system/components/VideosModal/VideosModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d36f7ed96596dd130d9149a4e2397ff14a72c024f049b23ef2744d451d94afef"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/copyHooks.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf743014fea0c149a97f96a6d9479cf1c5a931902eab28a2f9b98e4f43022d28"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectEraserLine.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ba4910bbc9e2088968b6d919e961d97ef9d23cc7510a682976c7a30d2f8d819"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowSortControl.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e5e00509c53486a5dabc38cc37f37d0695191f570ab40a50334fa013a27a251"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9914998f9a97bb1e35214fbcab521123082b648c62a3a32e686dff1affcc81e"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/InstallModelForm.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce9836d9147fd0178661e8308506f170a3de9f3edf49e8119f32dc98203a1631"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldGate.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"58e523e6c3a35c7d2cb85021c80545e4c0425ee0ca36e40be8124fad169f684a"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterControlLayer.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cfc2d188094606eb350943e13c6b98880aa3489de571d1fd5dc6676ec03108b"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectOval.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ee1f8a111b20ec9f634c1c034a9e7890730353ec475bf0f45cb75d7f5930257"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFill.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"51b3430af92d8029a612314acc41ad2199b50302aa09cd510ed509642b74f08e"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/useCanvasEntityListDnd.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c767986ef1f59761170177289d1e8c3ed90ed564f438af3d8bdc45645eeaab4"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidancePositivePrompt.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b81b5662bb133b2c7591a23965ade58c67b1633972c6c09b9fbb0a7d750c3fa4"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"412d34dc81a3424a06a9f4cc5263081f8629516e6f331ac0e0bbee4f4a170943"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/BoardsListPanelContent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d6ccad8006f3cac0dcfad18415cbcb850eb2ddd90caf6fe65f5a75fba692975"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparison.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a765cb0f51d6a91f711a456211bcd28cd17c760b414a30a87b5452c75f9989e"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/InvocationNodeTitle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ffdbe21af93558cd170e6aaf88908a98e92676eb10a74db982250b856c98eca"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/NodeWrapper.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd56a4a9999e0163048c30e330e7a0de5ccf08c9502389bfdc2ea8942109d685"}},{"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":"invokeai/frontend/webv1/src/features/systemPrompts/components/SystemPromptsModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"96a2d19b7f6bc0499fa79a0a24353ef12a01bd7ded8dec5d8e36a9a24d4ae5f6"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasDropArea.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e461d0cb0193faa1c5c9fc61f13eb205ff2a668a6de2a543cd2accf01d68641"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceNegativePrompt.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf825a569baae673027786ae977655adba2a73fa1f3ee882d932891212d9d7c3"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectRect.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e0b4291d7784e6abe192d9dac7e66cabf9febb63f657f10942a9b0b4e231563"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsListSortControls.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"93883768615f89d9e082e9fda0de83abec8f6204014da76f807982f7513e4d07"}},{"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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/AdvancedSettingsAccordion/UpscaleTabAdvancedSettingsAccordion.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"88c021e7473d234b668ee5a3363810de67d9e26458d27bb770e45eb8756b4b94"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/workflowHasImageField.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b6aa45dad1d00106f1235e7b3a3b6ae8882e9230a8422a86f4be1b88ce7f68f"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardEditableTitle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"52344b8b52058c268fd38d0335228c51f8d622c7c7af1d0afd1a3a010ce6eefa"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/GeneratorTextareaWithFileUpload.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c61026efa298c307abffb9c06806561b21f281291d92f0c0846371165236afd3"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasObject/CanvasObjectLasso.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"67c41303b446b747e26b42bffff04757e1af77d16ccec1e191e61a5ee0d7519c"}},{"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":"invokeai/frontend/webv1/src/features/dynamicPrompts/hooks/useDynamicPromptsWatcher.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"14c17403fd121fd269ad876913be963e5642178301f859994335571ee1609157"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldNamesByStatus.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1da10fc2cf990357ad062e5039274d29f9589420095291289df5767a0c038cd"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterInpaintMask.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba130e5bcec9ae720540f54d40626d0127eccdd9fdb8a4ab0ecb386062ae5062"}},{"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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa9a8fc1bfc585e0c47f9e574c2716edd3d64d5595c53887c96c746baf82d97c"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/GradientIcons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8b8540e569a850bdba628c78a3bc5d8ca5588a3759dd8bb1055b300286e8773"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeInfoIcon.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"749cbb295dcf27e1cff323aeace8ca3cab2f4eb2189c555857ca2f1ffa983e17"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelIdentifierFieldInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"22c70e6b728f7bdfa4f54ea40d10c6099eb3c5a487292c5a31bfeb52b15c91b6"}},{"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":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetForm/StylePresetImageField.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a7e82c5bdfc00853f1987a762eb1c127641a4c5523fc835a33b899f2167d0e8"}},{"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":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetImportButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7edc9aeeb39ff1474122c3087b370a94d93b80f659f8c0e5baeecacd60b2f8f"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GallerySelectionCountTag.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c127652401d00c712c0efa10810a7055c18cac16c0d06407b46a6ce4fb748e3"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Notes/NotesNode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c7eae55b52c00377d7d9af26e3c502ab4cd0245a5f1af85db606db7fb742d91"}},{"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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleSettingsAccordion.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f07f707b5fa51d64d2a350dbfbb8c255e0b3ce9b951453d8973137cb216ba610"}},{"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":"invokeai/frontend/webv1/src/features/dynamicPrompts/components/ParamDynamicPromptsPreview.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0cce916975e58b0c62edfc108dae95071d324586de8bab5a7419dc347c6d54c"}},{"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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ImageSettingsAccordion/GenerateTabImageSettingsAccordion.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f96e9429ec75c2f3a5f49911b5dc1905cb2a2d1872f3adf9da1b6e7c85457da4"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ColorFieldInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"20845cd57dde1b8b27fe3a55af40d1020775153d7d53c560d0d481d7e2e2e257"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/NonInvocationNodeWrapper.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b9e76dc0c45a269cb17e4c8a856302dc05f1460f2651488065334d5e8ee199d"}},{"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":"invokeai/frontend/webv2/src/app/ThemeController.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c6a4af13093cde14df1300c1436865dd466f52c2a857c522887f0a2fb9a6a3a"}},{"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":"invokeai/frontend/webv1/src/features/dnd/useDndMonitor.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ddcb0bd2fcfc607fbf0252b8e65263d68bd76e0ab6e3b231d9247649f319692"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorUniformRandomDistributionSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc8f494d1c091225003e8d5c3185c0768e8ef05b2b9c8664e7a9d9f34071747d"}},{"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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/GenerationSettingsAccordion/UpscaleTabGenerationSettingsAccordion.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"57f8fd9f93340a42e27a7667fa0610f636c9a82d44f59e924c20d865834d3402"}},{"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":"invokeai/frontend/webv1/src/app/components/GlobalHookIsolator.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"591e6d405e49c7a1ee19cabe93a6cbd766ab025f9a33b2b9ae5f7250e5fd6c8c"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useSaveLibraryWorkflow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"059e742c2d4936272a837ea168ee7a86a09b4a874190ab063570e965f894d402"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasWorkerModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea62effb041801256403228c3f823c99f6642ef824a573265d00a401de4d7db0"}},{"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":"invokeai/frontend/webv1/src/features/dnd/DndDragPreviewMultipleImage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f34df98644bd03c9193f765ae3aee473d3e36025ebf8cead439f7286a58cdcf4"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultHeight.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e7fe2fc61bff923cc72aea3fde64078e799ee9ccda722581de6e8c67026b1c8"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultWidth.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"785fa1dc755be8473a21321f0e6029ebe74799f6b89eb59fd428b48c2ea0e514"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldDescriptionPopover.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1611c5d9fd640e5c0e6aaa45aa1af1e152ee343bd64243fbd1d007fdf678f131"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowSearch.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"33e0ff0bf1aa48580f66c0b1d5301e6dcfb4a051556609ad126716ce0f2b0c15"}},{"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":"invokeai/frontend/webv1/src/features/systemPrompts/components/SystemPromptListItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"26654818c3af3354179686612ad8081ffa69d72cbb2eea72d5079d23681f7e41"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e662a2522291bbd3ab18f7e6070acef0fa62c49aeab0b36a52ef873c7db67098"}},{"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":"invokeai/frontend/webv1/src/app/components/AppErrorBoundaryFallback.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5d794122325171b4690c7a8525f27e66fb146c364b08319bf7e86351635302d"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsBooleanSubMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"819cfe9d4d10321e0b677f9034e2bbf8963b92fff704cd0abdaf7d03a50e8d4a"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityTransform.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"39bdea6df7737f13face2e8a9670243d7c6a055d825e797761046039a7d8a1b5"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/NoBoardBoardContextMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5ac4fcd00b46edbb009d78ef7283009490aef20829b0296b01cafaff5a8f284"}},{"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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleInitialImage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f719c384e4035db8516ab7132a310aef6885a08a2f52e738351475019346775e"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterModel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad4e69d3b391a4455fc0e1fbf2d2b556848867d506ba20230bc1a837e6b7c85e"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterMLSDDetection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b052dcd4a34dc6f8f2e1ab1aad6bcea07856490263767b4227ede323eaa86b7"}},{"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":"invokeai/frontend/webv1/src/app/components/GlobalModalIsolator.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e31059e4ec33d793d9049985f743638b9af8a205e1104cef353ac244e1810e74"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarCompositeOperation.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6eaaa0bfe89ce5793e35b3f591ba9b8420712d700f4f0ebd987f91c6ced6d01"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Transform/TransformFitToBboxButtons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac4632bc1578d9ed4e6f19725cc444fb42d85b305b47ca4229c9dbcfc68009fe"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeClassificationIcon.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f56d933bfa974d313dbb66e5e010feb0433af3c9bc8a58b130ed1c18445cfe35"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorDetailsTab.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"39ba958c00923cdabe5376c98d079cc29243826e5d16851842e7c6d2ae131f32"}},{"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":"invokeai/frontend/webv1/src/common/hooks/useEditable.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f807a13e2b0063141582732315d2f272e7cf39301938b87273eb8ecd0b12bd5c"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterMediaPipeFaceDetection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bdd3ea51fccfabb02c803cb4f39a632aa152d2127749605bcac5c37a306e751"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarResetViewButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9e8db447193cc5b1e69ad35f49f805a87c85c314e154179926909d9a1dc0683"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceForm.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d395765dd1c75a9256dcdf4a470f4de93d627975d7deba18b2723b06144388ad"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StylePresetFieldInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"81d0ce1d210eea75f3ea5587c0c3d218afd36c815709261b18ae45d77fdd09aa"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterBlur.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b08129f748eb371eaed71fb6d3860bf9241e417f65db3a7b875c4b3dcc2da286"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarSaveSelectedToGalleryButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"510015a3f7e06980eab83d5d9315b9dbed0d630da191a6cf3b568c75a347c6f9"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterModelsToast.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d80b8452788c04b295027162f98a1de11c0bf935bb81f200cdbe04c563c62354"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgRescaleMultiplier.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c438686e71319bed19ca1d0d64f73629c58288776c16b232008bb91a3c9888fa"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultCfgScale.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2d6eb5ded57630454af7ac3c415da0ebf6a0d183174eb054215833275d5530a"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultGuidance.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"39a7cb418740624408e1986b51931a870bf0dc2c135f67b4052aeebb300f93ab"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultSteps.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"43bbfde94f704647752c11e5ba6f4695ba2cf1bd906e46f54be44198a95bea91"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasContextMenu/CanvasContextMenuSelectedEntityMenuItems.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"89e456284f6a61e46f32886a8599f753717d30c79a2422a229f6fb21580e3cbb"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalReferenceImageModel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9705c1130c4e6e33d56b328066c900be330f85df62280d6421a997cdc4a02ae"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxPreview.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ffae95e2a85cc4e7f35de23277c90de664fa05d5cd7ed76c3c93eb60b4c8a55"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsPreview.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbe275ef78328d94e6962c17ab85e43918bac3fdc9a247d7e1d69aad55aa0b8e"}},{"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":"invokeai/frontend/webv1/src/services/api/endpoints/customNodes.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7af69553ed7ec06562d35823fd6c6cfcec224fda0f3d36200d13efad4a1aba3c"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskDenoiseLimitSlider.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b40d4d7beb54f4d2a6107328e95a330b3935061f75b3b74e56670b6e4bbecd9c"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityAddOfTypeButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d59809f308c3846a9fafef4cbcf0ee6947f6c91371642abe757ac40194bd37b"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterBundleButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7d71105f6cf6fa719fc66d8acd60f0eab8b977107c4a69726edf3cdf4caa9c6"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterModelsResultItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb928f63333c3915786f87f4fa9f95c3b0e946b45dca2fd788a492a77c670d98"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/BulkReidentifyModelsModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc00e16bf5db5e8a5b43e8b13ef07bc4d2b61b84892887c20ca9bb8e23086050"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVae.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cfcdfd712fffe3c3d7483ec9ad0c2d29f6f6884fa2ac47bee76a26147edf129"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeUnknownFallback.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bb65fec63b8ef5ae281f14e93ff6fee9aab56615105035faed9c6391816aba4"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/NonInvocationNodeTitle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a711867ad8482d2c31fede40664c38e9be637b842604b00aa8ece17fbc30a89"}},{"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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/RefreshAfterResetModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b7ab03dfe9b9dbc92afebd79193bad8814fcd42cc3dd6a1edf1fc8a578c5bc3"}},{"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":"invokeai/frontend/webv1/src/features/ui/components/AppContent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"48316bf1906e6ac006cc8d067d3055e95520f0c5fba85854276fc9973b674b1c"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/LoadCanvasProjectConfirmationAlertDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a35758b510a2f249660d24e5c39f0ef440043fbccf2e5187abbde5c79da233e1"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityHeader.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1eaa3db57836fd4fb06ec054d58562836f966cbd32811aefb01709748758eb58"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelFormatBadge.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed8b00cf16ac2ac18f3b47b24c13fa806ea58451194ca2d9dda3d6fce05d6226"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/DefaultPreprocessor.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e4070a9f5a2a8cb96f7cf5913c7122010c233bd66bc5f8ec484ed1e498fd7c3"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeCollapsedHandles.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9168f27519c441f4d73dca6016424ef982413361d83fc923878784756cd74a5"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/WorkflowInfoTooltipContent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b0b6fa4c893da41152ce4e04af71376082707cedadfd74d5dc817fdfa5d328c"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/ExternalModelResolutionSelect.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec03f0e4a98dce073537c214f2bc87b0dc722714c2c49b70e1bf90dc7b73f9e0"}},{"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":"invokeai/frontend/webv1/src/features/ui/components/Notifications.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cea1cdf8509f31635ff82a04ef0ec05b0f174f842ce21b01b8a92bb9ad11220"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/InitialStateMainModelPicker.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"76d29223ce1979b2fbded6408e88914d25cec4c3f3dd66811541c9ee4ccaf76f"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterCannyEdgeDetection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"29d771f624feacd815c560445594c1000f708ebaec3828ef32f5039a23e7fd0a"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskNoiseSlider.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2f5e1f34c35e8d5ae41b3806ab5f0603635aeb9cc16259c823946104e6dfef6"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsConvertToSubMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f988779ce7f886688f642305698e0dfc29190d3766468d337d2c0a9398ee47d"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolShapeTypeToggle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"59f45d1534e51a1b7c2a6e7bb9879c1ce1086a062331cdfb62b764dfb339b8f0"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/DefaultWeight.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a833298891ef33f9ee7ecbac1516088e4b231d19ebf85a671549bf4370aef384"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/edges/util/buildEdgeSelectors.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a692a9e0bb65ba12110f0348e77db47d659d24bcf6eb103f45cde9ef28551fdb"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringGeneratorDynamicPromptsRandomSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebf00f8a572b82767754365bf245d1420ed392420b838ea022463d8023f66fad"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/ContainerElementSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fcc2c1bc3bedaaf527cd5dff432f10876a68921ab21aa22c02dd6d40b4b6e10"}},{"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":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetExportButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a7d1a2aca81b4f342e7ed29c1b7f6015b047251889a73d4781765449ac04bb4"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsCopyToSubMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f43af495bd2e1a8ad08aa0f236ab76699bbf05853da1de2fa2e356b64ef6c62e"}},{"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":"invokeai/frontend/webv1/src/features/customNodes/CustomNodesInstallPane.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"64e851cce04efb2f8e502ddda9f2c3619958893ffba59498a4d9715d84c009bf"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"796091adfa6bc113882141fc473fc9e7fef7c3c3a55329e58dc457b164b3f976"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonSideBySide.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"274cc45d45b22babd274be3bb1fbd605e63ed41116114e5a16303b1cf7ab519b"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelFooter.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"715a489702d3fdc8789af8c47cd3df4ec37863ef9e1f4646e59ed799b5d6e9f2"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldTooltipContent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"df465cf783d1bab9825891644523aa7b7c8be5914cb58e73cbbe7b47a1f6f327"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SystemPromptFieldInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"22b90f9ff396f9ad889fbaa4df42e24e40e1bfab9d041d3ae0bc52a24c021736"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorOutputsTab.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"261ee284c3952380d7da16dca81ce55a141da365db5678ae54f7c4d15298c0c4"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/common/QueueButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"24a646d8040b6815c422e0aad48eddb37ba18de39fe93e83d4c592e3fafc6e8a"}},{"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":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"00cd648ecc14e1653d1e63292c99770d63fa94d0a9da4d67b79e84a62578e129"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListGlobalActionBarAddLayerMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f5d1b332f99479870da05b3d0033a38cd4376bf2f6dd0d8d524e52f2a14aff2"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c597210e011f1d84bc739ec17fcd6013cf4b17d08a38e1c8886e9a37aab4d85"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardAutoAddSelect.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3968c99dcddeb248f42b12a98bd410524ec99cd9e9fadd4b7327bde48b0a242"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/GallerySettingsPopover.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fce159f92fddaa25a5157404316e9e8ce5c02c95bf12adfe0acb50afdf2914ec"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelReidentifyButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2736ccfa6fcedef34f0a214fb3737055c61d8546c520c6c7fd8afbf587af69bf"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorArithmeticSequenceSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"90141586ce22ab88090df1472e2c56644885023db3265e26cf422a695f65e082"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorLinearDistributionSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ea90623d39d4ea068e26a585a40d9c7f776027c6b45d5675aaf565bf5b0d856"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxHeight.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b985135c6d1f7b3c099326a5b57f9f56f9785f4c2c1f056cf63e216628d2471"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledHeight.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4046fd3ae5e5600c8af0722e28dc4a3ba2fb1045f14029f5df263e9a471164a2"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaledWidth.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"39029d773524ace9883307b79309908af9f422da9efda5e1947f08d0be33c5c4"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxWidth.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7c8bf1333fb4086bdb7950a7d49be369684e59c4729456aaafa9be1d0fe5d8c"}},{"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":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetForm/StylePresetPromptField.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"44c8b27dfdb4a4580dceef6f6a10ac0025f3b0344023ce02c7cbf03b573799ca"}},{"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":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetSearch.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"237aa9d786770819b427600a569a1da1ca2ac1e3917fe5d412ef78bb582034af"}},{"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":"invokeai/frontend/webv2/src/app/App.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cfe160d8820c6938f7ff9db9e8332077ca65418a8ef619b26467e1a7d5f4bc0"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectActionButtons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b40e86e72ef1e547271e13510307f24c2c3088d5bfd29bb169fe45a6889ffa05"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/QueueItemStatusLabel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"584a0a903750c597248190bf246e52da4c2e0cfa57c37f8f01ed40a080e57ee7"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/MaskFillStyle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f717f7cf030f476e530585bb4501a9ed7f62ff0baae7205545220d2100415a31"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/VirtualBoardSection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c22002802706211933c24f0f73402e40febe809aec7e57f7026189c4cf376ec6"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsSettingsPopover.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7750ffabb1b15399caaf24297a187516d428704c93cf3d7c75c5e6697554d729"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GallerySearch.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c205bceacf4132b69a5c80b9e7bda6099c2a20367bfc4b4cc4ed86a10ea26a95"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/BulkDeleteModelsModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdc509cf36f63f5b14a9d6443d347b4ccbed1c813f720e6ed45005ab28d13654"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowViewEditToggleButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"be392eafa07727a4a74035bda2e082861731029603ca284ac98122f4ce7a3f87"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowThumbnail/WorkflowThumbnailEditor.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb21e9cc9345ac285288e82fae24904ad0b9a2a64f9323ce8ab1fad59643e589"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsHeight.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eeb110c39f0048577a9b64ea85c45c2deaac2f9ff7f2358cf5296998e181b2b8"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsWidth.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f15d0c2971ef8b1e8f68f44424f07d1bda16d6a8b1311f364a77728edb492acb"}},{"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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsLanguageSelect.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a82a82057bf7fe285b227e9164a6eff7880b3d5424072c36e8249fb63127ca0"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectSaveAsMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1839e69df05de1f229899985f0e4e473bac14921ae8cdda480d4b64313cb49b9"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useInvokeCanvas.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b57a450035f56dabe4b79f89ec900f7eba02210c8059a2464f9ffe4b6f026b8f"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterBundleInstall.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d70ad086e7750c79da9e041f466b108165014c66cdeb3da51a294c87e1960cda"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderForm.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"04b548e47475c6bd5981928e3597c0cff0ea22c0ee2ce34a89125197647f50cf"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/IntegerFieldInputAndSlider.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e79b7eceb083ce28e6529b22108acccfbb24cd13e147f915679ac463bd543ce5"}},{"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":"invokeai/frontend/webv1/src/features/nodes/store/util/makeConnectionErrorSelector.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a619e3fbcf60f160294b1d87e4f4b143f4d4ab1a0c067845f794ae5ca187376d"}},{"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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogNamespaces.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f26766f59bc5ecd7bd7e76a8efd0ef0fddcbd1c93dce5b41c0e38a3036a19774"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/auto-layout-context.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"892bbaeb38fd32606b030d2d78c2d89d3b0405f77fdf982168af8dc898ac4b3b"}},{"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":"invokeai/frontend/webv1/src/app/components/InvokeAIUI.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e87900b6fdd6ae71854c0c61f6554e4a0a94822eca8782a555d2af54292f675e"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/QueueItemCircularProgress.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b16f4911a612b752a41c9ad76adf42a90e56e3074d3ebfdf0076b0cc577557e0"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardTooltip.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ec82a9ad8c961cf03b0fb48dfd56ee2d95c0cf5bdb491c1a73eec2d1ad0b0b2"}},{"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":"invokeai/frontend/webv1/src/features/gallery/hooks/useEditImage.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa4ebe643616df1e1ca41c121987d83882765576768f9b90fd8297ddd3d5adcf"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelSettingsExportButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"514bfd99241993fc833e672b0a81cfbc2f4b6ffdcacf5836c7e078217078b5ce"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamSpandrelModel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f95ae69ef980c74a821cdf6b0d8da8eaf1a9175e4f3ea42223bde5bca64a0a8"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueListHeaderColumn.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2e98b9cc6ce57a518462f2a15d1b5bc1b6513001ca2a88401c0a05e17d0459d"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListNavigation.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7924a25d473557fe9d5134b0e3abe8c6f5da294ab2f7611f7e5b8f4bc8c15cd9"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPane.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c7641a922410c68662e6b5251769875940b891d999a816fe7269c36b320dc36"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/ClearFlowButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"38f6aaf04a3641f4b3090ea12942e07d7c928e7bfc1b809d70690524adb5bc22"}},{"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":"invokeai/frontend/webv1/src/features/stylePresets/components/DeleteStylePresetDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"090bad6eb98f6759b20f6317f14254be8cd422eefaa2c73d62f7aaa2c30afb3e"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterControlMode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d463df7223c9836d554ba69db18faeb5f79fce254242e337f736eb40bb0fc2f5"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterDWOpenposeDetection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"07b028a86ed4fad76114077f1201ebf60629b51d2555f54da43b136f5c1ebda9"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaAutoSwitchButtons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5fefeba54f060660f4824eb93b6168fe3586c947ac5e3aa7915798342bcbc2f"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementDescriptionEditable.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"946553960f53200408e6962124be86aacac63b0347cf1a21f7712011d27aee92"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxAspectRatioSelect.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ce2a2a4ab7205ebff8774564a33dfca7b96c11f06e5c3efdcadcd4ce62784ec"}},{"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":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelCanvas.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"12ae2011af3661e533fcca8696cd61164cd46dd63fb93c8204f7206326712b07"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityContainer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c664aed5bc9b579710b840414933660cb0b8ac8d174801e9e71d6f7c669da46"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"71cdc555dc09c2f65129c2af1daea6e1512f1453fb5a56a3424396ba7011d6fe"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectInfoTooltip.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0061827c2cc6fdc49ffb90d5f5f37235716f8c682c26ed9e8f171cecbf04565e"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccda6caf8dc2c533733ba8c0a2f79123556f4810c4db8fd0ca067dce087f9cce"}},{"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":"invokeai/frontend/webv1/src/features/dynamicPrompts/components/ParamDynamicPromptsMaxPrompts.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d5687bcc01850d8baba9de5f79f7b151faed548e37b0ed17550c12e02150a30"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/FloatFieldInputAndSlider.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa7b4319f64271ea1d1404b26b50f78f1cfc47d7bfca7f3ed56b2a767f30135d"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/PostProcessing/ParamPostProcessingModel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"25f8a1da01f12515453b28a2ccc7fe766f3ca907bcf9330c98e368e8c21aa80e"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/components/DeleteLibraryWorkflowConfirmationAlertDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"45cc34bc9a37824bdc7e172439fb551cfd377270aa61ea29c830782e55222308"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsConvertToSubMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f26f29ad14a682813d3e8672f44f5e80d1d9a1ddc299576f666a052676f6845c"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsCopyToSubMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4036e8bea3a9dca1afc57c11fa17aca23712c713ae0f9cbf80e583e914f901db"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ScanFolder/ScanFolderResultItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"871648e3380482fd67632cddf5104847d2b3173e90e2b3cca822c67733692613"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useBuildNode.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"75640f10bd9cc10484b71b8572f190d346ef5a03a265f1792695e06f2474aa8b"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueListHeader.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"174bee5bf7d4e8793b333b5f8e3db12b555008c1368f1b4928ce8aae03a48c9b"}},{"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":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelGenerate.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"17c3a2de7828872899cbee56aa91e82dca1771bbfbc672a050ee34c70e54c79b"}},{"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":"invokeai/frontend/webv1/src/common/components/WavyLine.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1da8b42e0acf435de2dc4f1af35084b04f07450d82b351ae87e6cc8d9339239"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityFilter.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6967b9ad1c80002202e0183dfd81d516b02745ac4e6d328cdc350a107aed9d57"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntitySegmentAnything.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c3ce9e635d692e1aab742dab31579733ed3c31ac1bbc546553ef490a34eadd3"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultVaePrecision.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e44717cd04e4e596c6f8c336de0910910d590e76655ec623d2bde7c20be96e16"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSetOptimalSizeButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa64cb4184974490a586385a8fc92b7332aa10e4616842d538cf822589b8dbc1"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSetOptimalSizeButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"986a90b4573e3230f3796726bcd2240db77ea8a3efe70daa91c979fe69a3d412"}},{"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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/useClearIntermediates.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"70f1c1e510624f110a0020d448e274bd47f63e1ccd246455c9b165b61fac9b63"}},{"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":"invokeai/frontend/webv1/src/features/ui/components/VerticalNavBar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3e9970a6ddb984db39af374c11e8c4fc235348ac062237cfb1adb4ef643db16"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabLaunchpad.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"61329b462eb9b044faca46b1866f98556fe9fa2e593123e13e1e54eba1e2b33c"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManager.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"255a66ed41974cd05c91965a8afa3ca7b629392948004c54c0e9357d3a77f550"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultScheduler.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"97872e8ad85070905ae13b9cecbdbe4d6ca2804d4300a8dd253cea9bbcd81bf2"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementLabelEditable.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ddb521c9761928461d1eb7771f68c286927ff2b6eff40dd38ef62d5ed2d0e5a"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamCreativity.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"057a66fc5bc580cc4e21104c2b87be3809c1d51602acba78ec6cc9f3f6d20cec"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamStructure.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cec461d3c80f60da497a0f9fe0c6bd450bfd46e3d583f2c04ddc8ac69caabed7"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadAddStyleReference.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"53b6f84449093f3fb7def64d0392ec39541daa1401df7cc3359f160a3158dfae"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useSaveLayerToAssets.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bda0d319bbe8e8204088ae53d1636f12d83286789f80245f9cdbd6f8e48aa68"}},{"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":"invokeai/frontend/webv1/src/features/dynamicPrompts/components/ParamDynamicPromptsSeedBehaviour.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c41a285447d95c4b6d8a6ac28f71c16a2ea7a2b175c14acb546aa3448d3b0eb"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/BoardsListWrapper.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d50ff2ec7c03ad24b4f047e9f8ea7bce424615c52b2ccd0c98ad2e20f9d3f40"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/getItemsPerRow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5f71401a1f1d6050330ce20ef8db94ae6f8906974af42ec38c1a3f401427fe5"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElementContentEditable.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd0a7d7445e3864af77d4681c22b4b9643d697a89948ecfb0cab0065b047d8d0"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementStringSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef03e5b8e6b55b2c9d49db80d81f63626fa69a6c55c7a4c38b2fb89410d2bb28"}},{"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":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetImage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"55659c7011d054703c35d0e8fa6d17b1162c7fc84389e575021d42914dd868c7"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeWrapper.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cb0984333d3a46f98d135c3645e1b5e6b059febff463d896e967aa037bf44f9"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/IntegerFieldSlider.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f90ffefb2fc317f1a879c2b815d561d9075174d1808e0adc4f5482aaa186174"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/OutputFieldTitle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"741466d4895fb150fef384a83111c8d7b3d532055f426cb0ce14ff02172608dd"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleCFGScale.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee8f00bed9b5aa55e4fcc220c15465e62b53f5aefdb3002b9a7591af1f4ecbe8"}},{"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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleScaleSlider.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c83934a88b3f43cf38fa15b6ae07001a461dd598a14c8da1db2b9f1aefa04b4"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasEntityQuickSwitchHotkey.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f945d982a666dc4876a7ba9a56bfdb4f9b1f9689290af87d9083244402d0673"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterBundleTooltipContent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7de27375b4dae3870df289c36e6536ceb00683297d273ceccde61d22665ccf6"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorTabEditableNodeTitle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7fcf1108dab5c3be810e1ba37265637c4e019623b85c5fb3618eb335f6ead89"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useFieldConnectionState.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f12ff669387db4082a45b62868d6bf61e3d6c53e71394c094e314e679f1184c4"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileOverlap.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c2ed82e2f9feec790430b529305b61ca3f3687c3d9817a842cdb20c2f660c7b"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamTileSize.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5deb74182d24ea9af0530702ad7d69661295ce07c8ec7ef1c83859664c96026"}},{"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":"invokeai/frontend/webv1/src/features/systemPrompts/components/DeleteSystemPromptDialog.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ef01bf91a8418b5d492a02c3ca0281047190a1cf5b0b67a7cea0242ac4f87f4"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadUseALayoutImageButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dea1f37c5c3929f0aa7b596dd122de7dd42284f82b8ee3b824f1c62ef329ef55"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceAddPromptsIPAdapterButtons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed5d90d81e0c8711c47f75c68d75ee820930b18d066ad80eb8c3299879f14074"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Transform/TransformSmoothingControls.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ed4a4e3a8965df2996ad47870317d8117f8d3053bc80485b4ceaa6eb9ea4c23"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useMainModelDefaultSettings.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef81e71a77352a50f4f132b3bccc51aebfaecce9fb0730b097287eb5fe2bda3e"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/TextElementContentEditable.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"484315d9199f1ca91ef4932b77c667fbe00d773694b11875e5c223856de8e990"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxScaleMethod.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c06f69ae3826534b7ac83920e6a4a860ff2e2daf95107968a25c9bde54acdfcc"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadEditImageButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"82d3575f6763fb2a416442688159c7327caa0b1359f363ccaec6cb7f8e18f591"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7f4c568eeaf92777bc528efe73b542ab3846466df2a63935906da0862d71efc"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityTitle.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c651fab34d66d28c38488a9b4581b6d48ee6b6a24d3e2b75cd62f3e2a9d3e51"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useBuildModelsToInstall.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c633d5aef01e7a09eac4295af9625e21c85259770c1517d35d01b9f40c7ff658"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Model.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"27d0539e71a4887182694c0bb47792a019d02d1701252b7c010c48186550bc81"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelHeader.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1df5e7334267eb76dbd479f66e88dabf5fde1e73e3b70a29b1c9297eb9b180d"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/NodeEditor.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"990b68f35c217eba6b085f3f76ff7e35f6801ad39df6f5784bbf1b532a237f1c"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/connectionLines/CustomConnectionLine.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b12035f4edf80c56e2a5b40fb5ea7ca576af507886e18009ac75a6be2123cc1"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorArithmeticSequenceSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1482262c7c1b4a4fb626419593ae9f35405be5ac66fbe61f3a8822a3146cbc8c"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorLinearDistributionSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"54787e2d343869ed8c00aa00a517ab2a3637f4a847beb7ec152bbda00f3774af"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee6699ab780badd5cd77e00c41dd08950c793974bdbabd802e4e7496d1929023"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsAspectRatioSelect.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dab7e3b13b6692e31326f87a0777fe2eedc262702b343fa35b99410d807d0bd"}},{"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":"invokeai/frontend/webv1/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"179a8d4924b3ab990f28519778d60cd7ceaf90de013a29a0d96788d3bb623bec"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/AutoLayoutPanelContainer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f2def649c953c814aff9183e0a3a4524b4eb9f67441ed0edc128c5990eccbdb"}},{"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":"invokeai/frontend/webv1/vite-plugin-logger-context.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1af36d9da5ca40a4d64842cfbcaed206bfe41086a00d240c19095004a94635e"}},{"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":"invokeai/frontend/webv2/scripts/i18n-report.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0815f80401ee4a504fd0de0b496c7886d40bbf9cf62282c644d09cfe5cdb5d32"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerIsTransparencyLockedToggle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bbe8e92bdb1253eb2d01bd5c5c4ebb6ab6771a3fe82420fbf39ed6a2c916166"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/FloatFieldSlider.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ad207f4f3600567cbabda96e82c58bce13af9bab079f1224e0151e6b699049b"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/IntegerFieldInput.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"109e00ac5b8dc2b12a2a7320fb69ff8c988ecfb08a6d91a57c71a8b0a50ad336"}},{"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":"invokeai/frontend/webv1/src/features/queue/hooks/usePruneQueue.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a01c81ca277495975849835b4bdc1ada177946026166176a1cf2869309f272b"}},{"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":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/HotkeysListWrapper.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e256cdc69867a47b422591cd0404fe2002633764f8719bdab199e66ba4c4081"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/GenerateLaunchpadPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"226ca2ffd41dc04822d6d96cd4cac0f6b2e0a5386f5d321aa4c3f3526f116255"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolLassoModeToggle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f84cdb03fa5a85e3f26020140167fb839ec994fae4b933ebe2732bc9353cf27"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad772c5689c106e011ab955a7a2b44048890869c057f0c0820e700de630281f3"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/common/NodeCollapseButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2839747d3c7e594882e6a0e983e3b3f11513e84df5624a1a663049fc5a8d16c"}},{"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":"invokeai/frontend/webv1/src/features/ui/components/ParametersPanels/ParametersPanelUpscale.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6b006490743776c1865c5ae7303263625f8e1b898cbc9e60f151117d0d7dd61"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasWorkspace.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d312edffe4d75c587f804b1461d70cf00d8560233918dd23d80425c29a96e1b"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/customnodes-tab-auto-layout.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"92ae8a0365892919fd4d673de2d6c2a687d3270178ff7b4b9a67c8e9f21a2ac9"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/models-tab-auto-layout.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8baa673cf7c4bdfa0432a7210f9074b966b140bceddde86c02235c8afdd5694"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/queue-tab-auto-layout.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e06b0a32dcf5fbf4cfab09a2bec8f2aed55bdcdacf163b841100c3e50e9733ec"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/components/UploadWorkflowButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"749e0383ff9e42662537e3ecf1cfa76bdff667516488c52d5cb7ad589f34c9b9"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/WorkflowLibraryMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"44775ff6f4772950e6dd6da66b1b3b8a78aa114c75cb50429dc092ac15987314"}},{"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":"invokeai/frontend/webv1/src/app/components/ThemeLocaleProvider.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"077dbf82514ba063b347b256b326e24e70cb072d56a75bc6b07853b988f41924"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasSelectBboxToolHotkey.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c36d67bcb88a1b8ff81d7625c9453fb967885e6babb084e8edb5842ef5bc47a8"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/SortDirectionCombobox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc4d5afc453648e1b384f25fa2bd9e22e06e7c25aa687f6e840698e4cdd0c54d"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeHeader.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"05b870bdfb1ec6c60422c5a7d82671fdb5c6d7d37118e867a083b0308d397d7a"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldInitialFormValue.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f169da8d8be5ec3dc26643d5efd345f6de2ba938834a4efbbaf30afb85f37e7"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useMouseOverNode.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed934d2ceb31f33463ace0017c68a368b1857c354c553c419ec493689cbb5dd6"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/QueueList/useScrollableQueueList.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb6b7870dbd7bc1a15684a55891cbb223ca999617806a50d7b4599de8b08020b"}},{"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":"invokeai/frontend/webv1/src/features/system/components/StickyScrollable.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"49e4270f502f8ddc6ba434eed7b24ea3f493db2252f2cff23616b2376ffb5712"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useIsCurrentWorkflowOwner.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fbf477de1b1f6d4623b8d4ee507fdfedb36725bd356e230d31463faf997ee52"}},{"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":"invokeai/frontend/webv1/src/services/api/endpoints/clientState.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a72caa85fa108eca0ad46c511c7d6a0ebf7b106a44cd73caff4fe52a08061af5"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerBadges.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a501c47add92b548aa4b916af09da57fb3167ee6e24ce3312abee6c1951446eb"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerSettingsEmptyState.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dce5ba2d1fc92a11f4ac3ca82453b3dd63db53a8ca05e3a823334fa00174510"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"02de1a082bfda61a0a76508272b0e967d455e3899ffe2dae65eb1d5554d5e672"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapters.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb731e0052fcba42c9a922dddf777346e1a690e0621c38ea8ea250184b47d539"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarNextButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3e534c13ce4bc4ca1e40233e7b80e0313b4fec6c399830251c4c4f02680017a"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemDeleteIconButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1476950c7b95516cd69603fa818f8dc9d7ec962c7d52cc047f126ebd59a70a4"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/useScrollableGallery.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3af47189f41ba503847bfab386fb7b711ae71b8cb79c073c3dc6d0db1b63f22"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useInstallModel.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"20a314c1050135b7f71d2c358f9570afc8df2fbf9e4f54a82683293cc1073685"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SchedulerFieldInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1cb519067950e2127a47c98d8480524db6fc34bb90c21e67727077a37b6e4cc"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/use-navigation-api.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"64bfa12f3299a272563baa60d709dd2d03e56bd9d80bc1800bde4ebce31a4088"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterColorMap.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a815786921bd8823c6c4007dc18046c39ebb2e57829e72b57a9274201234c4c3"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterContentShuffle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8d829999e321eb9cac3b16944326a4db1e408d87d33b9b3a365a5758a591749"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterDepthAnythingDepthEstimation.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"50363937a25ce64bf2e6b1e33ec8529df72fb685dd92a4133bc3f0acc059627e"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterTypeSelect.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbc7d0033ea43cb3f7e9a615ea83aa76fce5997f2b5b6681c45c37677cfef140"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarPrevButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e81bbfc514658d5623df648f0891c89a30aacfd9a51c7edd41841a99adf5f9d9"}},{"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":"invokeai/frontend/webv1/src/features/deleteImageModal/components/DeleteImageModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c174abbe0f1f21e08a9ff94c0eae74730c28452cb62c24d6168a4f7841b8d008"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/getItemsPerPage.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee205f097e88aaa2bea8706f8ae20c136b071a6dba3325aabd0488d4c4a31d92"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/DefaultWeightMax.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0942d2471476dca591665de03487d29024abd6a9a998dd9bc8cd9633679f842d"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/LoRAModelDefaultSettings/DefaultWeightMin.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"73cc2c41d8cdb6d86747a190b0f52c68b6b4d2c615ad421d4b40d6988ef21717"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/FloatField/FloatFieldInput.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0944dc97042ded2162cc61c2fd55c7a1c86850cd866164fa3a35d0b87e64585a"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringGeneratorDynamicPromptsCombinatorialSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b19dbcd0aa4c8e1007f93b036b8934c6072d6f9b0437b2e802437d5468a51e23"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/use-add-remove-form-element.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4b0197fad44d46f0960514c5f1d2de7a1fad1f6e1b133fc6baf7b80856a6deb"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasLaunchpadPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"63ec9313b36da9ba1239cbf85c5cb662fb05f48c4ec9916a8570f287b017e564"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabCanvasViewer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb3455fac271cce0d916d3ee63c6ccf0a1eef6c621414691b14b5e54ebf74e98"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidance.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"077e351f947d8bb0a0ff1b788b64974eff9d9eb2d5a7469c172b0b6bb7a7b2b2"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarAcceptButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a87e4c0992f072f948bdf492775ce478e7e3c9c049e3e38eae5d272a3d48113"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarFitBboxToLayersButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f19599662b7e33e185d572d7582118688093fe1c832a284e29e8ac6dc8a7d0c9"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarFitBboxToMasksButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5679cd74db05bc0bcfdc4b8fdcce218d383a59fef7768a15906315f47c6300df"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsDelete.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a3ca268fe7e8c486af5c8771865c8568296b2a9cc74017f7986356d849fb40f"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityTitleEdit.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"56f2298769975efbccaa944ee5bddefaf6082a592fa1645824279b1df192a342"}},{"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":"invokeai/frontend/webv1/src/features/deleteImageModal/components/ImageUsageMessage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0afc13916745502201186c97528afebef0d5ecdc76ee0d91d9941c6bbb79ae0b"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelResultItemActions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"289acdf67337a33316bde935ad3db5645965f15ab4ad7c521148cbee5d9d1bf9"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/DefaultFp8StorageControlAdapter.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa1421de185f3d1f7a83e31aa6936b186e3be9be7debe60c153446494021e0c2"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/EnumFieldInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"44eeac3424b1f2d74c12f0860eb7bf844d7061ca7c3ece2a97fbbb4afa08b016"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/DividerElementEditMode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"064b7c71c8e8a3b13e9370964208155e748e54697864a72f17cd1fa28e046a87"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElementEditMode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"84a58f15b7555cc71844f3c2bb2c9df2bf7530a78b9d93aac076c85a3f87c59e"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/TextElementEditMode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"30c75d8a398a7a33f9a97ac0fd155f67f0521c3d1032c9c221de5346cdc7606c"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/InvocationCacheStatus.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"58d88be4adae86636d5b1131a220b0e194afc04b479e4a3ab54afd6450a4052c"}},{"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":"invokeai/frontend/webv1/src/features/queue/hooks/useCancelQueueItemsByDestination.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c584fda5abfcd86fa94e8730bf6b49cb130d51082f2a4b3f15fd063b6b311cf2"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarInvertMaskButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4e214f26023db67f84f5e53e42761a227cf4c555ba05e0fb2e9b0f88598c052"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarSaveToAssetsButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aff91268b3ae1a9ebf4ec73ebf5589ec14364d36d047f61d033d1ab4129957e0"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/EditModeLeftPanelContent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc7a63b02ceaced4dacb0f9aa34ad263c6efe11f6b9483193281d3774fd55293"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/ViewModeLeftPanelContent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"179d30475e83b1055c637be20019fff8bbdab5a37d002027a49e1b0f338259ea"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedNumberInput.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8691d149f733a66d8574d8b34ea1a2cae5e79597de09a0ce6f763c489761153f"}},{"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":"invokeai/frontend/webv1/src/features/queue/hooks/useIsQueueMutationInProgress.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6ece9e73b91cc4878c2fa8366cda742b7b9a310fdb6829c73770b6ab8622470"}},{"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":"invokeai/frontend/webv1/src/features/ui/components/TabButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"15b2d4a394ec5061fa0de720c951b83489e8729acb33566780de41e570a30064"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTabProgress.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b655dfe92908e9309601fd5f6ee3e4d87370125f2332478723747f2e7709ed81"}},{"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":"invokeai/frontend/webv1/src/app/store/use-debounced-app-selector.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e569c98d39fde55486d3975972129c768f218254cfb3711c109457f46feb1109"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItemsTransparencyEffect.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb0688652ddf8bda7cc17529fc309ce18ad051eb839f84b0a430b86311196256"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItems.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ffb1b12766b183befb75917e6aa081f52b82b112fb5eaa1600d58b0dbb2e206"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasMergeDownHotkey.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e781b14015068b36cf541e518fff736c19f432d5aaf4be01c0bcffadb4ae39b"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleMetadataViewerButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6f9cc549a5646423d6be953a0e5bba8d4ebf8096c1d79d37bef365df7ed5b83"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultFp8Storage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d65ae7c6c698584247d174ad71c87502847fe91a848f8bd6e20d0f337b732461"}},{"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":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetMenuTrigger.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"834c841920743bab289125654e98697b0e070538cdae06b7b27e6cf95b1a2cbf"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/StagingArea.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f6afa664271d87fe45175b87925e9f837a00d9c07c59909e957af50ee8ccb36"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterPiDiNetEdgeDetection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"976059ce00e3658a4b0f0e0f413a5c1a71bea26f1257ea0f7966ef18b2b99955"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceMenuItemsAddPromptsAndIPAdapter.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b74565e4ec7315485f086f0581a0a78ba0c6544c50267061c64e51b425ef4395"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityTypeIsHiddenToggle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4f9c758c5ac122da38caf2d509710dd07cc4b37f72446a95f9e2c2c33aadc7a"}},{"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":"invokeai/frontend/webv1/src/features/dynamicPrompts/components/DynamicPromptsPreviewModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"03ae248fa4daa8010946ff572107b44fb7df8718bbe3390eed8a5a79b85d65a8"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoButtons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"56935290119a3ba180d21847aeeb145c2dfc5e7d93bdf701beabb80b6d6e3888"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/UseCacheCheckbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee2acc4506a4fa1949622f3addfa5208d9b67327fe321051c52aeef45eee8bc3"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowName.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e174dfbf17f856e887b88df6df4013238360ff77b5be89de7fc4dae1af2fe86"}},{"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":"invokeai/frontend/webv1/src/features/queue/hooks/useDisableInvocationCache.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c542cc222d49742e73957a94884f629cd7166b4f9ab4999a94744a14ecef40c6"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useDownloadWorkflowById.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3f3b27e0ededd03d934d5a0d87284d21d4a51e49d00c4637927bc12a1dda42d"}},{"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":"invokeai/frontend/webv1/src/services/api/endpoints/imageMoves.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b675e57f57663e429104f9b3338338dc5da1871c51b1f43155e2f0e4eb63291"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectPointType.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"224a8043d7bd849a259f455e729c1b73bbf51dd6f7501b352a04243e73f738f6"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasMergeVisibleHotkey.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed86d10052b6c0a1b954229f3864fec731a5a7f2d88d46591db666ad555d786a"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewerPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d135ac833cbf01d9059df52dc26508c2975a939ecda93d46918e0d32bad6025"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelListWrapper.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7791cce7ca8a2af8fd7162a06cfc855452c2d3befe8c5a802a53323158afe723"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldAddRemoveFormRoot.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e87b83e9b02f53ef4b6201e5c323dd010e8268875be1a3b61ba778955f285df"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/OutputFieldGate.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"28d580835f55b24720614186e550bc1485846ce4f4c6b9a6c09db46d7721784a"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorParseStringSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bee3b2fa7a9be2d4941e410666339e7b47fba94295210549401a9cfdb5cbfbbd"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/StringGeneratorParseStringSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4891b35c2d5392cd831677b7a10ac75eb3d9cbc1611c9805fe3f1682bdf9ed06"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/EditWorkflow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7de021e65bc5794acc3aac9051480e2615b435020e2045702861faeeb9fdcd5a"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/ViewWorkflow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4185b4a28b38a7dad4c5ac041653da1472350be8a88516cd1952f3498a4914d"}},{"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":"invokeai/frontend/webv1/src/features/queue/hooks/useClearInvocationCache.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cfabd54917f19b160fe33ac4ad3a0783f94cd2fb2068fbab2d643393d78061b"}},{"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":"invokeai/frontend/webv1/src/features/queue/hooks/useEnableInvocationCache.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9e1a211b365682ac89f628e0ff330943f2871f8f4e79af3f900345dada57d3b"}},{"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":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"44e5e75948573f671a20159d1bf0767cab633ab46da7cc68a918a3f74a81ebe4"}},{"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":"invokeai/frontend/webv1/src/features/ui/components/WhatsNew.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e404d15e6f057ce84467181310527ea74b4b293c53e312a510dc6a0e742e2f5"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerMenuItems.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b3e269c2bb3c1783c963e6d76f539f3e597b370264cecc454caa64c129b3d21"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMask.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc3e772618094d9e5c98e3834256e88f9aee32323112c0ca6b3a72fbb8a09ee3"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsConvertToSubMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e22905d24a78d5904351a6dd9d78ec1252e4c86aafb3f6d5377a49cd8b281933"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsCopyToSubMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5ed15168dbf37fa8cc565a8ebaecedfaaa628532297c8b971284d2adc4f5139"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceMenuItemsConvertToSubMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"300c7ec4be67862595197c0457565a25a0b5b90160dfd39a4eaa862cc3e723cf"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceMenuItemsCopyToSubMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9710243493b80c68b7d84a20820dac05cf8add72b9dab2b52e7ccdd896ccbf2e"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectModel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"14f020041de6c69fcb76fb9f507dba57407afc47c986e5aa2083a9605cc06ca5"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolGradientModeToggle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e29f03d919cfc484bdbf5e5d67e17264711fc60921c9fea8279dde40dbdb1023"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useAutoFitBBoxToMasks.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"40bda0d6a0914ca25411a916166a8270c973f72266cd0e0c0f4df52c10ccb649"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasResetLayerHotkey.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bebd2d004d26af5864c1f22a131554a9afe4234638cdcadaa65d44bb9a162a38"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeFooter.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d6d3c2c904247fc5c9f854856e83f1591ade06069d9b26ad7f6976e60956625"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/SaveToGalleryCheckbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed649d2a4d28cc1c916803a7526bfbb5785483548248dcbf4c3a1253bd357e0c"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/BooleanFieldInputComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"faa2a6beedd41c8ebcc2fc06e09e21a2f431961ae266920c70033dbcc15d1fd8"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadGenerateFromTextButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2d4ebdab61dceb39406c9109fbfd29187688bcdbd7be31e98ff1f4eb73102a2"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/UploadWorkflowMenuItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"19a3ffc9960e7db93292a09706e621a23498ed164059e1dd815338f624891b20"}},{"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":"invokeai/frontend/webv1/src/app/hooks/useSyncFaviconQueueStatus.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bea0da2c39def2b9901e94cd4159626fea4c99d88e01163f46f587d357aff1d"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItems.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eb464b4b615d3a51f4b68a185e87393beb09b9822f8c2aba1cad9fe5de56a9d"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerMenuItemsAdjustments.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e858641cff1057c6a0c1eddb349f11d658b6fed0e704a3cddd706304715527fc"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceMenuItems.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a538efa10901365b2a24856514e0b6e43b7182c5a0296627ea8e6011f5012018"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsPressureSensitivity.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fa1622ea45fbcd793e6735f2cb5512f0743c285bf2214c474fdfbefcf7f0f98"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/EncoderModelSettings/EncoderModelSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e21b928d86eedfa2fb527dcbf8d056fc00331fdc05a968efe2d5c77155fccfd"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorParseStringSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a4c7b3de26358d6ef65177cf0e355f14fc062be25065ee9463ad8fd8e88be12"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorTemplateTab.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c46927127d95007ccf64cb8953afb36894426eda0efe2e0f8a8d9bb0df523c8"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/WorkflowNodeInspectorPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b08d3a8b485391ae395097c8b2059eb8007bc66f50bb9c0f40da587a33a52ee1"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useIsValidConnection.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa1a9f31a50fe594d5dbf4ec47aadfdd7f3868d76a8ffac2e93e96c8ce6a2a34"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/Dimensions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca1bd53e752f2e478957d9da7210c703661556c536116d862f4459550d53ded2"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/ToggleInvocationCacheButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c86d1b5eb1276f3abc17d55b41b98ca503541cacf1992631737695506d686c04"}},{"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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/ExternalProviderStatusList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d33b13bac1607e99e7c31298f7a6174d057fff8a2cf50fc42001f0be0bda796a"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarToggleShowResultsButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"62faba7aa13031ed63fb2c190ef98de461d7c64bc1ff6971b8a54e8395e7c28c"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolGradientClipToggle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8be52a2e0776c28165964f068627df93dbc4f3b30d64103185b1dd00f3192e2"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasUndoRedoHotkeys.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e42125c2235538dc952715370bba2c0c1f074267eb7483fa381aaa6885babb5f"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/MinimapPanel/MinimapPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0801724ebb1ba6ec2e6caad9572c106b935065c287568606f812d78acac0387"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/DividerElementViewMode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"92995040247d6b1e13a75baa702d65b5aced62077b0ab2e1df529af02b83fe25"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/contexts.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"051ece2137239ab7b382fcd5057c934b12ec90e8a65ab57b265c452fe8d84bae"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"175519ee045749f36f11ab4ac9c626a05a55599fe55503238d0fc18e48612c61"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Upscale/ParamUpscaleScheduler.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"894578ac350644c6b5890682289ac914e05ddad772d1f42353a27e2cf1289aa8"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarFilterButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"db112945720ee09d7aea52bbcdc64823ba24bed72547f330da306945431b92e3"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarSelectObjectButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"001180082af4e7745579286cb8379ec172e38de5a2452ac886e4c6b9e53b5e7f"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarTransformButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ed76e75e7c5ee35e0dfb737df52f206b28e673f81fbe1ff37326a68e71c23a8"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerEntityList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb40def01281cb0f7364ece9d45db22ac099ca0682f39f873cd6e416db5a082d"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eeadb78b9768d15a737883bdf152fa0733a0dba49d4c9e9d583736b6d596ccf1"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolColorPickerButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f999d7996d6ab1e04aa6cac48074cb631fd7e4e7e5c41bd4063bb18644108043"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarProjectMenuButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"30abfdd38f3ae973320ebb2c4fec9761747a502e51fe3c515bd418bf9242a8df"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMergeVisibleButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac18d92afb20c2167e02c4d1c73ae38fe935b0a638ef7d4590605d4627afb709"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useIsEntityTypeEnabled.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a833a3f58fde5de8ded508a33f005f9c8535d1f9d245d04261fc628a6ad87b9e"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemOpenInViewerIconButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"da9361969b8a23220878130a5f98d422411466c9d5394bbe5f62ba1a9fac956c"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemStarIconButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f1c66e60cb83829d37ab2ecbf711bfa8a6d212614db8702fa2834f4cc895783"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Advanced/ParamOptimizedDenoisingToggle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fad4a8af598561b7bc78d4784df86a00d36c3edd8af762dcc601e4d2199c3adc"}},{"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":"invokeai/frontend/webv1/src/app/hooks/useSyncLangDirection.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ea3cbcf54915abfde86db242a9192f7118e5898646fa922763bb7ecac17c904"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBarDuplicateButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a5db4f7df09754ce5b7e39011483d5de397e85d57cc655af622eefc6f0f8f16"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerEntityList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f156b48a0938c206f900f3d98609db6dae4a316f80c87972e30dba2c029d97c"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceEntityList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9e5a08bca4f89c603654b5cec79a733025d3a7973c656d6be029c04cd007f90"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityIsBookmarkedForQuickSwitchToggle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c894922821d9824faf53ba18ee153c1d52d14d099321bf188b8acaa3905620b3"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasNonRasterLayersIsHiddenToggle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e2cbe46b660636bb0903441e9c7a847fd5fc941c5b2cc4e3f779f7ddd593a29"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasInvertMaskHotkey.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2c74a1193f33df3d08ce46f0686eaeb3223284dea5e24958bfdc34ede4d951f"}},{"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":"invokeai/frontend/webv1/src/features/deleteImageModal/components/DeleteImageButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"55d0f7a8535d7f26dc0c4b54b46f3d5421f779a52cfebb6f7826a5e2cf7afcc2"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/useToggleMetadataHotkey.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"061565e4703b91c2cc605b7fd925f6ced8aac5db7e7f9eb1ad3929af9a53c232"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/PredictionTypeSelect.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"36d08d23735e932c60ce0ccdb4c45ac970b750cbabb0c1133bf2bccd64d07360"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/NodeFieldElementResetToInitialValueIconButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2583c16f9103608133ee021acca193b7013ec063792af41d8b14a26c51561945"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/StringField/StringFieldDropdown.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd0086881d22dc99a9152b080f92594fd776a37cff6c6f0dee830dde3f17dddd"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/NodeOpacitySlider.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4914f311fec7033ec6f97b3632ea1c313ab83f75cc1570f83798d9a9dfa0350a"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldErrors.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae647fe777379fe7df9dc88d2c6fa3ffd74f3d564175a83811ec91c6ba157ee7"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxLockAspectRatioButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6409723516828464da94c91cce38ea696ee0b35c01dd906e1a2181eeb0d1032"}},{"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":"invokeai/frontend/webv1/src/features/queue/hooks/useRetryQueueItem.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4dcdef3674fd919e17be2a34951c10e3d2f9062df81c8fd83390087280141bf"}},{"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":"invokeai/frontend/webv2/scripts/dev-mock.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f9ec67f5d74abb5fb7ca115644da7736d475c72ab4be12020adc043347a9d21"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceMenuItemsAutoNegative.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d96355d45b0869195514e2a0ae28089f440b97d3317ccb408e80f247a6b3ae0"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsInvertScrollCheckbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"83e8852fc9e48052846abaec6a928ec5eabe786aa52aa16d83a931c6658680fb"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolShapesButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"80df93aa7410a0649a260a725ac6d1082f8c0e19476e9a1724667543ff319a0b"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityEnabledToggle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a4e7db5df361e7588fb511d15957c6139210215ec384ad22e7be98f2cbfacab"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityIsLockedToggle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c066700a4a0a28da4903073cfdd2a6c655aa652c47a88c726e59861896984eff"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsMergeDown.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"56498bc6f86a7d9cc88be7ce2014d2caa649b7c8cc758cba2e15c5b6c5dde257"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6bcacd1ec2a64f85bc08b196333feac10b0824e2fb470adf63082ee52d9ae5e"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsLockAspectRatioButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"26319192d0eb12b3fc55d92cd53090aff615cf2698966b566591b7f7246fca52"}},{"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":"invokeai/frontend/webv1/src/features/queue/hooks/useCancelBatch.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dc9dbfadd0b592844a8693ae1945b70009aec7a69cb895be733e503d89ea221"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectInputTypeButtons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffb57c9a433b7fa86ca2a01eec78f07acfb13c700f476099e1b562807ee06d1c"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectPrompt.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"020fb726745c86e88ccf5a24012c23ec52f809a47de23f9deee5f7266533d9a4"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolBrushButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"93289564d5dee0f7b3e9a0b69e3823bd952b6687ec74a9634b8d82a4c27581c7"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolEraserButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4de8ced0cce88a376fae1c053c37f5b1fecad8ea237f0eee2fdb1223cd9ad003"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolLassoButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"befe4de88a469f081bfc864ea3b3afaff586915dc1e356e126c346e9b039c597"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolMoveButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0acca492883e57124c9372c003f479e3d97dfa1863c136b172954c9e9931da94"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolViewButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"30bc5fd337fe98b250c005f068d493ebefab6512d9d9908844f2a5991b83223e"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityDeleteButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccedda858920672b1142407cd89acbd431b73d4b7df1093a4a061ab5edae2afa"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowArchivedBoardsCheckbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"167f33eb47a9d4b1adbfe8ddbf312056f9b880b9245020006263a6f573de6bb7"}},{"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":"invokeai/frontend/webv1/src/features/gallery/hooks/useLoadWorkflow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b140d4d193654eb560f3f6ec4c5f9effa1fa42c3f8c84fd69a9e9da6f831158c"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueueBadge.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5075e6981f3a53ad00161db95a3f5f74ee9764c139f4b5335c725d0d927a0707"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/SyncModelsButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb27307db82c41c497e7c1d6e4a247a54fb97b69a80b63944c13b3bd7063fe3c"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElement.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4c34182021f624d8f6f6aeebcf9aa43190f2948d1b2ca3e0572c6ce84c6af72"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldDefaultValue.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b003fbe3dfe8efb4db716bac98b1f5eb221ea77c659adcdfca6c558cbc40fe78"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedShuffle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a355180372598e59c80f0195c94bba071616a63d173f036d0ceb1d60e2d286f6"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/common/StatusStatItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c52df66c892d8883548d655892a591c6ab36da3d50037a07ab332718c4af5f2a"}},{"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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogLevel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7287677dcad65b994f63c6d37512ec2368116b1b731fcbd45766260e47ef18ad"}},{"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":"invokeai/frontend/webv2/src/app/I18nController.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7a221e00d8cd2e64afbccc9fb75e000a4f7a2c7e91a01a302c795a96a9bc836"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceBadges.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"14e79f80a5828994645919fe62481a1e0df843830390b2cf104063ba17ed8de7"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarDiscardSelectedButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"66ad6434eae12be7200877bfa194d0138d3a9e9eed4cebe10f80d35436ae0a0c"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowStarredFirstCheckbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0aed8642f798a84c32935308deee28a7c4b84eb9e0d553b2978375096c64158"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonLabel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9def317ebc3bbb14325dcc4d17c1b3497737cc0b60ef247e19c656162f0dcb7e"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageViewerToolbar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d4a69aeca12a6dd2ef2991ea92eba287293e35f0c4039bef2698ace09e1b587"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/DownloadWorkflow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b60a4797b25e5f9935777e2daf959ed73b318f3d75970a2805a0b70fc6da1c7"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/ClearModelCacheButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc855e7b0642dc9f8e5fd9a74af44f01fe8a88b665229903f061f2b146fde953"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/DockviewTab.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f67ed710ee4dbae3f450e9f2d7207374910ea7f45a6a3f4ed22bb9e2f243a6c9"}},{"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":"invokeai/frontend/webv2/scripts/service-worker-plugin.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e76b5c63fea28ec5df3a42b091db0b98f10b30338d0c26449dc11d1458b2272"}},{"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":"invokeai/frontend/webv1/src/common/components/Loading/Loading.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f601f46e8b339d7b03351b75d6bf72a6ff5ae78bc7607be00b7919184a3c42b6"}},{"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":"invokeai/frontend/webv1/src/common/hooks/useGalleryItemDTO.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dea275af0bca14fa4856512eadcbda1ce97ded8be4eab431898e816c98a369a5"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasLayersPanelContent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b03ff7e625e7160a4675f2b4bc126e5cafd6381ef287f22dae20887c01b1db2"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolChooser.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7073eb182fe6adf329449cb469573caf359a2011d9b152b3bf411ca612443b27"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarRedoButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"694687b3d7c27441f8a912c7b32f517b9ddd389196d534d9c76075487a8ac5df"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarUndoButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ce02e75c3a2b18abfcf6780ab13cf44f173afc01103a31d93be03d00f07c3be"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AlwaysShowImageSizeCheckbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ef73c1cb2c899a91cc21a5593f492b496942e7e844282b80062c50ba5716010"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ToggleProgressButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4481461d6861270c20bd1cd26aa0a02a852ab412866f6a71ee62bbe63b3f5998"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/HuggingFaceFolder/HuggingFaceResultItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fb625913e6c40be129d4066d054d2b2dc64f46b898c7c97dfe0338d061bc8bf"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/MissingModelsContext.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfeb4ac66a91aec322c99af908805857076b07c4541477b148fb89f2e2e36ec8"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/BaseModelSelect.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef5b9a7b2f616ef28072d699b8826d81652239823673ca342daa532275d2d287"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelFormatSelect.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"002243fb1e71c2a1c0d118f00d9c5de76cadf41d68f208ac044e91dd365554b3"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelTypeSelect.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3885a77207b7847c83e10e44cb35526b7ac2b8320c7b461b2ab3896a6c2ecc4c"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElementViewMode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a0ee28197b31a7667f738f4fddc621a9595796371945e7ce6baa158d86d963e"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryListItemActions/DeleteWorkflow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8ef5d2663030cc8fc7af3bff16a8ee55e08a2ec81038ba6b7eb501fcc1cb653"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldIsInvalid.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ffa7161785ec8b1d180daf59bd0384373bc127a49585d73d77da65b14ffbe64"}},{"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":"invokeai/frontend/webv1/src/features/system/components/InvokeAILogoComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"158dc68bf89a459b742e559d01c68a19f094bce243bccef16a2bf083e5af8843"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"24b55140780f4362697e5cbc4191872c0fc58003a14090071bf571c00fe4e326"}},{"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":"invokeai/frontend/webv1/src/services/api/endpoints/virtual_boards.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdfe888b06be19f925e0e703638b69a194287862a1aaaf0513dec5aa8f9b0cc2"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterHEDEdgeDetection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0262ff7aa21b30edcbd9b67e30cce903d7fc6dcbc8c911194dd2adf501dd0a39"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Filters/FilterLineartEdgeDetection.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"728e7fa701f8a6a90dbaa563653bfb6d624ac551a678b63b4c1e43518598da15"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerExportPSDButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"64f308a1240a9cb4a1705c7fb753ea1fc7d6f4459e4669b0b4adaf0b124dcff8"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarDiscardAllButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd660116b19b01f635f344d14162e3b93fe1c3cfbe41f793232b999bd8233c0d"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsDuplicate.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fddddb03403443b53b1f264bfd0d8533c09d690e42a1f1122a2e32b12bede180"}},{"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":"invokeai/frontend/webv1/src/features/cropper/components/CropImageModal.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"226ebeac72f546e2c688a3e0fea3850e5e786ae3ce7a8b1ad50add10508ece5c"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AutoSwitchCheckbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"11cff47019e85aa7f6d79b63a992067a114a3b340de2a4a3ab1ee28f26bc8aad"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/InvocationNodeNotesTextarea.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af0a8528f4eda3aca98e2f888f76026ade42ab74faf69062ab35452ff72667ce"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/TextElementViewMode.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"56982f19c5e9857316ceeb318c24e767d92e5818a576fe0f04b5115be82f9163"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/BboxSwapDimensionsButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"acf693ae70dbcda85bbc8f76d91f9d067d8671f4498138c82da7dcb6288231c2"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/PruneQueueButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4867954f868c278d48427a86980cd8aca9705db57e880b46b5627e150a88c8b"}},{"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":"invokeai/frontend/webv1/src/features/systemPrompts/hooks/useCanEditSystemPrompt.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7712f86c2c13a0dffa015233a0aaf9c54a763c2eefef06fa8ca180d9e0866210"}},{"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":"invokeai/frontend/webv2/src/app/main.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b62d39214f7fefe876d4f7099ba2195ea127e21079f8b444ce712b65ac9c96b2"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarImageCountButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"db510abf6ab39df34e487a808ac9350fd994a82385d89fe8f7f30a334f9ec3c7"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6de09014ffd97043bdc1c0c5746b8b0792400c42c888649a8bb3538882cf2478"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolGradientButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e68f76e2a9b198fa34e76b661942714221a476f08421d7a9601a31888b9b5977"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsCopyToClipboard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"068ca840a9b2a8c04197860cc4713be4ed0bd0b797369924fb8263913bb6b700"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsCropToBbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"425495e99a73a714d55b795b3b47bf84effdabdd24a89b469e0bcc8bb12b937a"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityTypeTitle.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"56a0bf70a6caab3fb86c67cd9ae55962625968302047b377a4c946bfaf2e61a1"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useVisibleEntityCountByType.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8d6f74a0b88faaccc0e5441fd1a96f471884dc6922911009678a9a63338289d"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/SettingToggle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d499222c9d9ba8e78e13046e6dbfd86565a70c2c7ef1fe201a32d46a9f5447f"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldResetToDefaultValueIconButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d15e93e73bed69e127c06ce8a6faf34449a7281e589edf5df3cff96e68e27214"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/OutputFieldTooltipContent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"35713361d776ae4f61fc7f91bf9c70484b2430a86a581ab8631f27cce4745721"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/StringField/useStringField.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d56263d611832cc777e5978453680f27ee55203634956269b78cab168cf481b6"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/FormElementEditModeContent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fd4c9c91f6148de5b45f167225ed1d2bf515349d7971cfe50b1e2166ec4f8b2"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/WorkflowBuilderMenu.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5acc0cf11dceadf0b559cb4d6d9ec203d230aa02f3a3fcb27562de1f5fa90307"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useGetNodesNeedUpdate.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"274c855ceaf2eae52dc2154de0a898a07b2216505c3ad06b58762721e7797fb0"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/PauseProcessorButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"092cb01d462f1eca8fa67d4eae74274603f529b781963273f09e08838e54b151"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/ResumeProcessorButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d595b20b9d1614902e133aa927884dc77999c5c08aa62076cf0eab55abfa50f"}},{"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":"invokeai/frontend/webv1/src/features/ui/components/FloatingRightPanelButtons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d5e54c3a4f38ee52f0742abce0d3f9da952e5d16f0f2f65949a8a7f56f10f5e"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/PanelHotkeysLogical.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7abf445959222021c83c39289b4ded706eb1494386831f604156ba1ac7147b8"}},{"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":"invokeai/frontend/webv1/src/app/logging/useSyncLoggingConfig.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9a6fa6f3a5f7bbc70f3ebadb89264a0f50d4ea2125f67c1f594ba1196209044"}},{"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":"invokeai/frontend/webv1/src/app/store/middleware/debugLoggerMiddleware.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7653c2ab1f75dc0855bb4d97d4eb6f13ce588e69edb3de319bb69e0aa511ca29"}},{"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":"invokeai/frontend/webv1/src/common/hooks/useCallbackOnDragEnter.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b892c9c59d9203a3022a29f22ba17ce5e79a48cdd59f8c8731278b1c525e2c2"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasBusySpinner.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"20af85504d0c314bcef28d3c6c6685bcc830e0433810431217fd27559edb6378"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskDeleteModifierButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c94d8eb254f3d78b77e3d518651089e41e464b14814bb18ad53f96574bc4015"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceDeletePromptButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"98989f645000f606b28673ba7566e139631bdc57174c5de230c75cc79dd281ba"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/QueueItemProgressImage.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2c1f5f704a6379c464f4a0aa3d14020178165b54e9c4f68be187a0c76483621"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaToolbarToggleThumbnailsButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0548d0a4789d47d83dc4ab90f8f4abd787493c2dbbb7535c3aff13578a798c99"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarSaveToGalleryButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4979f57bf731fe10f65614f7cfc8afa5bad155652ca8ee07734a763c16f64804"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasDeleteLayerHotkey.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5363f8a2d7d9a8b40ca7ba8c90649e4d09a9b73142e22ea49a989ade981fe25"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasViewToolModule.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"79fe1e8ad302f2c348016b59ec7f9fc02b3a7a43f7bc7a73017de6ff1657da72"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ShowVirtualBoardsCheckbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a2fe2d7b2d047ab0fff5b041d86ca49f4e4e613a92292063a9f6035ef1daf9b"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/UsePagedGalleryViewCheckbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"349eb6412b63e2de676b26c022c58a67b5116f38d4626220205baeb7181e96e8"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/Fields/ModelVariantSelect.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"47eccfc2503ba6ea952e7409150700a001c2fdaad673330af26f50ba9f4fca84"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/SaveWorkflowButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"34c4f2f6d9a1b963f3e4eba8559c2f7266caad67c0b217384b1684084492ebce"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/ClearQueueButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfbecccdc1c73f11bae58595bdf98b4c38a40c65714def086c8037f49a322df5"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/QueueTabContent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e4abe2b47f5c0f7ccfb530091d4ac305dd80bf00f3fc145611c0e051b813d42"}},{"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":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetCreateButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c6d00c584d781ea8624dc47e0a763053b961118d2dc93f32b1f497b95164f5d"}},{"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":"invokeai/frontend/webv1/src/features/stylePresets/components/StylePresetPromptPreviewToggle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dbc2c480f12624c39bd372bb87345900c6672b5e7351d4afbecb86a78246736"}},{"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":"invokeai/frontend/webv1/src/features/system/components/SettingsModal/SettingsDeveloperLogIsEnabled.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"39b8145ff8ecff2e0dd053ecbd16ef570b1a6423c3111177b169e31dd7e89287"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/components/NewWorkflowButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b7c4992b1f293d731c009d1fe3ced2a676aa6bdca915482785c9e07e3b0970a"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/SaveWorkflowAsMenuItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a93415d141be1cc554f7354f7f835f205c818542396510a572cca38020e9e2e7"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityOperationsBar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"48e213e508bce18660f352ed58232c73f58b5e5dbbce6c60eb2578f899b74bfe"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasOperationIsolatedLayerPreviewSwitch.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9b2bccfd3ff31fb1b98e7c3a7fc3aa37763546529defeddd875a0f0ef49dc24"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedLayerPreviewSwitch.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e910eb73b877f41dd705d1519f7ab31c39e7dec21b4b8a15ad7b3dbe647fec0"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsIsolatedStagingPreviewSwitch.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec030957514fe1ab98cba3e004ac74d6b69462d0355d47917282b187211d47d3"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsShowHUDSwitch.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"48a5f538595fe1bf414e2256427dee0e8e1db7daa3d0723bbd937495b3e542a1"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsShowProgressOnCanvasSwitch.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"47ab43a94fd9fe0e750e41689b1b4e1c5e5b3cc5361a392588c06d7269576c32"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityTypeCount.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cc80a740cbaecc1821ce85a57e580730e6d5b0ddae421c2e8e51721fd631610"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityTypeIsHidden.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"18d5e42413de51042ed45b3d66d9d2dedaf624c4d2030f654cae95e2cc4ae8c8"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useNextRenderableEntityIdentifier.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa4ae87812fc5396118861836f21e2ea995723241edc3b0fa8f15c08efed8662"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/GalleryUploadButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"93af035f90d381711ce5a42289c7c0a9054e601c9067c6e3f9a56d2c785625cf"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryItemHoverIcons.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"709701e107f9b1f601eab03810b5fa2149e7e4a8626036b8e6f23e05adc92b66"}},{"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":"invokeai/frontend/webv1/src/features/gallery/hooks/useDeleteImage.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f1ee719399b4bc0f4c1ff54f7c0ea44b85ca6163609cbca6392f7a2cf09f478"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/StringField/StringFieldTextarea.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"60c968b723b93268dc936d1e084795d447ab8c00ac2eeae311d213c72aa03255"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/TopRightPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0600a0b11a5056fb489651b704a5fc0250bda74a296ebd8234ccb5b3554bb90a"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowsTabLeftPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6453fad997663770cbfd58a98a3b2c3f0b0ad57114243ea9c4f0052f23b97fb1"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Dimensions/DimensionsSwapButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"33e2e9e5d182656423af914e9209f65187fe855872227a7de0238ece7821ebd3"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/QueueTabQueueControls.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed38cdf0e3520b82f21e9db43023c21016c79832f1b863dff6d463ec57314770"}},{"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":"invokeai/frontend/webv2/src/platform/i18n/client.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2873f5394be4e7d6f5d790a8a85f1d8ee0e327c49612d7b771f75554dc9e8e74"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/InpaintMask/InpaintMaskMenuItemsAddModifiers.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8d1a103d17bdf5f20b07d49421300e5cd25507102be695dc5ea6f585d1faf6f"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsClipToBboxCheckbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9e40df299dc2b5b7868ab54f06470151110a7a9c6e8bf1da02af14a6b6c9f57"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsSave.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c730b031345b2233e593a17532d3e099d80304fe4f7979e50d6b0ec5f81b88e7"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/patterns/getPatternSVG.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0efa6e4d8459a6bd3f84edadca6d845264cab50f06b5ba7a9d628d9f55fb3017"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/AutoAssignBoardCheckbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba23ea815da5f7b0970b3be66460edb17434b6db5ccbaf15afc11724a88c7fae"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/GallerySettingsPopover/ImageMinimumWidthSlider.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c600f492eb964dac7b2d4238fe06080dffaf85ca8da2397b2729c9d86b3028d"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/SaveWorkflowButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"51e2689c32dbbb5d10ef9a0e184c78461c1ec8e5722292d176b28978d0255960"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopRightPanel/ReloadSchemaButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f254052f86bbfb6ef948f4938d59e4b3c4344bcbbb1675a3a2e69be2dee4ba5"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/WorkflowListMenuTrigger.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea9fdfec57a5126a2aa579a44c046b6a0dc26159a5107d9c6fdc52a4f516bcd7"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElementContent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"820c6ccf08258597555d41ced5f7aef2849c2ea8f3f15654f317f4e216922d21"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/TextElementContent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9ba10d68806b444b749b65f2d6923e0c52dfa8e5445897dd43be59b5168f8b9"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeHasGalleryOutput.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"619f9998a722a03ff7726d6a027043d4b3826b8b53d71e3cdbda8504a496f570"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeedRandomize.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"87d13faf2c2d21ecebfca9b24dcec3ce2d9853398495915840d270373809fc0f"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/SaveWorkflowMenuItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e6940b55b5d3d7d79c46b0aef9560aae816eac11eb1a294efaaf21281b9a46b"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasContextMenu/CanvasContextMenuItemsCropCanvasToBbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bdb71e2bdebb1031dd92dee46557bf2b857dd9833c87a3eb406c681d0fdfa5f"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/HUD/CanvasHUDItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a089d0a53256b227cb1c93375c3a02628fd8f80caf5c3791c1d00becf04a5cbe"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/SelectObject/SelectObjectInvert.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffa684323f09434b21b7757ee275cd54710e9ec687cc38fab9007fa3037fc12e"}},{"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":"invokeai/frontend/webv1/src/features/system/components/VideosModal/VideoCard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af29ce2a009c2f0a6d2e8657b538675b59d39942e57497976b3a06c03c316a59"}},{"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":"invokeai/frontend/webv1/src/features/system/components/VideosModal/VideosModalButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5c601c50c616b4873f409b3bd421f3bd6e83af81c1a98728ad0ea5896cf95c3"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useSaveOrSaveAsWorkflow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ed1410965f08880dff011a657ca396f332991efbed04b778d0e14869ebcf979"}},{"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":"invokeai/frontend/webv2/scripts/widget-sources.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d7876e8f580edd005ea2c7a4a5206e1976ebb5cae40e153bf061d0dde69d01f"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsBboxOverlaySwitch.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7d92422e8ddbfd79def0ed57c83a91bcefa626a313f0ba5f4ea750a335aa622"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsDynamicGridSwitch.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d278227f00e965823eaadba692c8c2e77fbbf2e00aca20706dd51a9c5dc858f"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsOutputOnlyMaskedRegionsCheckbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"903654ea3e28deefbf8b8f02164281d7067adaeedb595509c494575083c917c6"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsRuleOfThirdsGuideSwitch.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0e89315b226c76f9c0d8808eef4a0276f777af898a39b0e23b0eea2871df713"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsSaveAllImagesToGalleryCheckbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5ae5139abb02b4046128155194c45710eb6f523bc9dedb4c94481df2ebd729f"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolBboxButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"809a887e244aa032c6b3d6a9080c542f77be3425a328af459b2647c167875d38"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolTextButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9443d2cfef902b7d807448e4084d8333cb736f87cf41cda49470567d9a97e62"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Toolbar/CanvasToolbarNewSessionMenuButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"39355b4749a2ba057e503bc1a76aa387a9d5319ee14d97e671b924e82f5b7187"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsRunWorkflow.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d10ff22855691d6cb9d7a79255933cc2a6f1d441ec6ee12ddb651737cc6eff25"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsTransform.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1669d7fd2c0304facace4316cf037452fb8569a92af7248166da423e7ed3b330"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityIsLocked.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae255b9efba9e5b8be2509ec8017d6fba8868b2abf75945f9ec484bd4976a8e7"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/useGallerySearchTerm.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"549d678664b180c6121d7a4dd39205fe47abd0b0574addedde758d61786a8c0f"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useLoRAModelDefaultSettings.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f3528724f9a70e71c4f9495886082fa4049026067ec5d1c2956278e333271f7"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/LaunchpadForm/LaunchpadButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8e927f27aa8a9a2b0a626a8d663493d307c02d09637615337d0da9b65f29752"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/StringField/StringFieldInput.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c14bd2f3a8bc0053f21346868300d7a063858b91454e5f7737c939460ead0601"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/AddNodeButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce6f4c1d3ea36cbd00ad2be0943df78f49fed17ba2309c687851d9f82aed8635"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/DividerElement.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8302d5ce20eb4fd2e72707b6a8073e823cba7b0be34723defdb9db23652c6aea"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/DividerElementComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc8b1c954ef9739fee67060bce0aae6d4354f4f442c6bc4232d8ad0be4dcccdd"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/HeadingElement.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d34b177c210b158be493b8dfd2823d257c3177cc88b7a88ee852af2d0530d423"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/InspectorDataTab.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d526544c1b3afb670802968104c71ff5710f648667776b32cb1dd848cfde9d8f"}},{"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":"invokeai/frontend/webv2/src/app/FeatureHintsProvider.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c3092ce302e83381ee026ee4e9193b8de9237f4dcd131d5ce342e0bfbb53d13"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsBboxVisibility.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5860d1af3a7282104000de2321fe9569e9e1724d7eb520a2b61c020ce88281a"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsTextSessionActive.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"32ab2660ee0fc6e7604fa680aa4b10ba84fc526b8ef2d9b368a7cfcb8a4f93fd"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAutoProcessSwitch.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0391dc702dc26f65e47e76d9c0966e7b4c07f10890f36459c0e5e96d7ea97122"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/HUD/CanvasHUD.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"566cca6bf78f3472cdd2d7b4f03ab3bb68f1bb6c242bc330fa6877ac3e51ee05"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsGridSize.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e2a67641a3bf98d336eee0443900bce62f83ee9f464dded2ab1aa944edbbac2"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityTypeString.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"40ba00fb0038641ac9894cec267421bcbb9de2488684f355ec7ac29faaf39709"}},{"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":"invokeai/frontend/webv1/src/features/customNodes/ScanNodesForm.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae32361f5d5105ecaffc4f078e75d2ab9b09a44739c0e18b0720b7e3b7608673"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/ActiveWorkflowDescription.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"31895ec4a0d8ec03575a88333aeddebf251bf07a4c7b602a6a6ece6865fc2973"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/ActiveWorkflowNameAndActions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"74bd205d53343f4d30724bfc3a8ea9bfa307651c8671acee96e4eaf3aeb64fce"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/NodeFieldElementLabel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"57d8964c4d9627162458e0a4cadc00fd800f5e83cc34b4bfac7348743542e53d"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/TextElement.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"241a36f45f3cd8df258896fd8c4cf1e5d3ebf85b35503d490855d4fff2d28ba0"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useBatchGroupId.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"87b2615308d19737737a76c69805021d7d359442c78ef8c9887a1e8ede1beafe"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldNameSafe.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5f2589a2e36fc3301a3438e1bd655274cca166210a50c6271b99274bcd05076"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useDownloadCurrentlyLoadedWorkflow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b52777d89754188e9d792dd6beddabe699532ecedf25ce75b2ac887d38f33cc7"}},{"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":"invokeai/frontend/webv1/src/common/hooks/useTouchDeviceClass.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cabcd03f3ab21757ae30e19085d4d1d49f74bfbec25e878e540f716ce60dca4"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsPreserveMask.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"63df453ac1692cb6b853052c00d50dbca47269f4b3357499fcf017a678d64b5c"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasAlerts/CanvasAlertsSaveAllImagesToGallery.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"48b288f200458b37e6eb95375a5509e19acc31fc10d909ea805127cc9e48c5f5"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/InvokeCanvasComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbcfb6e24c7d9b6fac4ab9e769dbf3be2d220d5965c80695f71beec7f7022848"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/IPAdapterMenuItems.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"23a31371c52570add58dcc2c6346030752b24f6e961042562f5c0fb8ae4849b6"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useCpuOnlyModelSettings.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fc299d3ab20e135678ab4217c36e46c2fcd3b936288f56764245d97ed5119f8"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterBundleTooltipContentCompact.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9beefd0c576356eb71e9fcb793d13917a7e73e5c78f1f393240a4989d1aa978b"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelEditButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5aa6e4db715c6e1eb766aa293afb56a611e0f2106b4fc0260b5ddb85df9bf998"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/QueueStatus.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcdd3c3d68df1cbf534037bba6939b38ee52a4f698ba7ca38e9951b1ac15d2d5"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/common/StatusStatGroup.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b81d5c9092c5a86202027722e249f61767f593ffab761146910cecd76f43960f"}},{"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":"invokeai/frontend/webv1/src/features/system/components/StatusIndicator.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a8da2db48ca34bfc5d4cece1f6e188c7bf91cfb6d9d9b786f865ce56ef18186"}},{"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":"invokeai/frontend/webv1/src/main.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"77bcf4c90546acbaa3d039adbef0c14c5c41980d3b833769492648bf626f33c7"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/CanvasEntityList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dc8e8f5db680b68579e8dd7be591d32a7c7dafbe12de301e863a5781d236b6a"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/IPAdapterMenuItemPullBbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b62f82c709372254ff8696153d44a1ea6c7194ceb3b3c78d51f5a378b9d888e"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsRecalculateRectsButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"03147488d6c1490ff78d46603274c870be68db25e5133218e87fda636bb8741a"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityIsEnabled.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e831f778386b3abdeb3157c777bd1026edd4ba8015bdfcec3d132019edaa564e"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityTypeInformationalPopover.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d049468a93657bb2218e9d93a1ac31b141ceac23e663972ce5b3cac7be63a9da"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useControlAdapterModelDefaultSettings.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"35670d56b9dbb630cebe2248113b304e920e1f29378ce1d1a5b0e93c1481d6ae"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/util/getApiErrorDetail.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f62a984276457438cb7855aea9d487f45498b8de9a19777bac192d6e6c6197eb"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useBatchGroupColorToken.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"19e6739a9b1574eed4e95d5453d7afc55183f84b736a3c0a7eec09d00dee15be"}},{"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":"invokeai/frontend/webv1/src/features/nodes/util/node/buildNotesNode.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9e924544f762dc3b79e97671fbedc13de60ce7d23653660722ba932d9e5632f"}},{"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":"invokeai/frontend/webv1/src/features/system/components/HotkeysModal/useSharedInfoHotkeyTarget.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbf3c4bc07266fde67e73afa0afe785cd0e37f86d3225dd1d48d8225de27c845"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/LoadWorkflowFromGraphMenuItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f650d749e3b7b518e0ab4aa4a6048c20c950da2f55ab9880077af0c33e4325b9"}},{"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":"invokeai/frontend/webv1/src/common/hooks/useTimeoutCallback.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"638d2730b9b2e17093297058658aa5767b26b77ee3ffec62ff836daa01f7313e"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/HUD/CanvasHUDItemScaledBbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8f7b6400b35797958acbb0ca6f78c5f4058f9835f22fb2b27b7b5a2215b6b8f"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/ToolOptionsRowContainer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e7810c98a8073ced40b0eed641a82d4854b7e480861af3cc5c64b2eb56d5af2"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityHeaderCommonActions.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f17225bdd06ad05c9e9909a01825ad3157cf5fa8cb7a05a069ad48adcaa899c8"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterModelsForm.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"79ee1320e6c65bc89e01d8b80459ee55f1b9af15ee03a32c1831ad5aacf657e0"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/OutputFieldNodesEditorView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"658208ddecb08db9f3a606aefc100b957125ab9fd1c55ed22e2961c67f2f77ea"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/WorkflowWarning.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"040642688a67590a4411c3c701b5979b800b53d115140e37baf836fa7d1a02c6"}},{"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":"invokeai/frontend/webv1/src/features/nodes/util/node/buildCurrentImageNode.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"477f30d8a1d8e5a17ede4b34e18c41818eacb1eb7979c91c6c2ae96d7f5c2dc7"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/ClearInvocationCacheButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"89b7b4d5e22a97a4f750785d76f464cbd3b2b44d68a011147fcaac98b3ade2c3"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/QueueList/useQueueItemIds.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e4a3279ed8f05ca1f336658914e49f773f3ff40052160a3ac2df025bf92f5ec"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasEntityList/EntityListSelectedEntityActionBar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"24da0b340b30af68317561520c14741aeac97f1783525838135a8e3fdc2e219b"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsClearHistoryButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f874cadcd179918a24d4f273f688cd2ecd6750518dd59a45520038603b618732"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsPreserveMaskCheckbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"077ece6b11271b0abb19bd1a9058f2e5b7235a0855ed03e68834842127389f1c"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsFilter.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b5e5cf9df1a86816300eff74da7ae9f150fd26a614d49ac766b3a10de2f4df7"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityMenuItemsSelectObject.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc82e07a0c2552888426c1daedd99c2c9ae841c461dbd94d0f490e3f14339175"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntityTitle.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"26407acbb10a1e4fd970252490f236e82aa86ea7327951daedc123cd4580acab"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/contexts/CanvasEntityStateGate.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"30a6833626055662c46255719544a3a8f75fa16687d1ac15f5960e493fa1a53c"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/ImageComparisonDroppable.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"850434da933317aee1468f6ad8f0a619f1812fc8ff7c06cdb5248b2596ddb05a"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/ModelAttrView.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"62bb61ff5ece688f2026676b7ad0b7d3b5ac4be1fa66fa1fd755d03fba20b21b"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/VAEModelSettings/VAEModelSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a3f2a099ad5a3c3a1ba32332f9ed4db9a3138510a1007adcc6e353581facb96"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/isExternalModel.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc9907c91dc3383356be881566869b563232d74fb2d284a35544bed929ffdc36"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/use-reset-all-node-fields.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"81f560c133b2cc986597f3da044caa4165db918d3f1aa6334845ad055679742b"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/ImageOutputPreview.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"21beb78dafbd82740f3c8f96254ad95713ab7e8ad84d2d55ad088f0405c69d6a"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/viewMode/WorkflowWarningTooltip.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e862b73562dc5c90834b329fee0bebe1f9824fcf5ff640e500e0c090d175eae"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldUserDescriptionSafe.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"15fc12295501cc77ac0ac7dcfa9124da443b0b0c3f26778745cdb558c3843edd"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldUserTitleSafe.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ace9fef7282eb1e1377448560fa8de07060d0850fa707133b55363be0028fe5"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/usePrettyFieldType.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c0bfa07e0f2e814bddf3a40a4ca4dbed0dadd27156101dbcec74cbf9a8cb7b8"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/QueueList/useOriginText.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d15afdf44eadd57e0cc83412a7081a761fb7fef6f57767142954ca790274dc6e"}},{"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":"invokeai/frontend/webv1/src/features/queue/hooks/useBatchIsCanceled.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"661e0790c1af8bfc42b291d270e611d385128db966de9606d17898d585507e69"}},{"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":"invokeai/frontend/webv1/src/features/system/components/VideosModal/VideoCardList.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0674057ea447b8b6ced115ae4f90b152f1b85599f26ef5e227412742a5c68512"}},{"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":"invokeai/frontend/webv1/src/common/hooks/useCloseChakraTooltipsOnDragFix.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a68c75705f1827e4b5e2bed5eb3461d759fe16966a7af069052c27bfe2021908"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsClearCachesButton.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"75dfc893d10d86f29c01f2e2ef8384457ac8fc924e60e6860936060f90649794"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Settings/CanvasSettingsLogDebugInfo.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e330a6de3c1f6b0bbe75b4c011dc83c6f329360242f09978b8a110e6307c0776"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/hooks.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ec641dbb7e0fff713892f0b1e584d3a684ca89f1dc88882a407bee41b1bb070"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasFilterHotkey.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf54828d0bbcdd79b3d75bfc474876ef94f9e4a426053cdfb29e89ecf55eeb97"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasToggleNonRasterLayersHotkey.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"72dd88a4c78c9bfea30b8ad98a3ad5256e07357fa1326d91082730db402daf4a"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasTransformHotkey.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcb0a58230083f34165c2c7f8bf4469686e1ebfeaf5099218b62f5eaa480192e"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldWrapper.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d7a3bcab8b6d62c831a69a301e7f7290b47828d25bffcdd7800dfdfc8a2b471"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/inspector/NodeTemplateGate.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"52624aae642570799eacb6c455c680f4b201e3db96c0e50481dc30fd87e7d097"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowJSONTab.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"12ef2272142d5dc8e1598339dd09007c5ccdf10853d04968b8271b60cdfa8617"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useOutputFieldName.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ff61094cefbab83499e0007ce9e0f58e6b87d9f7efbea17e3016a693a32f01f"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Prompts/UpscalePrompts.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5abc1bab070199b987f746b7def288a69e7b51af39fbfd7e5c6c0860521e9a2b"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/QueueList/QueueListComponent.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c63b460c419ebb8bfb0b09dd99795f78b7553557e05ea37f26b9be05b87ca8db"}},{"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":"invokeai/frontend/webv2/src/workbench/workbenchAggregateInterface.type-test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"79c25c4525cb26c38f7e967137152733df241025dc8d72c1664bd6725c5e7374"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/ControlLayer/ControlLayerSettings.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cfcfc473d2b946c4e436f2cdf6bd56eef75809e70b89f83d53f628ebb34efa8"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasToggleBboxHotkey.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"37f9ba8f9aad271a418dd00b72b862d0a4dce5356215bc321b8a566be3ceb97d"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityIsBookmarkedForQuickSwitch.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"83cde8fa93036f0fbc7c60572a9e47566cb4e601e335343f4c3f7369a1951513"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityIsSelected.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"657128b624216b6452f129388d8ab9d926fe9c8d0776c424e156eb087e1b062d"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelBaseBadge.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"adde2e2284e614b31394b138abec4d8586d0d4462cbb5b171a4af3157502c2ce"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/workflow/WorkflowLibrary/WorkflowLibraryTopNav.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c02febaecce1ab5d851dcef581b6166fa415627143dc476106f9f8198fe5612"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldTemplateOrThrow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f99d425b325db94f72d76a93c7d44e2fdcb0f5674862015dbaa245ff229a599"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldTemplateSafe.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"23f7d9e1b25f97d915014de809ee63a3155dd26c20dcf5c910c061f6db9f400b"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeNeedsUpdate.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"79d9c40fb6ec784f1c284b347daa286271f10249b8b5ca943acea9b39c4050b1"}},{"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":"invokeai/frontend/webv1/src/features/nodes/util/node/getSortedFilteredFieldNames.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"022814caea3f1c75801ac28dd7b9b43ef3229fa3fa09b1681a4a6fc66cd65614"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Seed/ParamSeed.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad8f5439b291d3ed70bfbfda67af9b975237e5991bc259bd41213d1e41382db8"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/QueueList/constants.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb9ee47e2b33c515dd08ee05340d51fb31a410f15949895617c608bc2a4ed420"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/DownloadWorkflowMenuItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"40e7199728f26b2a0f8e93493109bb4187ec136386abe56ba9c0e50f985ba2f6"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/NewWorkflowMenuItem.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e029e8551570edd4f90e773d317964e0fb2af50ba12e705420474d2cff26712"}},{"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":"invokeai/frontend/webv1/src/common/components/linkify.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b695c44cb8c8029405bc571416f532f95ae54a6890a51166e19c6cc7453eb8a3"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/HUD/CanvasHUDItemBbox.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae12c6314f4bfb04b4014156973cf42e1b0e69c2e97d3a3d4249a280e3c390a8"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/TopLeftPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6af2f437f0c4d71a34bfe1dacc4198fe7b6f36ed1f3c438334a3f093a598683"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useOutputFieldNames.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"13907c91a2ce3107f202895724ffb0f7f1248e2725f3dcc07bf53ed5a4e8cfc5"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useZoomToNode.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"599d5f5e4a0755759ec57a9fb4384766ef76eee01b7b41db9df9a9af1396ba6f"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/LaunchpadContainer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf7d5137705f1f8bdb334efca695fc84d306710f9ef33c8ff0cca0d790eacc3d"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/contexts/EntityIdentifierContext.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab9a74f0e8c6cc0df9488897ccba2189a5b9a7c2220628e3c335da17fdce6820"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/OutputFieldWrapper.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"772e979d0d2a8145b83d6d852910c4b128141d3101e880dab2cefe133d249e4a"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/AutosizeTextarea.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c96104536a1eafce89890239bbd8b51488c1255137ebd623b8b4f2b063f3547b"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldInstanceExists.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"48d5bf22e51eef715e6e621d5b8b58acbb87f47ed31e5a8d0a8f8601fb00cfcc"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeIsIntermediate.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"073866e222f5c2a4e878758f65a87594ee41f56dfecf9209aa2abf84ee8af1b2"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeNotes.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a246ab8b9368b600a24c73035eacc5750b69b47e3588d945e993d970eb0f0fec"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodePack.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3cc8f2bd6654cbb86d2918afca54aee471b4f1f96b98e324ae50e3a6b0f62bf"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useOutputFieldTemplateExists.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"37d1229a143a31bf4f2da327a52fd194ccc12a24936da4db8cd20c751004532f"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useUseCache.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"71756e597f46c5e54c4de1fc019b35d35da1e9e6521ea608db36f6974906d461"}},{"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":"invokeai/frontend/webv1/src/features/queue/components/QueueList/useDestinationText.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"89f0c691e39b180bb0eb6875c50e522dcadd6c1a4b5c0c5959f16667033d8658"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/CanvasTabLeftPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cf524dd6d1a2a5e12a066b73e394afc79c632e27d8883afa9d574fbcbbb9908"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/GenerateTabLeftPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9fcf00da850db3f33a60ff083f72a6d173a9d689f3bddc3419a033354a8ec6d"}},{"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":"invokeai/frontend/webv1/src/features/ui/layouts/UpscalingTabLeftPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5989546640bace69cdeadf8ebb81eae74d57c84bfac2396316024369c6f94209"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/FetchingModelsLoader.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"35d856af11418598c3381005e4a1159c752beac7f8ee85ea0e21f34dcd047fb8"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/TopCenterPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b3054fe46a32ee856ac83c031bdaad9f853ba468e5307b0f2807d1dc7dbcc5c"}},{"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":"invokeai/frontend/webv1/src/features/ui/components/tabs/CustomNodesManagerTab.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ae7cea02fbbb0d7ea3812ee586f659af0cc2101d0f2a70a5c43b5d4a758c4fb"}},{"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":"invokeai/frontend/webv1/src/features/ui/components/tabs/ModelManagerTab.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"866b00f527eb6f4d82523a2b71af137b3787471410cebd5e08ea962f7b4112c8"}},{"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":"invokeai/frontend/webv1/src/features/workflowLibrary/hooks/useGetFormInitialValues.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eccb875f2b46f915764ef8d8b06518d6226fa143998b6333106235d5ffd181cd"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useEntityIsEmpty.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d2ee9b3b73c898e44634351dfd0755361e3398e7ef62ed8975c17a11738864e"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/Boards/AutoAddBadge.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"83b7cb84a3b3e4d1338fee3f58f3db81d13dc37a9a2508f0a72daeaa6b9195c8"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/BottomLeftPanel/BottomLeftPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e228966c03f3c479ce2803fe74effe51371e2efb415b41ce01dd056a4a25802"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/CanvasWorkflowIntegrationParameterPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"20ecb78b65eee31fa0558863226565786c481f95a1bca532429555aaa7a4b011"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/common/CanvasEntitySettingsWrapper.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c508daac8889631b5d46969f4b15702c67397ddd5e1993340fc6c65f9e612dfa"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useStarterBundleInstallStatus.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b105146b1eab2666d0d274cc1148e66933aeef54a8c903f9a53311cfd8d5f4e3"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldTemplateExists.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"552097b01cb6bd9bf5115456485655a88a630449307d27f416d2f69d2052cc84"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldTemplateTitleOrThrow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d3a17145fdd43ee7570d6def3768608736b34c5ff758e450d980cfbcd4f01db"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useIsBatchNode.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"80be1c45c87263684507ad7d2ac5d3ba4dc88cba7d219f8425f8dada911741e6"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeTemplateTitleSafe.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f1b0e79752a8f73e9791ed10fa8c8fb8bb17093426ded0e342d1ab810821373"}},{"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":"invokeai/frontend/webv1/src/features/ui/components/tabs/QueueTab.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7715a4fcf24c6571c3d695a03497cf335d83ca25f2752c504fb5be369c508106"}},{"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":"invokeai/frontend/webv1/src/features/gallery/components/getItemIndex.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"502f44def42a7d937591b5a495a0e81a77143c792579484f452761c19b4fed54"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/edges/util/getEdgeColor.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"949bb7b932ecd98efab11f27655bd576da003e43c29eefa7dcc050a27dda7e29"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldInstance.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"109ada7fc39fefce6059848fa26df77b667f685c5fd1862baa88a464431fa504"}},{"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":"invokeai/frontend/webv2/src/platform/pwa/registerServiceWorker.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f88eae2a044b3563475c6c477902715e6248f5506c37def3affef3f13773b43"}},{"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":"invokeai/frontend/webv1/src/features/nodes/store/util/findUnoccupiedPosition.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1af83ee920a227d3a5da14b645f35e8b9529658e029f2e653733519987215a91"}},{"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":"invokeai/frontend/webv1/src/features/queue/hooks/useCurrentQueueItemDestination.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea2e2268c9f4e0c3ded817bb6e8f5f383eabb867b792a87b99a53231e1acdc8c"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/QueueItemNumber.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"01fcb205fdbefbfb40047fbfb921272d97c7dfecacfd6e165e56e18f7593af95"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/sidePanel/builder/use-element.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9a76e2cb1797dafdd16e53c5ef1f04a0c40ba4b03333970a618d9283256e6e7"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldIsConnected.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"770e9b8e33eee8bb1899692ddbb81e449f48cdbc03591834cb29c43a3edfd38e"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeClassification.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c07ccc6b2f4d8ba1af69df464a60d08656453b9182d831c5d61f2d1ce23a7dd"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeUserTitleSafe.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cce98054ac9b5320952c390cf5c7fb8eabc294bd78bd9a3213bc1640a53b2126"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeVersion.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9279d50dea1a83d3ea9548d74a1c994491b1bd4399de6dc6bf71899b7110f400"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useOutputFieldTemplate.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"baf83898a628764436e3a4af2fd935c6707aaf3aeb88a9b7d566cdbd4171b99c"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useInputFieldIsAddedToForm.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"75b6d8502d5d64e3347f519fef9ac7832db1f200076a09e4cc77759e8423686e"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeIsInvalid.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ae9b34073d10358768226b1b91e3012289632a56f52e6268f5c7a8dcfe90d25"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useWithFooter.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7636ca66cae87fe0cd5c68407c68b6bf229496475705bc19815c2f30d7ceddf3"}},{"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":"invokeai/frontend/webv1/src/features/parameters/components/Bbox/use-is-bbox-size-locked.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"33869b84589293e6194aaa17cc4e86abb52c5409654a0045524a1a358f637777"}},{"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":"invokeai/frontend/webv2/src/app/AppProviders.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f6131ff45d0a1a472156c586b530e22f222817e60c1c941d1ee6d9b76bfef68"}},{"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":"invokeai/frontend/webv1/src/features/modelManagerV2/hooks/useIsModelManagerEnabled.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bd7c8bc1526866ed7730a401fbd8aac0bbbb393e50b0f015cdac7e40c4c4829"}},{"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":"invokeai/frontend/webv1/src/features/nodes/components/flow/edgeTypes.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eeb01aa5c3ab0b26ea1df969cc3667daa4d5efa6cc236089e353e4e8ac0aa5e4"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeTemplateOrThrow.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dff3af757743699e29e977c3736b04ac0b8d4219931e4dd0f26410102df5c9c"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeTemplateSafe.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1ee305d59d3aa176088079c4a5d52e42fe7434398ce6eb26e0649c8a1b5768e"}},{"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":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeType.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d04a99094e8f6f0474d0c41a8a9ce526f969425f868b164e74b497af80dc2c41"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/konva/cursors/zoomDragCursor.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1ccb68488120ea4d20609d42ace43aadc42842023a69c16a32d8741ef454dc0"}},{"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":"invokeai/frontend/webv1/src/common/util/randomFloat.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a87b4ac20153a284e6b89d75eb5e5f7f203f5f29d3ff2984fcd5dd251c022639"}},{"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":"invokeai/frontend/webv1/src/common/util/stopPropagation.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b9b22198d26b5f4f909b140be7aafbeaa4c0ade390330f2ed719d8c01a2d7df"}},{"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":"invokeai/frontend/webv1/src/features/system/store/systemSelectors.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a71c3ad5c3418a5fb06fc400b49e73de0ec62e53ff9e0178fe36e683bd965912"}},{"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":"invokeai/frontend/webv1/src/features/queue/util/getSecondsFromTimestamps.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6aaf36c377054706854276f82a62cbbf268b3efcafe4f6e119a96326fb47c36"}},{"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":"invokeai/frontend/webv1/src/features/controlLayers/components/Tool/toolOptionIconSize.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b195b31a68a96b68335a14f18c8fb95def3667d02280439852fa45a89687d279"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~66 LoC): no import path from any entry point (370 application, 17 tooling, 1194 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":"invokeai/frontend/webv1/src/features/nodes/types/common.test-d.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cd9b82a19114a2c86c93e59970c0f8b363a0c80c2e44f6f9beac69f92208ce2"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~19 LoC): no import path from any entry point (370 application, 17 tooling, 1194 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":"invokeai/frontend/webv2/src/workbench/workbenchAggregateInterface.type-test.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b3ca711131c01f52b3c4a06d3a2999740852ff511c7190b9a1da1520a235fd9"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~18 LoC): no import path from any entry point (370 application, 17 tooling, 1194 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":"invokeai/frontend/webv1/src/features/nodes/types/workflow.test-d.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f81408ef3e7ddc8f768c20cebb0cb3ff134a011ff34cdd18ee8f6369e3ad30a1"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~15 LoC): no import path from any entry point (370 application, 17 tooling, 1194 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":"invokeai/frontend/webv2/src/platform/ui/Button.type-test.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f77b904057d8ed624998af359d7df28fa47cb89ad69ecb7abfa6316847df47b"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~12 LoC): no import path from any entry point (370 application, 17 tooling, 1194 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":"invokeai/frontend/webv2/src/workbench/widgetRegionItems.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4f20dcd27126cd64b01df552c8a96f462c024301ec71c4d3b7863b1f73df388"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~3 LoC): no import path from any entry point (370 application, 17 tooling, 1194 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":"invokeai/frontend/webv2/src/workbench/settings/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"19b5e59bd5e96663638e135c822cf169aaff8a9a5bf335a21b1f5433fb490f0f"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~2 LoC): no import path from any entry point (370 application, 17 tooling, 1194 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":"invokeai/frontend/webv2/src/workbench/palette/index.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b259363df3a7e77a29e201a830a64686323193eab02b749195539ba583db935"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027$true\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/nanostores/util.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbc93373b151f63cc8acf211f7d04317d63d2bb5d668aea97bb4c129f2816bfc"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027setLoading\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/store/authSlice.ts"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"5595c9e7877b6f3c379116bd14e6a352946194f3dfc8c73cbe397c2631986029"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027selectIsAuthLoading\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/store/authSlice.ts"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"231ce52ec94109d0b4ec8dbbfd1fd8745124855634b8fa99fc3f509c932fd3fb"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027selectDefaultControlAdapter\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/addLayerHooks.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"7173e27697df5110e660e97ca2edc16aa3365090f3348704a70304313a9942c1"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027ModelIdentifier\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/types/v2/common.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfbcadd7bcaa5e320142fd1f0db09353da546afa98c61f59d2eec896441e0d67"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027useListGalleryItemsQuery\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/gallery.ts"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"17a1dd69da6a33e319639b82e0a9f807316c10a8d5edd9dcd52e5d7514f92dc4"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027useChangeVideoIsIntermediateMutation\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/videos.ts"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"d01ef5d3a9ded30eb96aadeffce19b94d545088545259114665a98813693b076"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027useDeleteVideoMutation\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/videos.ts"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"8023f887ac66c73006946885a6b73cefc7270b123acbe78f35f400fb5a2e5483"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027useDeleteVideosMutation\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/videos.ts"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"059aae0071aebbaed075b8b34245a5309718604ddd0bf839b70f2514305fcdf2"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027useGetVideoNamesQuery\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/videos.ts"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5266e755643cb2959b4565e7bdb19e5205e176c53d90a21d6505f007acd50fc"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027useListVideosQuery\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/videos.ts"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"d530f9285d1d800f1b5b25e5a827a1bcc41c10a6b2b15e3d63362623f28f558c"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027getVideoDTO\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/videos.ts"},"region":{"startLine":385}}}],"partialFingerprints":{"codehealthFindingId/v1":"f97920255c38ca6e51a332e9ea8261c6ce64f6a5dbbafa14c0a34bbf1a03010f"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027uploadVideo\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/videos.ts"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf6d44647fe9820ff8b93fee830115ab8a75f929a72ee8838e23496606f9fd39"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027VideoRecordChanges\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/types.ts"},"region":{"startLine":948}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4375abdd68d6d05d2c334ff84a3db61c89ba0ba8d510cd0e581a0d7cf867af5"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027GalleryItemNamesResult\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/types.ts"},"region":{"startLine":983}}}],"partialFingerprints":{"codehealthFindingId/v1":"83b4858836f311b7cd2eeb4873928d4351d22e51307963ba9ec1b30c04e1b26a"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027OffsetPaginatedResults_GalleryItem_\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/types.ts"},"region":{"startLine":985}}}],"partialFingerprints":{"codehealthFindingId/v1":"920e5af12650e388bef822b530057790c40c7c11aa9a7311dc85bd0e64ddc031"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027WCAG_RELEASE_TAGS\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/accessibility/axe.mjs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5e77b3f42f41d63b7cc2056e1009955bdd48d488ede897f7854f42fca002069"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027MAX_WILDCARD_VALUES\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/dynamicPrompts.ts"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e98e55457da5f26c00beb4d69c26a23fe5a529854da56ed44b8319bb62bfd55"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027LLMTaskCompleteEvent\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/data/llmTaskProgress.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a87ee0d45627bb2ecf3a765cc6d00eefcc33ea7fc95ed5bad71c6311b4a5b48"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027LLMTaskErrorEvent\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/data/llmTaskProgress.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d82085ac1447c665d3935f34421fd6245420ee8f76db9b02272869a6583c6c8"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027insertPositivePromptText\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/promptFields/promptFocus.ts"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"16a977a8ee9efedd52229ccf480f206e262204cc8c410550c1adb2827d1a7901"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027LoginFormValues\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/identity/core/schemas.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2945be7bb3ffe5e2498a78b365b34cb821a4ff24be7de718a43c1e082f5e27d"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027UserManagement\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/identity/ui/UserManagement.tsx"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"0efa02917ac746d7366598568e009b6ee8a96d361d2ca00013ccf2661ec402a5"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027getKindTotal\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/intermediates/core/types.ts"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"585cf79f5b279eed6b7e6f116317fa9636b610cc1b6a8e809b639bf65500f65a"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027MainDefaultSettingsFormValues\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/core/schemas.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e07b71c81f823ae7398485a2d2202c2039343e4a3ff4fa3cd7cd6e6b68cfba9"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027LoraDefaultSettingsFormValues\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/core/schemas.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1e0a3124a9c67c4eba1ce55435209aa77575f52bac0015942e85549b19d9430"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027useNodesUi\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/nodes/ui/nodesUiStore.ts"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e7a4e0fd46931ccbe669fd93edf2627d3bcb88504cd22421b4a39923b1e28cd"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027useActiveProgressTarget\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in invokeai/frontend/webv2/src/features/queue/react.ts, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in invokeai/frontend/webv2/src/features/queue/react.ts in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/data/activeProgressTargetStore.ts"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae2a4d6c744fdb1fb69f052b9e476dfc06ddca838dfe5d266a1e2b9c90759ffb"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027ensureQueueLoaded\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/ui/queueDataStore.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"69343d2c9b58e1edc7501dbd226648f5e00dd932248acbd168ecfc91e857e175"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027createQueueRowsSelector\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/ui/queueViewModel.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4a34b87db17013db9529745a37b9fe67fe6140bd51337b88f46168802c79a5f"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027getPendingQueueCount\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/ui/queueViewModel.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dffad471a3a9c7b96e846ae32014112dc7139fa78f4b888451fd8716b09925c"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027getQueueActionState\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/ui/queueViewModel.ts"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd1a9efbce98ca84ab1cca6dd5d94d6926ae2e963fc3006306624d0b6f77aad9"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027UPSCALE_SCALE_SLIDER_MIN\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/core/settings.ts"},"region":{"startLine":546}}}],"partialFingerprints":{"codehealthFindingId/v1":"4340db1b80878d31b809363b94fe572d5ec7734a2436d3687d74d5784afaf382"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027UPSCALE_SCALE_SLIDER_MAX\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/upscale/core/settings.ts"},"region":{"startLine":547}}}],"partialFingerprints":{"codehealthFindingId/v1":"87f18f8e71234eb5dcd2b0f3d924a1f4bdd2cd991b863102a595c5a1a08da4d2"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027MINIMAX_H3_MAX_PIXELS\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/dimensions.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"43d2c6a295b25a34ac819aeea0cbc132c8a6488a3242e9e7cbd33604a9467f40"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027MINIMAX_H3_MIN_ASPECT_RATIO\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/dimensions.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2cc72fde283537f8e469336135e4d4bdf1d7d80831572e49f7f4c8da6d2d93b"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027MINIMAX_H3_MAX_ASPECT_RATIO\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/dimensions.ts"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"26c704f03621c9cce21db8df1802a8ad8ed196abd231b45d3614f9d92c05a7f9"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027VIDEO_REFERENCE_MAX_IMAGES\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in invokeai/frontend/webv2/src/features/video/index.ts, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in invokeai/frontend/webv2/src/features/video/index.ts in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/settings.ts"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"26d6ee464677f8713f066293bf8fb4f00f389a926854d2e4d80a0e962a2eabf1"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027isVideoWidgetValues\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in invokeai/frontend/webv2/src/features/video/index.ts, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in invokeai/frontend/webv2/src/features/video/index.ts in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/settings.ts"},"region":{"startLine":510}}}],"partialFingerprints":{"codehealthFindingId/v1":"b07051cb31b744438452232054924b4042d260ad1155a739a70d878b7844c6d0"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027LTX2_MIN_TWO_STAGE_STEPS\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"42fe9b9308e71d2fd59c1ab1365d209a099cd4b409d8bd3ce3c2ec83eb6a0c8c"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027isVideoModeSupported\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in invokeai/frontend/webv2/src/features/video/index.ts, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in invokeai/frontend/webv2/src/features/video/index.ts in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":508}}}],"partialFingerprints":{"codehealthFindingId/v1":"7626ea9e187680b4e4d9cd72c7b189afae69717a7e6a5256d1ec9fd950272019"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027getVideoFramesPolicy\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"936c6a6984d546c56e2ccabfd41120a56caa00712d23c59939ed615a2b742430"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027getVideoFpsPolicy\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/video/core/videoPolicies.ts"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"097f90f5e6cea44fd6e9fe7f361b7946bf07b27bcb993254c795ea0947f4754e"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027documentToPreviewGraph\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in invokeai/frontend/webv2/src/features/workflow/ui/graph-preview/index.ts, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in invokeai/frontend/webv2/src/features/workflow/ui/graph-preview/index.ts in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/graph-preview/GraphPreviewFlow.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0bd9cd2912dbc8d9774eca57410e29d4c7c682b0db899ec17502040f87639ee"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027areWorkflowPanelStatesEqual\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/linear/WorkflowLinearPanel.tsx"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"f11be6d9e57665ad44f8189f9768827d2c7ca8ff24c8b4508dfc23687c9af279"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027MAX_DEPTH\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/logging/normalize.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"367f319a1d2df277317944534a74afac167f9b211e180867e9b39d12edb9cc2f"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027MAX_STRING_LENGTH\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/logging/normalize.ts"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"4821dabffd90d044b8091f0ece002c53461c9b0c92c615715614485254f5a7a3"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027MAX_STACK_LENGTH\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/logging/normalize.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"1129a8ef38693080c9b6e4bf8780997b4470713fddf0f91b438f0f1084cadb93"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027MAX_ERROR_CAUSE_DEPTH\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/logging/normalize.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"462470b3e286ebed84ea1ab90004b5240f36a070a49638297d642838a90e5921"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027ZodFormField\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/react/useZodForm.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"e801d29b2a259dd38f7682aae7673688b3710b80a83e971b7820df6a78017a75"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027InvokeMarkIcon\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/InvokeMark.tsx"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7e04290dbad8d6291ae164dc2ea3690c1da48fe64abf6655d6e477ae67247cb"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027useActiveProjectLayoutSelector\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/WorkbenchContext.tsx"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"807a40a79a1023b85d7d842a07d9c78fa760503cf4d067241e3590dcbab83f79"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027useActiveProjectSettingsSelector\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/WorkbenchContext.tsx"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"258b32bda3bc6e3ec142fe527da5aebeeb96c43a9333171dc2c7ae02d77a91e4"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027useWidgetInstanceValuesSelector\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/WorkbenchContext.tsx"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"037c6a9a628e5e85483b9a2839c86654df9271cb98145aafe7d3d45d232dd9fd"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027useProjectWidgetInstanceValuesSelector\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/WorkbenchContext.tsx"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7911e282dfcb948987b8e9a9dc61dc991de1f93ff61e8dab1869fd22680ca01"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027useWorkbench\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/WorkbenchContext.tsx"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"e97091a7203537c34167c808abbca772bb76251c85fa7d3c9a85cbc0641b7ec5"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027useOptionalWorkbench\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/WorkbenchContext.tsx"},"region":{"startLine":387}}}],"partialFingerprints":{"codehealthFindingId/v1":"101f1539a4436bad266a9683c980510b8a9ea03a8c12d603a8d76c7d52ffb28f"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027CanvasPsdExportCapability\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in invokeai/frontend/webv2/src/workbench/canvas-engine/api.ts, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in invokeai/frontend/webv2/src/workbench/canvas-engine/api.ts in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/capabilities.ts"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dc3caa86412e6b4f2c7197275e7c1799e45767521d612ba5fd6badf6571c847"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027flatDocument\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentFixtures.testStub.ts"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"58499b22a85221367c0f27c34459d5ea4619cb8ef2216988903550bb4f0daf7a"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027isLeafNode\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in invokeai/frontend/webv2/src/workbench/canvas-engine/capabilities.ts, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in invokeai/frontend/webv2/src/workbench/canvas-engine/capabilities.ts in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/documentTree.ts"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"702e9cc7bc2d3eb51fd085496ce91076364af2184ed5b509cd30e47454ebe07b"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027isMergeableRasterLeaf\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/layerEligibility.ts"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"19cfaa94a6b12de6d999f48dee7eb12e9e5a205978f1e61e5a311e1357792fab"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027BBOX_DRAG_THRESHOLD_PX\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/bboxTool.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"76316c24238bc45afc3c2842c7eec4ada3eed71ae9d047d63149949b3a1302e9"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027GRADIENT_DRAG_THRESHOLD_PX\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/gradientTool.ts"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"22362f596140085852cfe6274e539c6202e8c2a3240be46d1203389e53326026"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027MARQUEE_DRAG_THRESHOLD_PX\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/marqueeTool.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"a825a6413c0d96a564123ac6627a01e0942b0487bb5682811d0690bbc47ff3bc"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027MOVE_DRAG_THRESHOLD_PX\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/moveTool.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"e093a46ec147fb1ab06c0656bdf584ab7a3b53f42aac6c377be40831bf13adc1"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027FREEHAND_MIN_POINT_SPACING_PX\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/polylineSession.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"0749a856a5bef7fae06aa5985188b5f28ddac3ad41b8e6253dc7d62e99e416d2"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027SAM_DRAG_THRESHOLD_PX\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/samTool.ts"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e9e308f2b51ac169188af453214bb5f04f70e17c50d55b49e0932cc536cf8b9"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027SHAPE_DRAG_THRESHOLD_PX\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/shapeTool.ts"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba3a5dcb3f09197a76fc91eb1a5c62ef457f7c6e19aa75c7c0156c35332f0965"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027TRANSFORM_DRAG_THRESHOLD_PX\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/tools/transformTool.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"b63224c781f2712e4883d1ae7e20fbd132e4bdbf075d7ba5e0b031babd724d20"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027isClusterColorLight\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-map/clusterPalette.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"41a3c3ab969b327eab675f71910c512ab51490d3cd88174a1408fd933b4b4952"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027ImageIndexUpdatedEvent\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-map/events.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"18160deffef98d7c3466405033a9fefb00feb2366f0819adc7b212c19573f484"}},{"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":"invokeai/frontend/webv2/src/workbench/palette/CommandPaletteDialog.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcc08c6d0da5b3efe693c03b229f31c3de53bf08bc9824790af2083cab8bf295"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027useOptionalOpenWorkbenchWidget\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/useOpenWorkbenchWidget.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b0ef07d2a97f2f156ae1ec8ea51160e760eae81632c2b812b441691476d44c4"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027FieldPlaceholder\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in invokeai/frontend/webv2/src/workbench/widget-frame/index.ts, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in invokeai/frontend/webv2/src/workbench/widget-frame/index.ts in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widget-frame/WidgetFrames.tsx"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"1819c095b44b0d82af598a60c1574f9a52e6ac456033d713d5828df7eaca3be2"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027getWidgetFallbackLabel\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgetLabels.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"479b201c6bede09c4f0aebf0bc8b3a08b7f5f6ab8571c03c1e2f71918fe36219"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027WidgetPlacementRegionState\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgetPlacementMeta.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"32b014526bf3f7c496dcbaf90a27f7ccf7cfc5510bc85fb6a5d55be500bf15f4"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027isPlacedWidgetRegionItem\u0027: Nothing ultimately consumes this binding: its only referrer is the re-export in invokeai/frontend/webv2/src/workbench/widgetRegionItems.ts, whose re-exported name has no consumer either. Removing it is therefore not a one-file change \u2014 drop the re-export line in invokeai/frontend/webv2/src/workbench/widgetRegionItems.ts in the same commit, or the barrel will import a name that no longer exists."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgetRegionViewModel.ts"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"c40d1591d705f9c2096cd3a8b167afa227237146d8bdae53ef5fc7f7baaa458b"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027AUTO_SCROLL_ZONE_PX\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/layerTreeAutoScroll.ts"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e86f3ce0951865d8e6655b14aee5c5e33dfaced40bed2c3286911e8f929b929"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027SWIPE_SLOP_PX\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/previewSwipe.ts"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfc2f7f4299c1f8866fa0ca0774111dba92d43d43e05d4aaafb0a0d937b71d11"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027WorkbenchAccountCommands\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/workbenchStore.ts"},"region":{"startLine":665}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4116633b1212e7d23983370425a0f0abfc193d291baf6101333fdd4637d1a64"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027WorkbenchGalleryCommands\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/workbenchStore.ts"},"region":{"startLine":667}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bcbf68aa647c53f61c1116d061b0d0d19dcbff316ccc0f09886b4776093f901"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027WorkbenchLayoutCommands\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/workbenchStore.ts"},"region":{"startLine":669}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9cf474eae6e3d3cf65362846d2dadfc4d9f20e1943e7d883af8c0a222243dd0"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027WorkbenchProjectCommands\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/workbenchStore.ts"},"region":{"startLine":671}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a015b40eaac431bd3a599d1e6073bbcd5c8daadd83a73da7873a8ad788a6d3c"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027WorkbenchQueueCommands\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/workbenchStore.ts"},"region":{"startLine":672}}}],"partialFingerprints":{"codehealthFindingId/v1":"675c072607de8706c68068370fe93c707aa4d3c1eb18ef637969e1cbe37bb598"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027WorkbenchWorkflowCommands\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/workbenchStore.ts"},"region":{"startLine":674}}}],"partialFingerprints":{"codehealthFindingId/v1":"b969f464a761ad6e07c2509d31fbd9e93c6ff76f84c06aeb6f34292996515cf3"}},{"ruleId":"R8","level":"note","message":{"text":"Type-only dependency \u0027chakra-react-select\u0027 in production deps: Every import is type-only \u2014 move it to devDependencies."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/hooks/useGroupedModelCombobox.ts"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"467eb1cf15cf94affa922bd69c0612431f5243e70a98a02ec14b78381d8c01ee"}},{"ruleId":"R9","level":"error","message":{"text":"Import cycle (8 files): invokeai/frontend/webv2/src/workbench/WorkbenchContext.tsx \u2192 invokeai/frontend/webv2/src/workbench/workbenchStore.ts \u2192 invokeai/frontend/webv2/src/workbench/layoutPresetActivation.ts \u2192 invokeai/frontend/webv2/src/workbench/widgetRegistry.ts \u2192 invokeai/frontend/webv2/src/workbench/widgets/manifests.ts \u2192 invokeai/frontend/webv2/src/workbench/widgets/autosave-status/manifest.ts \u2192 invokeai/frontend/webv2/src/workbench/widgets/autosave-status/implementation.ts \u2192 invokeai/frontend/webv2/src/workbench/widgets/autosave-status/AutosaveStatusWidgetView.tsx \u2192 invokeai/frontend/webv2/src/workbench/WorkbenchContext.tsx (one verified cycle inside a mutually-dependent group of 155 files)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/WorkbenchContext.tsx"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"07f31241403cc707eada9bd82dba61c77ae6f467dd6ddfe536bb1771ff9960f9"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!!entry \u0026\u0026 entry.stack === stack \u0026\u0026 isGroupNode(entry.node)\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv2/src/workbench/canvas-engine/document/insertionAnchors.ts, invokeai/frontend/webv2/src/workbench/canvasProjectMutations.ts. 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/insertionAnchors.ts"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9c4fd33ebd3b0cdae762607143e84a1c58389246e24ef3861dd78856f4ec5c1"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!!mainModelConfig \u0026\u0026 isExternalApiModelConfig(mainModelConfig)\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImagePreview.tsx, invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx. 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":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImagePreview.tsx"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cae698c20f6de21d45dfa915725d4f8e655c6a5ea932d47a968512bcf8dbe2a"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!!referenceImage \u0026\u0026 referenceImage.config.image !== null\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx, invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceIPAdapterSettings.tsx. 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":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageSettings.tsx"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b7b196949613952931e9bd6686dbab73a561276604e1b2614f5dbc0ed91a925"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!Number.isFinite(pathBounds.x) || !Number.isFinite(pathBounds.y) || !Number.isFinite(pathBounds.width) || !Number.isFinite(pathBounds.height\u2026\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv1/src/features/nodes/util/workflowImageExport.ts, invokeai/frontend/webv2/src/features/workflow/ui/editor/workflowImageExport.ts. 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":"invokeai/frontend/webv1/src/features/nodes/util/workflowImageExport.ts"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"47a1bbe13cd8c3e2afb9a68aca2a6a8041a93cd88842d94ed4a032d23cfa626b"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!Number.isFinite(seconds) || seconds \u003C 0\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv2/src/features/queue/ui/formatDuration.ts, invokeai/frontend/webv2/src/workbench/image-map/indexProgress.ts. 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":"invokeai/frontend/webv2/src/features/queue/ui/formatDuration.ts"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"b91e75114bb60661aafe1106321c190fbb4e0102a2102d9ba81c9f3998d2f017"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!account.multiuserEnabled || record.userId === account.currentUserId\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv2/src/features/generation/core/promptTemplateOwnership.ts, invokeai/frontend/webv2/src/features/generation/core/systemPrompts.ts. 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":"invokeai/frontend/webv2/src/features/generation/core/promptTemplateOwnership.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1c91891980c108f2605abdff972b2990548e676f9579e7d25064043346723e8"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!currentUser || currentUser.is_admin || board.user_id === currentUser.user_id\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx, invokeai/frontend/webv1/src/services/api/hooks/useBoardAccess.ts. 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":"invokeai/frontend/webv1/src/features/changeBoardModal/components/ChangeBoardModal.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"09e97a064e919a46faa32dd4053e4c74310bfdc71e5115740fbbe0f4a5f7060c"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!cursorPos || !isPrimaryPointerDown || !selectedEntity\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts, invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts. 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b80a62de639e54d74cd51eb3fe6ab37d44a8e3a5d9e2698c081e2b227689462"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!cursorPos || !selectedEntity || !isPrimaryPointerDown\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts, invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts. 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c196c5bb1e224b32aa7bb41c04b8a8127bf276d9119616d4af9280daf56b870"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!didAttemptProjectCreate \u0026\u0026 isAccountScopeCurrent(owner)\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv2/src/workbench/projects/invk/duplicateProject.ts, invokeai/frontend/webv2/src/workbench/projects/projectFile.ts. 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":"invokeai/frontend/webv2/src/workbench/projects/invk/duplicateProject.ts"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"24afed0b2b2a4b2ee35bb0691dd632c6827512732e3174b935a7014fb2942437"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!doesWorkflowHaveUnsavedChanges || !isCurrentWorkflowOwner\u0060 appears character-identically in 3 files \u2014 invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/SaveWorkflowButton.tsx, invokeai/frontend/webv1/src/features/nodes/components/sidePanel/WorkflowListMenu/SaveWorkflowButton.tsx, invokeai/frontend/webv1/src/features/workflowLibrary/components/WorkflowLibraryMenu/SaveWorkflowMenuItem.tsx. 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/panels/TopPanel/SaveWorkflowButton.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"e03917b3fd176158a6ac1bfed187276561cd93b7107afa51cc7489896b02b590"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!element || element.type !== \u0027node-field\u0027\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/callSavedWorkflowFormUtils.ts, invokeai/frontend/webv2/src/features/workflow/core/document.ts. 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":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/callSavedWorkflowFormUtils.ts"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c157e1bc220b271f3246d5c84d29e71bf195d61402c1db2e385c77c6624fcc0"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!event.over || event.active.id === event.over.id\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetManagerDialogBody.tsx, invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetStrip.tsx. 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":"invokeai/frontend/webv2/src/workbench/shell/topbar/LayoutPresetManagerDialogBody.tsx"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"60080b0a188c267395fbd944cee34fc49c3e957e6a28ffd1bb94dd2496e2c842"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!imageDTO || (tab === \u0027canvas\u0027 \u0026\u0026 isStaging)\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx, invokeai/frontend/webv1/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx. 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":"invokeai/frontend/webv1/src/features/controlLayers/components/RefImage/RefImageImage.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"39fc58eadfc6e061f97e70a177b55dab34cb5bbc0fc299d516f7a3ec541f2254"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!instance || !widget || widget.status !== \u0027enabled\u0027\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv2/src/workbench/shell/CenterArea.tsx, invokeai/frontend/webv2/src/workbench/shell/Panels.tsx. 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":"invokeai/frontend/webv2/src/workbench/shell/CenterArea.tsx"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"d41d4a07e1f9269dacfe08a44885a8a6c986e17a5aa47402ac0cee66aa65fcb6"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!isActive() || invalidationTimer !== null\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv2/src/features/gallery/data/realtimeRuntime.ts, invokeai/frontend/webv2/src/features/queue/data/realtimeRuntime.ts. 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":"invokeai/frontend/webv2/src/features/gallery/data/realtimeRuntime.ts"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"99ada866e0912bf9e445d6f60e626ea5cabe9946ee28b1e6228621be77e06d9b"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!isClosed \u0026\u0026 !isUnavailable \u0026\u0026 isWorkbenchDatabaseAvailable(database)\u0060 appears character-identically in 3 files \u2014 invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts, invokeai/frontend/webv2/src/workbench/queue-integration/queueRecallCache.ts, invokeai/frontend/webv2/src/workbench/queue-integration/queueRunJournal.ts. 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":"invokeai/frontend/webv2/src/workbench/projects/indexedDbDraftStore.ts"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec4d62aaeb3e85d2630d8772c09439a4461f7cef43279980a0f44552bb5d72dd"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!isConnected || !queueStatus?.queue.pending\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv1/src/features/queue/hooks/useCancelAllExceptCurrentQueueItem.ts, invokeai/frontend/webv1/src/features/queue/hooks/useDeleteAllExceptCurrentQueueItem.ts. 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":"invokeai/frontend/webv1/src/features/queue/hooks/useCancelAllExceptCurrentQueueItem.ts"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"944bd04b532de55e5b6a0534f7e5494d048f29d54cc3779fa8b77d5ce521f4d9"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!isDisposed \u0026\u0026 isAccountScopeCurrent(owner)\u0060 appears character-identically in 3 files \u2014 invokeai/frontend/webv2/src/app/QueueRuntimeAdapter.tsx, invokeai/frontend/webv2/src/features/queue/runtime.ts, invokeai/frontend/webv2/src/features/queue/runtime/coordinator.ts. 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":"invokeai/frontend/webv2/src/app/QueueRuntimeAdapter.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf971e1f69c3af8734788f3f04268bcf95810497d1ea83d573d2573f5543e60e"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!isFit \u0026\u0026 actualZoom \u003E= PIXELATED_ACTUAL_ZOOM\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv2/src/workbench/widgets/preview/useCompareLoupe.ts, invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewLoupe.ts. 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/useCompareLoupe.ts"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"1147f549dd71e9335e3a62b9f7e7484c47690adf3d59e5b060fb35515bb76c28"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!isLoadingSetup \u0026\u0026 setupStatus \u0026\u0026 !setupStatus.multiuser_enabled\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx, invokeai/frontend/webv1/src/features/auth/components/LoginPage.tsx. 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":"invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"0312008e366f111b2ebd219781ea73ec6f2881dd1f0cb57b1cfe3f3dcd0a1839"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!lastPoint || !isDistanceMoreThanMin(cursorPos.relative, lastPoint, minDistance)\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts, invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasEraserToolModule.ts. 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":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasBrushToolModule.ts"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4b332fd1ebdec3717bc3b8c81213511fc3882df4d7b056d9aecbdad3fb9a3c5"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!next.fontVariations || Object.keys(next.fontVariations).length === 0\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/textEditingController.ts, invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-options/TextOptions.tsx. 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/textEditingController.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"d623c218d172a165466bd28924428129446fea5f4a1533cb906a60f3c7791aee"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!o.ctx.isPermitCurrent(permit) || o.ctx.isGestureActive()\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/filterResultController.ts, invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/stagedResultController.ts. 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":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/filterResultController.ts"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"1df3789c7c548e49df9194c3966b297a2ee635e022fceb5d87fe425fd51ecd7d"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!pinch.pointerIds.includes(event.pointerId) || !first || !second\u0060 appears character-identically in 2 files \u2014 invokeai/frontend/webv2/src/workbench/widgets/preview/useCompareLoupe.ts, invokeai/frontend/webv2/src/workbench/widgets/preview/usePreviewLoupe.ts. 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":"invokeai/frontend/webv2/src/workbench/widgets/preview/useCompareLoupe.ts"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"05e3ac17f326a5cff7e6662dcd0edbc45a3ad969293fda76a1c7a73be6652085"}},{"ruleId":"X15","level":"warning","message":{"text":"Length read from the parsed input is spent without ever being bounded: \u0060definition_len\u0060 is read from the bytes being parsed at line 24 (\u0060int.from_bytes(\u2026 8 bytes \u2026)\u0060), then passed as the size of \u0060read\u0060 at line 25 \u2014 and nowhere in its function is \u0060definition_len\u0060 compared to anything, clamped, or bounded against the input that remains. Whoever wrote those bytes therefore chooses the allocation directly: the call reserves the whole length before a single byte of the payload is known to exist, so a 32-bit length asks for up to 4 GiB (a 64-bit one for more than any machine has), and the reservation either raises \u0060MemoryError\u0060 out of a parser whose failure path was written for malformed input, not for hostile input, or succeeds and holds gigabytes for a few bytes on the wire. Bound \u0060definition_len\u0060 against the bytes actually remaining and a maximum the format allows before reading."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/util/model_util.py"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba186a6a9f6b8ca77f6e2bd4b080f3f6f3299208641823ac925b7af05cf1d237"}},{"ruleId":"X15","level":"warning","message":{"text":"Length read from the parsed input is spent without ever being bounded: \u0060header_len\u0060 is read from the bytes being parsed at line 172 (\u0060struct.unpack(\u0022\u003CQ\u0022)\u0060), then passed as the size of \u0060read\u0060 at line 173 \u2014 and nowhere in its function is \u0060header_len\u0060 compared to anything, clamped, or bounded against the input that remains. Whoever wrote those bytes therefore chooses the allocation directly: the call reserves the whole length before a single byte of the payload is known to exist, so a 32-bit length asks for up to 4 GiB (a 64-bit one for more than any machine has), and the reservation either raises \u0060MemoryError\u0060 out of a parser whose failure path was written for malformed input, not for hostile input, or succeeds and holds gigabytes for a few bytes on the wire. Bound \u0060header_len\u0060 against the bytes actually remaining and a maximum the format allows before reading."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/int8_convrot.py"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbc539f7b7a760e21e0c7674661a9d38c99fdc37d53fd839c60264222ff4e07d"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060load_execution_state\u0060 is public, takes a document from its caller (line 172) and hands it to \u0060_normalize_persisted_effects_in_snapshot\u0060, which calls itself at line 168 (\u0060_normalize_persisted_effects_in_snapshot\u0060) with a piece of \u0060payload\u0060 \u2014 and nowhere in \u0060_normalize_persisted_effects_in_snapshot\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. Python\u0027s parsers accept far more nesting than its stack allows: \u0060json.loads\u0060 turns 3,000 bytes of brackets into 1,500 levels and \u0060xml.etree.ElementTree\u0060 parses tens of thousands, while a walk like this one raises \u0060RecursionError\u0060 once it passes the interpreter\u0027s default limit of 1,000 frames. Wherever that exception lands, the work fails: a request errors, and outside any \u0060try\u0060 the worker or the program exits with it. Raising \u0060sys.setrecursionlimit\u0060 only moves the number the document has to beat. Thread a depth argument through \u0060_normalize_persisted_effects_in_snapshot\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/execution_state_migration.py"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"f762d66e8c7ff82fdc38f9deeb3a146ec0b8a6d7ec8cfd39bf4a1eac8eb9d6c1"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060normalize_path_defaults\u0060 is public and takes \u0060node: Any\u0060 from its caller, and it calls itself at line 55 (\u0060normalize_path_defaults\u0060) with a piece of \u0060node\u0060 (and at line 58) \u2014 and nowhere in \u0060normalize_path_defaults\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. Python\u0027s parsers accept far more nesting than its stack allows: \u0060json.loads\u0060 turns 3,000 bytes of brackets into 1,500 levels and \u0060xml.etree.ElementTree\u0060 parses tens of thousands, while a walk like this one raises \u0060RecursionError\u0060 once it passes the interpreter\u0027s default limit of 1,000 frames. Wherever that exception lands, the work fails: a request errors, and outside any \u0060try\u0060 the worker or the program exits with it. Raising \u0060sys.setrecursionlimit\u0060 only moves the number the document has to beat. Thread a depth argument through \u0060normalize_path_defaults\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/custom_openapi.py"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"3126e8a83db3ea29c6bbc96aa7d7a53dde5c6351a8ac66f9338f422e0bf0692e"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060remove_unreferenced_internal_execution_schemas\u0060 is public, takes a document from its caller (line 61) and hands it to \u0060collect_refs\u0060, which calls itself at line 80 (\u0060collect_refs\u0060) with a piece of \u0060value\u0060 (and at line 83) \u2014 and nowhere in \u0060collect_refs\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. Python\u0027s parsers accept far more nesting than its stack allows: \u0060json.loads\u0060 turns 3,000 bytes of brackets into 1,500 levels and \u0060xml.etree.ElementTree\u0060 parses tens of thousands, while a walk like this one raises \u0060RecursionError\u0060 once it passes the interpreter\u0027s default limit of 1,000 frames. Wherever that exception lands, the work fails: a request errors, and outside any \u0060try\u0060 the worker or the program exits with it. Raising \u0060sys.setrecursionlimit\u0060 only moves the number the document has to beat. Thread a depth argument through \u0060collect_refs\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/custom_openapi.py"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"27a64a0f9e06762ee356c1c752abeb734cabb0d71f15342786193da0f9961008"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060dump_dataclass\u0060 is public and takes \u0060obj: Any\u0060 from its caller, and it calls itself at line 35 (\u0060dump_dataclass\u0060) with a piece of \u0060obj\u0060 (and at line 37) \u2014 and nowhere in \u0060dump_dataclass\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. Python\u0027s parsers accept far more nesting than its stack allows: \u0060json.loads\u0060 turns 3,000 bytes of brackets into 1,500 levels and \u0060xml.etree.ElementTree\u0060 parses tens of thousands, while a walk like this one raises \u0060RecursionError\u0060 once it passes the interpreter\u0027s default limit of 1,000 frames. Wherever that exception lands, the work fails: a request errors, and outside any \u0060try\u0060 the worker or the program exits with it. Raising \u0060sys.setrecursionlimit\u0060 only moves the number the document has to beat. Thread a depth argument through \u0060dump_dataclass\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_ext/imaginaire/lazy_config/instantiate.py"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f1da9e66044120ca16ea2a8210c92e52b45a8471d598bc35453eb213e4412bb"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060wildcardsFromNestedRecord\u0060 is exported, takes a document from its caller (line 39) and hands it to \u0060walk\u0060, which calls itself at line 54 (\u0060walk\u0060) with a piece of \u0060node\u0060 \u2014 and nowhere in \u0060walk\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. JavaScript sets no limit of its own on that nesting: \u0060JSON.parse\u0060 accepts any depth, so a 100,000-byte body \u2014 inside Express\u0027s default 100kb limit \u2014 parses to 50,000 levels, and a walk like this one throws \u0060RangeError: Maximum call stack size exceeded\u0060 long before it reaches the bottom. Wherever that throw lands, the work fails: a request errors, and a walk running outside any \u0060try\u0060 \u2014 an event handler, a timer, a promise nobody awaits \u2014 takes the Node process down with every other request in flight. Thread a depth argument through \u0060walk\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/core/wildcardTransfer.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e6005b9dba641d069bcfdb839a42e8f3621b4284267313283f3a9f67fa7815a"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060collectGraphInputMediaNames\u0060 is exported, takes a document from its caller (line 12) and hands it to \u0060visit\u0060, which calls itself at line 19 (\u0060visit\u0060) with a piece of \u0060value\u0060 (and at line 37) \u2014 and nowhere in \u0060visit\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. JavaScript sets no limit of its own on that nesting: \u0060JSON.parse\u0060 accepts any depth, so a 100,000-byte body \u2014 inside Express\u0027s default 100kb limit \u2014 parses to 50,000 levels, and a walk like this one throws \u0060RangeError: Maximum call stack size exceeded\u0060 long before it reaches the bottom. Wherever that throw lands, the work fails: a request errors, and a walk running outside any \u0060try\u0060 \u2014 an event handler, a timer, a promise nobody awaits \u2014 takes the Node process down with every other request in flight. Thread a depth argument through \u0060visit\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/core/graphInputMedia.ts"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd49213c0dfac44588baf0d2a31a18717ccc22c66769b95af79e7cf6b39a8e3d"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060parseFieldType\u0060 is exported and takes \u0060schema: unknown\u0060 from its caller, and it calls itself at line 100 (\u0060parseFieldType\u0060) with a piece of \u0060schema\u0060 \u2014 and nowhere in \u0060parseFieldType\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. JavaScript sets no limit of its own on that nesting: \u0060JSON.parse\u0060 accepts any depth, so a 100,000-byte body \u2014 inside Express\u0027s default 100kb limit \u2014 parses to 50,000 levels, and a walk like this one throws \u0060RangeError: Maximum call stack size exceeded\u0060 long before it reaches the bottom. Wherever that throw lands, the work fails: a request errors, and a walk running outside any \u0060try\u0060 \u2014 an event handler, a timer, a promise nobody awaits \u2014 takes the Node process down with every other request in flight. Thread a depth argument through \u0060parseFieldType\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/data/templates.ts"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"f75e5f7ee9ef23254c1f0c104c6748778122f411f71ff0021391fc6598c66223"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060isWorkflowContentEquivalent\u0060 is exported, takes a document from its caller (line 100) and hands it to \u0060canonicalize\u0060, which calls itself at line 85 (\u0060canonicalize\u0060) with a piece of \u0060value\u0060 (and at line 92) \u2014 and nowhere in \u0060canonicalize\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. JavaScript sets no limit of its own on that nesting: \u0060JSON.parse\u0060 accepts any depth, so a 100,000-byte body \u2014 inside Express\u0027s default 100kb limit \u2014 parses to 50,000 levels, and a walk like this one throws \u0060RangeError: Maximum call stack size exceeded\u0060 long before it reaches the bottom. Wherever that throw lands, the work fails: a request errors, and a walk running outside any \u0060try\u0060 \u2014 an event handler, a timer, a promise nobody awaits \u2014 takes the Node process down with every other request in flight. Thread a depth argument through \u0060canonicalize\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/data/publication.ts"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"667fed73470df7d2529ece584e6d82401a2a7e7686b9588c74ad17f41f4250e5"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060areJsonValuesStructurallyEqual\u0060 is exported and takes \u0060left: unknown\u0060 from its caller, and it calls itself at line 21 (\u0060areJsonValuesStructurallyEqual\u0060) with a piece of \u0060left\u0060 (and at line 34) \u2014 and nowhere in \u0060areJsonValuesStructurallyEqual\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. JavaScript sets no limit of its own on that nesting: \u0060JSON.parse\u0060 accepts any depth, so a 100,000-byte body \u2014 inside Express\u0027s default 100kb limit \u2014 parses to 50,000 levels, and a walk like this one throws \u0060RangeError: Maximum call stack size exceeded\u0060 long before it reaches the bottom. Wherever that throw lands, the work fails: a request errors, and a walk running outside any \u0060try\u0060 \u2014 an event handler, a timer, a promise nobody awaits \u2014 takes the Node process down with every other request in flight. Thread a depth argument through \u0060areJsonValuesStructurallyEqual\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/core/json.ts"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"b56355e2fb726b9a04a16259ac44f5e55688d3983501bbec6ff50cfca0f5c7de"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060renameFonts\u0060 is exported and takes \u0060value: unknown\u0060 from its caller, and it calls itself at line 115 (\u0060renameFonts\u0060) with a piece of \u0060value\u0060 (and at line 121) \u2014 and nowhere in \u0060renameFonts\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. JavaScript sets no limit of its own on that nesting: \u0060JSON.parse\u0060 accepts any depth, so a 100,000-byte body \u2014 inside Express\u0027s default 100kb limit \u2014 parses to 50,000 levels, and a walk like this one throws \u0060RangeError: Maximum call stack size exceeded\u0060 long before it reaches the bottom. Wherever that throw lands, the work fails: a request errors, and a walk running outside any \u0060try\u0060 \u2014 an event handler, a timer, a promise nobody awaits \u2014 takes the Node process down with every other request in flight. Thread a depth argument through \u0060renameFonts\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/theme/rebase.ts"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e9ca6a16b70870711112c007e94120b05724a52e9110481d8318ce59509f23d"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060sameValue\u0060 is exported and takes \u0060left: unknown\u0060 from its caller, and it calls itself at line 44 (\u0060sameValue\u0060) with a piece of \u0060left\u0060 (and at line 51) \u2014 and nowhere in \u0060sameValue\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. JavaScript sets no limit of its own on that nesting: \u0060JSON.parse\u0060 accepts any depth, so a 100,000-byte body \u2014 inside Express\u0027s default 100kb limit \u2014 parses to 50,000 levels, and a walk like this one throws \u0060RangeError: Maximum call stack size exceeded\u0060 long before it reaches the bottom. Wherever that throw lands, the work fails: a request errors, and a walk running outside any \u0060try\u0060 \u2014 an event handler, a timer, a promise nobody awaits \u2014 takes the Node process down with every other request in flight. Thread a depth argument through \u0060sameValue\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/postconditions.ts"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9dfd81aaab48609816ad6e6a1be451fc277b757ad63781de9353671e6d871d0"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060stripInstallationState\u0060 is exported, takes a document from its caller (line 264) and hands it to \u0060mapDocument\u0060, which calls itself at line 223 (\u0060mapDocument\u0060) with a piece of \u0060node\u0060 (and at line 244) \u2014 and nowhere in \u0060mapDocument\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. JavaScript sets no limit of its own on that nesting: \u0060JSON.parse\u0060 accepts any depth, so a 100,000-byte body \u2014 inside Express\u0027s default 100kb limit \u2014 parses to 50,000 levels, and a walk like this one throws \u0060RangeError: Maximum call stack size exceeded\u0060 long before it reaches the bottom. Wherever that throw lands, the work fails: a request errors, and a walk running outside any \u0060try\u0060 \u2014 an event handler, a timer, a promise nobody awaits \u2014 takes the Node process down with every other request in flight. Thread a depth argument through \u0060mapDocument\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/projectAssets.ts"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f288f4982b5611a344e3b16a3516936745b54f5316834889caebd75318d9663"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060collectFontDependencies\u0060 is exported, takes a document from its caller (line 49) and hands it to \u0060walkTextSources\u0060, which calls itself at line 36 (\u0060walkTextSources\u0060) with a piece of \u0060value\u0060 (and at line 44) \u2014 and nowhere in \u0060walkTextSources\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. JavaScript sets no limit of its own on that nesting: \u0060JSON.parse\u0060 accepts any depth, so a 100,000-byte body \u2014 inside Express\u0027s default 100kb limit \u2014 parses to 50,000 levels, and a walk like this one throws \u0060RangeError: Maximum call stack size exceeded\u0060 long before it reaches the bottom. Wherever that throw lands, the work fails: a request errors, and a walk running outside any \u0060try\u0060 \u2014 an event handler, a timer, a promise nobody awaits \u2014 takes the Node process down with every other request in flight. Thread a depth argument through \u0060walkTextSources\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/fonts.ts"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"41abb8fda02590acd27b1e679ce5ea223afeb7b05fc67afa09a875a813980e57"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposes a dependency it does not own: \u0060store\u0060 is never created by \u0060PersistenceController\u0060 \u2014 it is the constructor parameter \u0060store\u0060 (line 7), and its declared type \u0060BitmapStore\u0060 is an interface \u2014 yet this class disposes it here (line 20). The instance came from whoever resolved it, and that owner decides when it ends. Disposing it from here reaches outside this object\u0027s lifetime: a dependency shared with the rest of the program is torn down when THIS instance goes away, and the real owner\u0027s later \u0060dispose()\u0060 runs a second time on an object already disposed. Drop the call \u2014 a class disposes what it constructed, and only that. If this dependency genuinely is exclusive to this instance, construct it here (or take an owned factory) so the ownership is stated in the code rather than assumed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/persistenceController.ts"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cffeeb4861aa67c2cdde095c858b8ae45d84dec3cf5ea79cdf04da8ead5bf25"}},{"ruleId":"X2","level":"note","message":{"text":"Not all async functions that make a request accept an AbortSignal: Only 14/28 async functions that make a cancellable request (fetch, axios, ky, ofetch) accept an AbortSignal or pass one on, so a request keeps running after whatever wanted it has given up \u2014 a page navigated away from, an unmounted component, a timed-out job. Take a \u0060signal\u0060 (or an options object that carries one) and hand it to the request; where nothing could ever cancel the call, omitting it is a deliberate choice \u2014 judge against how the function is used."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"bd89d014f84408f7063269aa5892ba3df7c9af3e981ecfb0752c5731bc62d406"}},{"ruleId":"X2","level":"warning","message":{"text":"Async function without AbortSignal: getItem: \u0060getItem\u0060 awaits \u0060fetch(\u2026)\u0060 but neither accepts an AbortSignal nor passes one on, so its caller cannot stop the request once it has started. Accept \u0060{ signal }\u0060 and pass it through: \u0060fetch(url, { signal })\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/enhancers/reduxRemember/driver.ts"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"717866cd2678b0dcc1e163bf4a1e37fd628715e61cf91df0679bc07d0ab5e06f"}},{"ruleId":"X2","level":"warning","message":{"text":"Async function without AbortSignal: setItem: \u0060setItem\u0060 awaits \u0060fetch(\u2026)\u0060 but neither accepts an AbortSignal nor passes one on, so its caller cannot stop the request once it has started. Accept \u0060{ signal }\u0060 and pass it through: \u0060fetch(url, { signal })\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/enhancers/reduxRemember/driver.ts"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2356cd5b7d0b3720369b6464e289dc51c3c4ea5b6ac4f7b091ef82b38ee85bc"}},{"ruleId":"X2","level":"warning","message":{"text":"Async function without AbortSignal: clearStorage: \u0060clearStorage\u0060 awaits \u0060fetch(\u2026)\u0060 but neither accepts an AbortSignal nor passes one on, so its caller cannot stop the request once it has started. Accept \u0060{ signal }\u0060 and pass it through: \u0060fetch(url, { signal })\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/enhancers/reduxRemember/driver.ts"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba68ad02ee03db44130a87d6b0a580d15a831fc752bdb7fc1654bb15e492a5e8"}},{"ruleId":"X2","level":"warning","message":{"text":"Async function without AbortSignal: fetchImageAsDataUrl: \u0060fetchImageAsDataUrl\u0060 awaits \u0060fetch(\u2026)\u0060 but neither accepts an AbortSignal nor passes one on, so its caller cannot stop the request once it has started. Accept \u0060{ signal }\u0060 and pass it through: \u0060fetch(url, { signal })\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelPanel/modelSettingsIO.ts"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab23c1f1d88feb4ee76863b18c1b5d9f65006890ba32099f3f49b781ca90c16f"}},{"ruleId":"X2","level":"warning","message":{"text":"Async function without AbortSignal: imageDTOToFile: \u0060imageDTOToFile\u0060 awaits \u0060fetch(\u2026)\u0060 but neither accepts an AbortSignal nor passes one on, so its caller cannot stop the request once it has started. Accept \u0060{ signal }\u0060 and pass it through: \u0060fetch(url, { signal })\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/images.ts"},"region":{"startLine":1130}}}],"partialFingerprints":{"codehealthFindingId/v1":"e791f4b82122b3c9d856851a78d3b163ccaaca669c1bfabe9ca6fc455a872f0f"}},{"ruleId":"X2","level":"warning","message":{"text":"Async function without AbortSignal: getResultImageDTOs: \u0060getResultImageDTOs\u0060 awaits \u0060fetch(\u2026)\u0060 but neither accepts an AbortSignal nor passes one on, so its caller cannot stop the request once it has started. Accept \u0060{ signal }\u0060 and pass it through: \u0060fetch(url, { signal })\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbc74f3d38d1892e9bdec51993d06504c0c541e235f4e952bd2493d79b81b38a"}},{"ruleId":"X2","level":"warning","message":{"text":"Async function without AbortSignal: waitForPreview: \u0060waitForPreview\u0060 awaits \u0060fetch(\u2026)\u0060 but neither accepts an AbortSignal nor passes one on, so its caller cannot stop the request once it has started. Accept \u0060{ signal }\u0060 and pass it through: \u0060fetch(url, { signal })\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/run-project-file-journey.mjs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d49db05d9decdb16a5d40a818313f97c0093ed1a076d34626c99b5b611bd734"}},{"ruleId":"X2","level":"warning","message":{"text":"Async function without AbortSignal: assertAssetRoute: \u0060assertAssetRoute\u0060 awaits \u0060fetch(\u2026)\u0060 but neither accepts an AbortSignal nor passes one on, so its caller cannot stop the request once it has started. Accept \u0060{ signal }\u0060 and pass it through: \u0060fetch(url, { signal })\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/run-project-file-journey.mjs"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5ca8aeb3d1b5994aace2ff6c06ba48b6d310a77a3bc4edca2bfd245eac65152"}},{"ruleId":"X2","level":"warning","message":{"text":"Async function without AbortSignal: runRoundTrip: \u0060runRoundTrip\u0060 awaits \u0060fetch(\u2026)\u0060 but neither accepts an AbortSignal nor passes one on, so its caller cannot stop the request once it has started. Accept \u0060{ signal }\u0060 and pass it through: \u0060fetch(url, { signal })\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/run-project-file-journey.mjs"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"a537fd3f9cd1eb22e7b462ddd22553a269f35eb53a760d735039f88b76d1b830"}},{"ruleId":"X2","level":"warning","message":{"text":"Async function without AbortSignal: waitForPreview: \u0060waitForPreview\u0060 awaits \u0060fetch(\u2026)\u0060 but neither accepts an AbortSignal nor passes one on, so its caller cannot stop the request once it has started. Accept \u0060{ signal }\u0060 and pass it through: \u0060fetch(url, { signal })\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"1566c77a1e09a0b3654e31c2b739058c25ba66ad6946289b28b1eecfbf9d11b8"}},{"ruleId":"X2","level":"warning","message":{"text":"Async function without AbortSignal: openRepresentativePage: \u0060openRepresentativePage\u0060 awaits \u0060fetch(\u2026)\u0060 but neither accepts an AbortSignal nor passes one on, so its caller cannot stop the request once it has started. Accept \u0060{ signal }\u0060 and pass it through: \u0060fetch(url, { signal })\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3c5708ee950b7acc3a0cd0f667d8204c6b71a35b2c08aab8a695a9950f9cbb0"}},{"ruleId":"X2","level":"warning","message":{"text":"Async function without AbortSignal: waitForPreview: \u0060waitForPreview\u0060 awaits \u0060fetch(\u2026)\u0060 but neither accepts an AbortSignal nor passes one on, so its caller cannot stop the request once it has started. Accept \u0060{ signal }\u0060 and pass it through: \u0060fetch(url, { signal })\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"36d8ce6067a0bb85b4057948704ec3503af868bf13fd6e93d6bacdd2f6bb8090"}},{"ruleId":"X2","level":"warning","message":{"text":"Async function without AbortSignal: runSample: \u0060runSample\u0060 awaits \u0060fetch(\u2026)\u0060 but neither accepts an AbortSignal nor passes one on, so its caller cannot stop the request once it has started. Accept \u0060{ signal }\u0060 and pass it through: \u0060fetch(url, { signal })\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"af8b1c72dbfa375ae557d141b95f66f56e8260643e3df5333575ed929288ec49"}},{"ruleId":"X2","level":"warning","message":{"text":"Async function without AbortSignal: fetchImageAsDataUrl: \u0060fetchImageAsDataUrl\u0060 awaits \u0060fetch(\u2026)\u0060 but neither accepts an AbortSignal nor passes one on, so its caller cannot stop the request once it has started. Accept \u0060{ signal }\u0060 and pass it through: \u0060fetch(url, { signal })\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/detail/ModelSettingsMenuItems.tsx"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"589bdea24b2a92e2e37b449a716df66ee0ac27b1f2847c351b7a4f546ffeced6"}},{"ruleId":"X23","level":"note","message":{"text":"Diagnostic log message is built whether or not it is wanted: \u0060debug\u0060 at line 98 is called with an argument built by \u0060Object.keys(els)\u0060 (line 98), whose cost grows with the collection it walks. JavaScript evaluates a call\u0027s arguments BEFORE entering the method, so that join/projection runs in full every time this line is reached \u2014 and then the level check inside the logger discards the string it produced, because debug is a level a shipped configuration normally leaves off. Nothing here decides beforehand whether the message is wanted: no \u0060isLevelEnabled\u0060/\u0060isDebugEnabled\u0060 test, no debug flag, no \u0060NODE_ENV\u0060 build switch."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFormPreview.tsx"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bcd52cf3a08b7f641ab88c27e0bd65a50198ffd48e4d582cb2ead02078ffee7"}},{"ruleId":"X23","level":"note","message":{"text":"Diagnostic log message is built whether or not it is wanted: \u0060debug\u0060 at line 120 is called with an argument built by \u0060children?.map((l) =\u003E ({ name : l.name, bounds : { left : l.left, top : l.top, right : l.right, bottom : l.bottom }, }))\u0060 (line 125), whose cost grows with the collection it walks. JavaScript evaluates a call\u0027s arguments BEFORE entering the method, so that join/projection runs in full every time this line is reached \u2014 and then the level check inside the logger discards the string it produced, because debug is a level a shipped configuration normally leaves off. Nothing here decides beforehand whether the message is wanted: no \u0060isLevelEnabled\u0060/\u0060isDebugEnabled\u0060 test, no debug flag, no \u0060NODE_ENV\u0060 build switch."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useExportCanvasToPSD.ts"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a22b6d572ba29bd961851c08852687ab86cfcf4f4d79ad5b32bbb55b07373d8"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060label\u0060 is text this program did not author, and it is written into the text of an element through \u0060document.write\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"661b9b04db04032fc3004c5fa69c121f4a3bbd6dcc23763aab8063609bdc42e5"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060url\u0060 is text this program did not author, and it is written into the start of a URL attribute, where it chooses the scheme through \u0060document.write\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. HTML encoding does not help here \u2014 a \u0060javascript:\u0060 URL contains nothing it changes; allow only http(s) or a relative path."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/util.ts"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"134e43ed19b534b0fce195592c36c881128c9f1447b0c0c100e791fece409bb9"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/dependencies.py"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"d259d2511473f9b89199e465f0cb5a64df7591ae8262057838085f00088abf31"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/videos.py"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"d071200025877e18c19512a5c65dc2d165423cb072b0cc6adcc48c653dd39b88"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/videos.py"},"region":{"startLine":567}}}],"partialFingerprints":{"codehealthFindingId/v1":"8665c2d120977c9f5919ac7e5c752e0986415d8a3f46255e62fe2921b1a898c0"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/utilities.py"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"feba9930d0914671a7a18802b7c0f48f9c44fdc84eb6ae11f25155b18aff227e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/model_manager.py"},"region":{"startLine":1714}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1e5f7313cb84c05f60bb4ffb0f619d5ceed4a9395936af1490ef3bead77a3e9"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/board_images.py"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"6968b4ba24ee0b4d3c9d6d7d2b5762415b5d478a0527b3135b545c605aed01e1"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/app_info.py"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"2950aff4b4a2f6b173aad111072823e7c8e3baf52621df8a21a1b5c59868a1fa"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/app_info.py"},"region":{"startLine":262}}}],"partialFingerprints":{"codehealthFindingId/v1":"395cf0707cae08dc5c51deb42a54cd2759969bb63371ee0cafa0972a0558c7f0"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/app_info.py"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"58d7ca958e4653dc751237b45843a4747c49ae1eda9e36f5ad1db7cf0f1af13b"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/video_frame_extract_range.py"},"region":{"startLine":347}}}],"partialFingerprints":{"codehealthFindingId/v1":"b77d805047f61f8e97b87747a378a05fa34ee7562f4dab19582ee22c9b7dcc55"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/wan_latents_to_video.py"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"28d5c448fa7711abbbe5fd23e03117476912d4a58531f43caac13a438c9725b1"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/minimax_h3_latents_to_video.py"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3488ccc7d0eb199b427e4803700cc13dc77f5d3546919e398bfe0a21392f715"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/vae/minimax_h3_latents_to_video.py"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2bfa2b74e60296d606b789444ed59377a951e70496e380a1916b829373596e3"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/wan/wan_denoise.py"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a3bb2eae829c09958d5f084ab20af0dcc2d05ae0829c5816f17342e0af48fa1"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/external_generation/external_generation_default.py"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"73f6425ca898ecce13b57e47e43b0793a87cf37fa23cb90db5ccdc42e5e0aaac"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/fonts/fonts_parsing.py"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6b9cfe74f20983a0098337b2b84f0b1f88f63dc8e165e15ec13fb5a009a136d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/fonts/fonts_default.py"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a6678f3cab18b83530857a2022c581fdd5cb82fd227947815ad71776ac29f51"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1317}}}],"partialFingerprints":{"codehealthFindingId/v1":"396ce36a7f9ef25fda33f3326fd2defb9243ba6c1c73cb3577f940b000de2022"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1496}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e2c4a060dcf9c7064e06f235b9163a406555335d91d57d5c7c5371c99678780"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1757}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2cedf2a721305728befc029f48d8a91ec92e2ac0c370b4a6ca9e83c17718767"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1797}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ec0b38e9d0b7e5185bed2ef5449dc81a6c6e3bb0b4376e64750ca39d9689031"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":2255}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6933c1e672e372e270539491851b1842d7fdaf42be26a44424a5d85c0cb078a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/model_install/model_install_default.py"},"region":{"startLine":2262}}}],"partialFingerprints":{"codehealthFindingId/v1":"6596d69e5f4749f4babe5cbc97f2aab7278db0f6d5039fd05a67aaebd5ec93a0"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/model_records/model_records_sql.py"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a888ac4c85740a5ca2d2dcf1da33dadf8e371f0a05782af0740335466bf876d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"8703c478828d0eaeffa636a34370a3ea233eff9f884d5e2f0c2fca532bbbc1d6"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"207a002e6a7f518446df9f0369713c93b592ea15582ec01d689b193e51005373"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph_validation.py"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0d84717098974a067f828df2372e253c3350f34652569f8ad25e296f31d83f0"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/graph.py"},"region":{"startLine":1923}}}],"partialFingerprints":{"codehealthFindingId/v1":"a85d263f910a6eb8bcf080e5cac31ca885f0a932cc3e6bd4e222e09410377336"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/database.py"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"385c9c401dc2ba1f6966f7974c785dadf7ec9078e31f1af192c47b595feb12a3"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/video_files/video_files_disk.py"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e16fa503c7cf7fffef00d980132d72e2e88a60c47543d1ac15ff2c55d339483"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/video_thumbnails.py"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"b59e028d7caf584725fd9757afcca798cd101befa371ff03802e4871653b4d20"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/video_thumbnails.py"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"87618ec7e5cc1b1a9d264ad002f25e9d7fce9ef164af33eca68003768d247ec2"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/video_smart_concat.py"},"region":{"startLine":486}}}],"partialFingerprints":{"codehealthFindingId/v1":"482528c5fbc3bcdaab8d15162d042bd16b148df07f45fea9b1adf93971d55978"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/video_smart_concat.py"},"region":{"startLine":493}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee3948b19f479db9e4f4a0d5a1610a629ce7a3742caf2eeab24833eb02795fc5"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/video_smart_concat.py"},"region":{"startLine":496}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9006231debff92e2be2f3fb0eaf89a0e73d2884670173fb72a1f1659dfe3faf"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/video_decode_worker.py"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b1bfd5b9c5130d4adec86a820d0a43aeace8ce41d255e9094ba1421c8df648e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/video_decode_worker.py"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"f562dc990ce4d9577852b9f0f4ed1dab19789072fa44d161a85f3fcde8c97fd9"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/video_decode_worker.py"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"57a3d4b3f7156642d830c10c5f717bc97d716f5f39655695fabaa1dcfe039b41"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/video_decode_worker.py"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cd93423a78ff2e9503897ec90d183001754c86442361cfb37b5e69c304c2b58"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/video_decode_worker.py"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"6001c698c2ac45d2f275810f7a659ed080c27ebbdea8936c17eff788ff00d8fa"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/torch_cuda_allocator.py"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0403564cc164c0bc9518ae25f0ea6ae7b288f6479ba18fce4be0f132869edc9"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mlsd/utils.py"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3723f4026c4f2d775229bd7a066e11b73df6327ad6879cb7b0d2a3a14598d51"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mlsd/utils.py"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b630d7f7909975e25924ffaeee46e102680e7d35712d30e02575d4457aa746a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mlsd/utils.py"},"region":{"startLine":578}}}],"partialFingerprints":{"codehealthFindingId/v1":"f858092746cbf2705c8645e81e0f8375f13abf35b8eae9d6d087e0a0a3ec7956"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/mlsd/utils.py"},"region":{"startLine":586}}}],"partialFingerprints":{"codehealthFindingId/v1":"15a0cb2123887c6df06a1ab4bac72216bac2649e1c1fe6116fdf72545a30324d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/minimax_h3/denoise.py"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"262a97d9b4b3f4ec86269baa8c0d4b8c11819624638081861d62e668778550a5"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/minimax_h3/denoise.py"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b6e9b5c8f2ebd0de97160e9a75b0fc4b57279728d63ddac58af4cae60d2f249"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/model_on_disk.py"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"551c615a075aaf4d419debd1765e0aa1e5d12f15706bf381777985ca51ea836d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/model_on_disk.py"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"07a7aca9f86e591925804a1b22da65d8aac40de5dd56d7641b6ff9d197b73b32"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/textual_inversion.py"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"d977c0d578e69578f2202f7959e1714b9605e893044d93bb0b6347aef27a03ba"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/factory.py"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"28b3ba491a32624d48c6c4ed66a711f98b55eedefd65608cd205cc72385ed373"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/clip_embed.py"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"3092e5b7dca2b0f3e22c45af9617976dac8803731716a2f7c3102421fc61dbf4"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_util.py"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"26ff1cdf78dc1c732b10abac3732658cc3f198b1e631d06de0e3c80f39bf9e81"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"070fc3694d91289234d20452e829ab6f92928cd1e1a320d93e30111531aa9861"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2421}}}],"partialFingerprints":{"codehealthFindingId/v1":"1361483bbb04c48479c5c173e5efd3cc8f60535044537f9ee3301e96d5a16dd7"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/z_image.py"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"a40788e2d34a3cfc915a1ec897e4d1c80d11b4a4383a9a3b34639617592168a2"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"23342bf773f4b87e8917c8c345cd523e48694eb79a400d3f5f323ac3be7de90a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0e99a09a8f458d368208e1ed4ab30b054d34e770ae60c1f5f115536e21a2633"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"6532f7e9d6c3962db6f2f213533f32856db2ff22276441455970ac8f4109dbba"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py"},"region":{"startLine":654}}}],"partialFingerprints":{"codehealthFindingId/v1":"90535278c78a0b5fa050af36d367453710268bacd47792d4a098d8acf2598489"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py"},"region":{"startLine":764}}}],"partialFingerprints":{"codehealthFindingId/v1":"6648a1991db9e3b82090e0134bbe941107e9cff4fbdaff3b344a6fa5e55b5c33"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/krea2.py"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"bffe72dd96583408b16b5caa225cc2f874f6d6144bfee434e8e87a0a5f11684f"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_loaders/flux.py"},"region":{"startLine":1722}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8551205eb1c9388f747030007463be4dbe0cb7f69c03c2fb2cb291a254edf26"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/util/model_util.py"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e8b105ef580161e567c9b09f7ad24d2f183db1473cce3ccad33385dc3571519"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_ext/imaginaire/utils/misc.py"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ba563aefa925c95461a4037f2560a0bf1dbfe38c0cce55720ea9ac84509ac3a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/int8_convrot.py"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"38c71f71d487ea01f94ae6c15c2f5475624ab72de78a28828b0ae1a180e1e8bf"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/int8_convrot.py"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"8643a98b344d3e6fa57a1944027f0d877c3056c17b11d85eb997496269e1d1cb"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/fp8_scaled.py"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fa2f627a51f3c9be805085e6b907edb50178b36e62b777ee6c7fa80c0315440"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/fp8_scaled.py"},"region":{"startLine":1006}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e83b447429adbaf38622b4e468bbdc1db917ed341be4a2ef30ecce1c2e1604d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/sdnq/detection.py"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"eedbb09982ea4c2e2acecee7d7e38edca9db4a56218f4ae66a974a46b1e3e5da"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/qwen2_5_vl/qwen2_5_vl_assets.py"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"580e9656325847764250818b991ce06f23fc13198bab453eaa31619a474c5359"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/hidiffusion_utils.py"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"76d2279a998cec7457fde9b3582d6fb29b9a1ff939f6b72e0ad93fdb8dd79908"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/hidiffusion_utils.py"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"447f5eeea25de058b9c14db5afb385edfe8a003dd3a379732cbbce57c2837c6f"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/hidiffusion_utils.py"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"e04c79bd21a57e870d962977401f2ecb4fec87dbc6ea2b326bf4a8298d0e3437"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/hidiffusion_utils.py"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a695259364fa729ab8028fe1d05a945265d74e6d44d31f7469438ef8e7eb8ba"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/hidiffusion_utils.py"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"60e6bfe414b17150d5a32c800031ac8385bd64bbfb3f2b67a9e8c53e5e255f50"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/hidiffusion_utils.py"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"f468b01b43c14de627f1322e8484380f90ca5267dadfb95368f1880926cc6b47"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/hidiffusion_utils.py"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e5ac4af535c85950712cb973705976cb4bf20e3e8869c8b838931313c35e504"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/hidiffusion_utils.py"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"076aa64ef68b89de14d560f67aa8470cd55f7d4415d5dab3d028cab48995278a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/stable_diffusion/diffusers_pipeline.py"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"0be928f7342f5967cc0ad43de6ff55f2c34f92a94f6ba0d1a1e7f72fc62cdc53"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/wddm.py"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a9b1a43a290a1fd620b48b73e99f17f8725d842d25de911f179a08de7d6d3c7"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/wddm.py"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"c686567782006812d5ba19569b62b612d0a51ee98f2bba0266dc03de7d46be4c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/wddm.py"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"303fc644f327f173adaeb43390d04839add25d038e9be7a41043164cb675fba2"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/level_zero.py"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b909e018c001785347b4de28df66f1bdebd799c853566d15bb6c25d0d886720"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/level_zero.py"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"766eecb5c202e9294b8628b18179f7fa99701fa70b6d5e82e3c13b0fb29c67ed"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/hotfixes.py"},"region":{"startLine":804}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd16d52b587d88ac10d0d5ca07b1937e128b0a119d644c3e868d297932859486"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/devices.py"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"31b3dccfe9971bd8cc74fa517bc364f893cbd7f88c8f83bc3878b981ef52e07f"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/devices.py"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eb9d09ddd74af99405350fdf26e65e053fe8b480c108cb6998f524bee28571d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/devices.py"},"region":{"startLine":526}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa462b24ba9f7e4f41e23f4dd63ee13d0e75f3a6e09b5934eae248f36b6307d4"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/attention.py"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c724824c5e5c484aebc83f94df421abbd3975a34787042a7910045f8d632259"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/util/attention.py"},"region":{"startLine":491}}}],"partialFingerprints":{"codehealthFindingId/v1":"8360a5a3acc9dd1d8c7671a2f9e5a113ae0d5dd8c7f64cfc6f8d3445a476bf21"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/hooks/useGlobalHotkeys.ts"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1bd5dd2d089b3c3fb100f7dd8db37d2ae905cd7f2699c9aeb438aa16284993d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/hooks/useGlobalHotkeys.ts"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"f683dfcd3e60ed2ceee0bb495a18b6f771b6946e075ddbab2473fdcfc8b6a244"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/UserProfile.tsx"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"1820514c3dd7aa5d4c1266984466078642f163d3a4f0ff24721aa273e5f2430a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/UserManagement.tsx"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"b91327b26085938c27280ea128ff02f9b63593e20d0bc96ab9e1abca7ae0ca30"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/LoginPage.tsx"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"e392dc30c2d26faf5b5ab8549780686c7a06052472c860076df630b38a9ccac1"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/components/AdministratorSetup.tsx"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"af8823c0432de6c3f3bd8fbac0387eb26978348c7f560101b68ed6195f26465b"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/auth/store/authTokenRefresh.ts"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4fe30db7abb445a6feea5147386aa46abf9b1e873b135843ea64e2c4fecdfdf"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"066504ae24908a01f17dfe50ecd25738c8b28e3f0e5097df96344c3e9991fb8a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8251d9e4bb4d44dec56b7b7f8995615460401d914f047ebe1a160d19f29eb9d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsGraph.tsx"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"db3d2fcf7fa85cd8bf5190477fdf49b5f9f1e2f4608b273d21f680a431adf3e7"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerCurvesAdjustmentsEditor.tsx"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbcc9ee9e4118c51bc7f788956da983b7ec0ccb1d5f09721ec9a2bece293a6b1"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/RasterLayer/RasterLayerAdjustmentsPanel.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"89a51664440f068cff9a453b7473bd14015a2048e9ba452b73565e827423e9c0"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasTool/CanvasTextToolModule.ts"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"44817c4cb9058ba0ac8989a24cc6df70adbb0be3f636d6bc021933c2b8b0538b"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/deleteImageModal/store/state.ts"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"da32ab128f4b28545ece8803487a4ea859a751357e412bdb481a3bc7b1a07394"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/Boards/BoardsList/AddBoardButton.tsx"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"0700beba06956e70ff8a8cf7fad26dc5dc3ebc80ff4ba7bc2e3e2daf1f22548c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MultipleSelectionMenuItemsVideos.tsx"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"545e98b465ca4ba61579f16e0a16eadee7c2deab71f069d2fe191df881732da8"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemDeleteVideo.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"15ec91ed81e4726c1c8e8c53e53ee80e7cf06f35c366a2adbe9fb5cc3ab84622"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ContextMenu/MenuItems/ContextMenuItemDeleteImage.tsx"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a361bcd408256c0f31042a7e830a224e471f13726e349906bc4285d7937731d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageGrid/GalleryVideoThumbnail.tsx"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"c88dd4014731e96f0d0f76129acc2e14fc4f636af38cbf7238506a02b604701d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d78328ea352977a4e864ebc5531efca0f986d884a5a6878804cb80ec8b84fa0"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae0207a866740d86f67d43c34125dc97a4070e4beab34331ae077e703da229b7"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/CurrentVideoPreview.tsx"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"16e7f5857a1167e90ea8563827829a5984b024aeb0caf5970a7a3cacaab99fe8"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2206}}}],"partialFingerprints":{"codehealthFindingId/v1":"69189d3d660ca16936b866d684a805c83466dbae51e765470707377fa731a919"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2661}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e5b8cc9e7aec07e254e394f2196b416f3a7d2d7f7263bd3fed63fdfedfd3e42"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2710}}}],"partialFingerprints":{"codehealthFindingId/v1":"1456e20af28c30554fa0c8e941eaef3969c63595ec6b72e0c3e904df832d7e5b"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2963}}}],"partialFingerprints":{"codehealthFindingId/v1":"99acd16c5b52af0a7d0249931938ea6288fc77a44bc63175fc4bab78cc23fff9"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":2976}}}],"partialFingerprints":{"codehealthFindingId/v1":"e39d6a8ccf093fb5ce00658e93217c42ce9b60d999da293ce60f059293de3ab5"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":3094}}}],"partialFingerprints":{"codehealthFindingId/v1":"5542bbbd30f71e87caf324d4c67cc6d6cd1644110fba0cb0dffcc7ee83080d9a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/metadata/parsing.tsx"},"region":{"startLine":3103}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd516d1fcf4dddd1307bfa56822f27a614f686d4332d694fe1570bf7416ac236"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/components/flow/nodes/Invocation/fields/IntegerField/VideoFrameIndexFieldInput.tsx"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7f92ebfe74d77ab59ed98be0d031c35910531b928ccaa8079ef612372049435"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/workflowImageExport.ts"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"da952005429466008e63c7d57592d7fb4566e4fd0fe8ca0ca1e38bb8b2df7d86"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ImageToPromptButton.tsx"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b30766306f2519fc848cfe2c2aa039b8a5a6ac349ab9b01a136bce334ca9a5d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/prompt/ExpandPromptButton.tsx"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"96afd86415979f8f512b9a447bcd7fa18a55aa6382b500523254463a2bd5179a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/workflowLibrary/components/SaveWorkflowAsDialog.tsx"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bebc8dc3fe75c2066800e1d760088d5b5594ac453015c5d5cc7fee3a339177e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/index.ts"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"917864c4839e4418836eaf43b8f849606d33e78ad57ee8688622a701eebdc52a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/videos.ts"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dbe003d9417eb444a51b516232bddb5178819b7965a542a8c0c7fe0bbca5bf8"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/videos.ts"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab6b7b8135bd68f6458cfb5064dcb0352aa042846c4755b181aa4ee09a0bc2ce"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/queue.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2d98aaad1c9a74a08b14903cae2c93afcb773502d220893a2e71ead07ecf920"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/queue.ts"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1dd6178fdc193fe0ab2d2e2ada3d17bae47b39234d5c90781efd0d6ba49c18c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/models.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"d993e6445ac4a7c63aa100ca8762272693dbf6517d7068d7f5bf55434edbccfa"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/models.ts"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"804065414fe2d208a5234264612521f10b4a227c843cc04df8872b80744cf3b2"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/models.ts"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"40f532a947a0a2cacbd308c04e6e2afedc0327af3f59dc045d757d28d954e9b4"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/api/endpoints/appInfo.ts"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dcd357bf8d2c6a1ae928533475a941d353b971807da8654bf73db950043f707"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/run-project-file-journey.mjs"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"e34cded516c7fe1bdf3c6d2455b160d6b9d9fa7563b2aef5976b7ccd7e611a71"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b92927da00bd6303a43192ca2db6e4a10236397b281591d2c70a9e601b30e0e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/run-accessibility-journeys.mjs"},"region":{"startLine":1336}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2dfe665601132b3aba44293e54082e81cec83fe935b8a1678c2804398a8fa06"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f5ee6c315029fa01c24e0a257ea6239793d7e263d0e0f10688c59a94d27a49f"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/scripts/measure-architecture-performance.mjs"},"region":{"startLine":881}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9e356ee8feb728edc6e65290f2788f1a8d0e083a9d28988e4c63ccd2df74648"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/app/ThemeController.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a1ae841b0b3cead521975b5e97e231d3ba78d4365ebd0c79a54bdea486db920"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/app/ThemeController.tsx"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"840f7534e63bdcf2ef236ae2590f4ad61e0dff9993ef03bc393e2b390fa492af"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/app/I18nController.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1da73c1f0acadb1dde2ee9657622b29b394c6c42ecaeb995ca0adbada1aef6e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/gallery/data/queryCache.ts"},"region":{"startLine":540}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd2df53e0f13c82e37409d3b6014bbb9648fd742fbdfdb24d75780636a89b5bd"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCropDialog.tsx"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab371bb21a7da96f60698ddd6a615eb8637ccbaad781cc3e48113abd12e45526"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/identity/session.ts"},"region":{"startLine":984}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9cbce33dd34f737a86529ab5d7c85c2266d2549a28a8a363d6c77cea5eb9dd8"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/identity/core/tokenStorage.ts"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"b66ee1b2a5f0c55bc52a33457857cd56de96327cf052e6b8c14283d5f64b89d9"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/identity/core/tokenStorage.ts"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f3dc74fe2908e020fa28e8fa40049e7d6cada8aba744fc96a52d68598b328bf"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/identity/core/tokenStorage.ts"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"b577cf1405234be9e408fdc974b621115bff712525a2fa18a0c0953887d5ee75"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/identity/core/tokenStorage.ts"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"257d48284fc50180ef226145a1f54aede8e63832df74f9b02296b31c4628131e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/intermediates/holdLease.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f9db5e6b5dc465b617febbb95eb837f874d30295b271bf75b9d0f7af4b6b73d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/data/relationshipsStore.ts"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b78849548fc9d9d068c9526900129204beac5c7565a3dc12cd82a109f3f935c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/data/apiKeys.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"305042745fa09d77f7d79ebddd68fb36fbec613d7e8e44291e73a92fa2b417d8"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/data/apiKeys.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"6705047c3d4f1c3ffddf7874ac594b534ca0c5974a4e3346121493a9152beeb0"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/components/ModelSelect.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4d26cbb118078bd20b995a8783aab90296b5df062343c09e347652b0557c9ff"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/models/ui/credentials/ExternalProviderKeyCards.tsx"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"c23e62f65f952aea75aeb066637a29a136f19ac03f105fd286494844a1ba62bd"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime/utilityGraph.ts"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"e854a4dfd861dc353ff150cc01fda4666e676dac7b7487b4323dfaf74c196291"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime/utilityGraph.ts"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"276d2b5c292a25e7a55fbee0238bfd17fc5d6310f164707d14f3a43ba94a0fb2"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime/utilityGraph.ts"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"3243364d8c373029372b46070337b097e906b9e14e1e8d3718102d98b6fd2305"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime/utilityGraph.ts"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb662d30081c0cc2670bbd20b8805c8e91b68f816a72b336dedb9b390f166878"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/queue/runtime/coordinator.ts"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"78e867a7dd640963bdd5303e87cd8eb389e0ef76c8b44acf0787cb8b53ab3b99"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/core/batch.ts"},"region":{"startLine":537}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5c3748ffdacf99438a3bed20667697eb2fc0f50ed3837860782c20b2a346196"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/data/libraryBrowseStore.ts"},"region":{"startLine":417}}}],"partialFingerprints":{"codehealthFindingId/v1":"186ec8467012fbe068e5b7288a88a26d09b24a061f2b421285456110f0f3dc1c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/data/libraryBrowseStore.ts"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"76fbbd62f484393a1e321ae9820692c57f2bb580e58065c3c3f18e7a87aea199"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/PendingLibraryWorkflowLoader.tsx"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecddcd2e1324cff459d966d11d48844c0fa9a3bddf4b5df5bf5230afa49f0545"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/workflowImageExport.ts"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"060934697468b999240c47dee50bb0ea1d486f2b466b4252b2b0e6116acb4ed3"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/editor/useEraser.tsx"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a72bfcbc97e42aac0f9e5939d97b64a1c0d15e44769b5749e92fdbacb573d80"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/fields/WorkflowFieldInput.tsx"},"region":{"startLine":1262}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b67911f67b551d76b81db958eac94b51c503932c6bce9639b0290e7839b24a3"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/useOpenLibraryWorkflow.ts"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"776f4107def8f9f9c91e62147af0b3034b73e2249cabb2b3074b51772138fd46"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/features/workflow/ui/library/libraryPreviewSource.ts"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"531f040a226ec32d770481fea07487458076bcadb776fa8cfb81a15b973368bb"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/logging/logger.ts"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"8852c58ee375b58179f500318444446f99bd0d27ac41269874487aa27e3b853f"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/logging/logger.ts"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"e194fde112d3a68309f0f57f215008b5a0f309c2db9794d3621dbec8a4263975"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/logging/logger.ts"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5caf9fb120c891e30be918b291368ee9eaccd2c0ddf197cb59b939ed77006a3"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/logging/logger.ts"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5f8fed84ecbce30c050fc11d5314a03faf7b6d7d247646b6b6f03fddba3fc94"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/pwa/registerServiceWorker.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"2154f76c40317f80b7e81c7a6ba0509945d885effe0bcde0bc26e99b84620890"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/state/accountLifecycle.ts"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"39e7a9bfeaecf9baa62699032707289a71f409ab4585539b96c402b34ea12ca0"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/transport/http.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f82fcd7848261824867247e50f15c7cdfec039d13ab83ff4e0c63033792a3df"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/transport/http.ts"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"af222b4eef7404fafd561e6fcfdf84578a68a21a901f9b381d7d1087c188aa53"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/colorPickerStore.ts"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cae007939563f35f0749ec02eb33890f36854324e54d282bfac83662d6e6fd5"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/ScrubberField.tsx"},"region":{"startLine":481}}}],"partialFingerprints":{"codehealthFindingId/v1":"2132694617b25f3b0f84d12f59f4432cbba24d5fae24c22af95d4f64528432a1"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/ResizeHandle.tsx"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"7469d8d6a556d9c0c8561d662870bc44fc289869649f9b3ed06481871beaaad5"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/platform/ui/RenameDialog.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecb0901541a93748edba3cf0741f127551503f9aff820469c04dee731797daf4"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/performanceMarks.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"526c9184416414f6b9b3ed515af47cc639cad21286d66e1957708c309d1fdfbe"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/bootWidgetPreload.ts"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"149cf7c3a42a53b9a65eb595ed828c1c49288d1c494682c337ad71ce2db74cdc"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/previewPublisher.ts"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"907f11d9f9e578681d70dc70e6ce213fb541c1171ec050a801473b46cf6fb3b7"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/layerRasterizer.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"87ccf3b8178f56faa0427ccdfcb790bcc9e4e6e7ba8b0d49f07b5466d0d64fa1"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts"},"region":{"startLine":778}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d4aa02b73c5d08f4daf9ecb12959317553d8c956a292feefb28f4a1fdaa3b72"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts"},"region":{"startLine":783}}}],"partialFingerprints":{"codehealthFindingId/v1":"93982cdb65fbf20add40bed7732f4e51fc7fdc17234723e14c6987df407349bd"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts"},"region":{"startLine":788}}}],"partialFingerprints":{"codehealthFindingId/v1":"909ef574f711aa6f17364e9cfb32eef54ce31e0dbb0245a766804a0720712add"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts"},"region":{"startLine":828}}}],"partialFingerprints":{"codehealthFindingId/v1":"167ece4862159333dba5323983942cbc5634a62cc3739e31674c13a5fa272864"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts"},"region":{"startLine":1277}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc761c179c089baa842fd92395cb1d79edd904d829d3f87d83c2c76b422feed6"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts"},"region":{"startLine":1340}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fe97766fb7a66e0b8febb2b0976766df948b4cdcfa097f15377db98208fe47c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts"},"region":{"startLine":2062}}}],"partialFingerprints":{"codehealthFindingId/v1":"891b2d61deb535a05a1a67dee19383bd5fc73183c42b813305452eba6cb99814"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/engine.ts"},"region":{"startLine":2686}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed268b81e7a5abdbba3138c25ce8f5d4af73abc7cf3f3e61a1c113da282cb8d8"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mutationContext.ts"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe0b73f2ce93b4f0c670d01fc09db566cc5b6bc64ff1c62e527cea1b1c7955cc"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mutationContext.ts"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"55b3fe33d70c58b8dd909e1af4cd9ac6b3de7b2bde3cb525773b79f037aa29cd"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mutationContext.ts"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d90199242c2a5f62220764b67c686675bdd989ed5dbe8c50f9adb4b5658a98e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mutationContext.ts"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"00262f7903af8be571b58bfc85a24797090087eff1c36c8262c9fe4d6af665dd"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/mutationContext.ts"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddfba1271883da21f176370513357bd364db09818d00ea8aedbcf3162e59b943"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/layerMutationController.ts"},"region":{"startLine":467}}}],"partialFingerprints":{"codehealthFindingId/v1":"61cafb343eba1552fe29dd9745d3a9e29ee54ec33ca72f308c19fc292980efcd"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/historyController.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c29af63b123ba1eddb3e00312aeb116a89eb6595f95cd5e9833e1ed5a63bbfc"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/historyController.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"e240e201e795111c7a227184726484a03d382510609b359a54eb87257ae03aa9"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/historyController.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe02e94fb6e0a7a221b69f7fbec24964d4290c21275f97ddbd1962a2ea504758"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/editingController.ts"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"68cc89c582cc7eaea5536aefc9eefa5e59336ed50d38d370fbeca3a8023ab597"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/controllers/cropLayerController.ts"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ec4dd64fecdab5d1ce58cdc7b7409583f4228a23f8d1bf9d0af4f5b22444858"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/document/bitmapStore.ts"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"7570ea55c4a0b9339b02ff406da4fb5a0c923db2c9e9ca44886c24de1904c43a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/history/history.ts"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"82d77274ecb6fbd9f393f9ea6b1889ee9ab50b0ab014719be423c9cb533753ea"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/history/history.ts"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a7e77f8262907c8cfe32ca29634fad5efa9c809debc9a18d7c7d8c11ca385db"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/layerCache.ts"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"b55f59060da83d24cb312b265e404788b18b468b1dff6710fca4cebfec2e8c5c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.then(\u2026, () =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-engine/render/fontLoader.ts"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"7818373d79afbba886c52e32ac5009457d3ee16eee5770f0c3e5c8210a8fd865"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/selectObjectSession.ts"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"60c55021706f2b3de97caa648407cfdab543c14ff4ec1d9b37177a0e0d704523"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/operationController.ts"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecbe6fae48360817265c01444883dcee7e3551c59171e7736b6c6eb241ca5d99"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/operationController.ts"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"40565b1807ed9b110ee99b920ea9b8e17a53224b874d5c44d2f5ea2a2db1dd5c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/filterPreferences.ts"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"b89dcbf471ead8494b8245e150349ca72a61466d68f05b28d8f7d6dd014987e7"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/canvas-operations/filterOperationSession.ts"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"e59850deaa4ed6118d9d130f4c52e68a1713c89112cb5ef9cb9b18d3b30e230f"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-map/vocabulary.ts"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e7ac96cb760f7ab8486c713ee3dc7db5497340fee797899bb6f8a1b0bfa1db6"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/image-map/imageMapStore.ts"},"region":{"startLine":493}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc92b1bca31159df6a0d960c6921ee9c8e92abc0d84b7685c63abe9ff871bc3a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/palette/recents.ts"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a504f7f2725f6e268aa664f143c42a549b5d5adeb277b29c4487b83146d7b2a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/editorSession.ts"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"570657cb439386d717d475bba532413feb391e72d26ef0fbbc927781bf117ef7"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":582}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad5b4db3ca5ce2da8d9fe85d83dc9c0213b8537e8a425440115ff2be9b9d9fa8"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":2966}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4f6032f9e2d2d20f2853f6cbf8c2394bb7334ce33c016ce22e907addc199cd3"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":3718}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b26c1cfd09e913b4b218dc70d783484d921e9312a1a2991956580b8a0707827"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/durableSyncedPersistence.ts"},"region":{"startLine":3737}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dc8098c945fd58dc66f87fb622342f499d2082e1df947bef578d50871873e68"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/covers.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a649427fc63c6c0b7092cd31b50eae40c31d30421434a852e549dbda2d331c2"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/covers.ts"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"b603a5f11d495b516a418ec8f73cac3f20c7ecce0b4c6e46c65cb24f7fc90a81"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/api.ts"},"region":{"startLine":475}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cd76544b704df2585ee878cab4bbe9bf23bd56e105fc1bf6525714405d11246"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/restoreProjectMedia.ts"},"region":{"startLine":472}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d59977125484908d79f6a16116655b2512dd092c60214f5a00cb527ebb4ccec"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/fonts.ts"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9f673a08f891b5c91eb181028414e00858b8bab05a0bac2e2d9238c30bdc491"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/assetTransport.ts"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"226b9c793f117186c8c536c5704633780c0b4893482f46d6bcc176d839c0e0f4"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/projects/invk/assetTransport.ts"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1a079660d0a3409e981cb36c38cfb77e6b7aa0efc64cc7d03bc5c86f30cc139"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/queue-integration/queueRunJournal.ts"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"601e4835365257987361aae936665a860c4ae5f02ed197c9612f960deacd1111"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/store.ts"},"region":{"startLine":692}}}],"partialFingerprints":{"codehealthFindingId/v1":"675be2d562348d26f5f121418dcd9d1a991f19ef7f9d69869ec0e2282fd39100"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/settings/clearWorkspaceData.ts"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"9122a0f37caf39f797df2eb4b533fe851f9f84b949edf47933801339ba94e756"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widget-frame/FloatingWidgetWindow.tsx"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bd5083c9a26a0304cd09567cb7212069f6f42d89e11d92ed76d53fd9d91efbb"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/toolFamilyStore.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"5faea1b3f1a64bc858ead79c325d233cd2b5ea739314d7525bc86bdc3ede6376"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/ToolStripFlyout.tsx"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"c356da6fd0356c66084892abbcc38e6bbe2b456e6de409a55763439d5ac0b327"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-presentation/propertyGroupStore.ts"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb8aab47b8d8202998e38c5150d0280b3c246f9d90a0dfbf2bcc22dd9a2d066a"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-presentation/propertyGroupStore.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"523fb4db02ede84e752a54d8a0f1907ccbac2bcd02f2afc80a6162486be415f7"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/image-map/useSelectMapImage.ts"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"daa8ada49c37b4e2959e330b9938b1c865040810941c91d5fe22ee7f7bc0bbb0"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/image-map/useSelectMapImage.ts"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd9cebdefd027c4c1d41d1c4175be348c3f397f0e0b9bd01cff4eca3aa86f0e2"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/image-map/ImageMapPlot.tsx"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d8b21d3fb1cc46c75648cc5bee2a51ea4eda99f410ad8979ead9fda55c7df5f"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/useLayerSelectionCommands.ts"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"19fb2e2c7829f2709e6cf6970f468b60656b56e2aa2ff07d9988abf86ec85e40"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/runLayerWorkflow.ts"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"a28a65bf1e0ba484b8bb86efc23ed3415a7c48f07a7b38443cec3d5abcfbc877"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerGroupContextMenu.tsx"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a47b36e0127faf8193a10603a2f88061a05f0caf82c0e60826b8bdba07dbfb9"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/layers/LayerContextMenu.tsx"},"region":{"startLine":383}}}],"partialFingerprints":{"codehealthFindingId/v1":"a879e46bdd1d31e155859a8ee8e15ceb52e1fd3950186c5676fb8f1aea31de3f"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/loupeGestures.ts"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"298e49de22cbd37d0520e63963a1de6ae13cf44801cac95d4db264dc48f39503"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewSwipeNeighbor.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"deae391110a2eeea56507501fec673410542c5abc47a8707103251c2e2accb1c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx"},"region":{"startLine":539}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ae05f8b2761b721f7391171c33873ffa725b3ae5af0a114ecddeb2f613f1b04"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx"},"region":{"startLine":631}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe6878335caae5ff450cea47f2faac282eec7fd12ce5ad3c60dc2272d67151b8"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx"},"region":{"startLine":686}}}],"partialFingerprints":{"codehealthFindingId/v1":"91682cc1d981e4f99ca37e5b29cce890c037d22fab9cf3cad0337f088e2b3adb"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv2/src/workbench/widgets/preview/PreviewFrame.tsx"},"region":{"startLine":821}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fe392c2f1f9dd029fa0f248cd3ea75c9c57237171366bd4161b2d135cc2f72d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060except Exception\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/calibrate_qwen_vae_working_memory.py"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cbe91c36acebb95d6d422bd8b28d1b2e84cd76a66c6e960e1dccce37dae03ce"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 135 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api_app.py"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0a77b03a62cdafc8644f24124a098c0f0bac628d1c4f77e5fc8d5d5cbe7ea97"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 848 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api_app.py"},"region":{"startLine":848}}}],"partialFingerprints":{"codehealthFindingId/v1":"58a35fc8cd4d16a4748e9ec88351cd66cd65e249dc4f6f7c813be91a3d845371"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 69 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/extract_metadata.py"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa3995d4891ac14cb80d7b1e1e3d62af6eb360325d95b28e500309faf6a67d99"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 118 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/extract_metadata.py"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"cab24054b41911c559c68357f3e62f1446011583217bf5a9abcfa82932a8293a"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 157 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/extract_metadata.py"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dc35ec0a648c3811542aee10e7b1ceda54a3a46b40d49cdbed99b800d776769"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 121 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/dependencies.py"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"399799842af1c74b68969b77f6120ad0aec3fa4644eb39d58cccb667cc3f5b72"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 122 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/dependencies.py"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f63006cd9966aa68441f0ac3721330c3810737676ec007e3095e795ba0bc29c"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 546 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.error(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.error(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/utilities.py"},"region":{"startLine":546}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe712f1485f67072f86242c67c99c6039e2416a151e599466131ed65681b9893"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 662 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.error(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.error(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/api/routers/utilities.py"},"region":{"startLine":662}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f324dfdd19414227aa0fb34dd00a1abafb2c66fce5bca493100da12b5883d08"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 61 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/load_custom_nodes.py"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"453308675842f8ca0cfbdab6632c8263dfe7a1c4d967327645a06738bff43ccd"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 64 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/load_custom_nodes.py"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"328f892b3ad79d0202f0d20331c8cc607ddcf21151a733958a1e18fd4c5813f2"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 75 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.error(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.error(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/load_custom_nodes.py"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"c308e6bf1d0ee487bafd2b572f7adb440126fecc5d32849a9cdafddf3d342f33"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 81 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/invocations/load_custom_nodes.py"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"903b850d2b00f3c85bb26d2809bdcffa56e40d7cec2838ea4788436a274bf526"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 52 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.error(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.error(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/events/events_fastapievents.py"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"48a99d4afacd300648e0e7503aa3b9f2193b8f559027dfa66edb8f82ea3baa13"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 597 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":597}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a6a675fb02403ec01cfa8cdb610c2c96c18dc0142d9263469c9c8aacae550cf"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 632 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":632}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e67945d7608b11ab8816829f6b29992997df21d9ea70de235ecdd157f30c188"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 821 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":821}}}],"partialFingerprints":{"codehealthFindingId/v1":"33915f11197f307e70bf91c918bbd8a5a938e68025ff4fea3f50faefcf770e64"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 924 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":924}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b48ab9cb7804671fcc35aee2bf5c6600ad63f08924abaf1adc7659ad77f6f0c"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 1028 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1028}}}],"partialFingerprints":{"codehealthFindingId/v1":"805698034b1f5f90eb0ecd1c118e8f524f688040b5f74b3d9f66f0840a78a535"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 1324 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1324}}}],"partialFingerprints":{"codehealthFindingId/v1":"605f438335c12c71f1326a15086454572c7319127b1ab8c78f51de55e118b179"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 1345 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1345}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a87962a2024960888bd5f412bbf5048f6ef3e276008e6d14105a8a2271e9d4e"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 1350 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1350}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b3564dbb27d1699e8c0386875af5d9fbd256fcf36e5c7770d7b498283981e41"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 1367 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1367}}}],"partialFingerprints":{"codehealthFindingId/v1":"58006842b73bf929952d40ecc42064276d743d3f950fd3e8005ec27137d36f9f"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060exception\u0060 at line 1378 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.exception(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.exception(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1378}}}],"partialFingerprints":{"codehealthFindingId/v1":"82693a3af1f888c7c4efe31aaee89b6d103ab5b9242a2a7441f61e7338e6922e"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 1383 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.error(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.error(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1383}}}],"partialFingerprints":{"codehealthFindingId/v1":"273ce08dc3cb4a5a44a50fe08dfc13d1bd2be4e9e45ee1eb7b7f46fd96528da1"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 1400 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1400}}}],"partialFingerprints":{"codehealthFindingId/v1":"54354e886f3a26acd1268ff3ddf1189c3132770d0faebb1b9fa9de087bfc52a8"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060exception\u0060 at line 1432 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.exception(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.exception(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1432}}}],"partialFingerprints":{"codehealthFindingId/v1":"872e12c8256ec9f95581f8c828043b28d0304f10eeea5572d22045db97c89976"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 1511 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1511}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa10137653d818887148c02290a6cda7d28aba5fa7950bb8e4a280d38fc521f0"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060exception\u0060 at line 1593 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.exception(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.exception(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1593}}}],"partialFingerprints":{"codehealthFindingId/v1":"624055c1e70cf0c3ecac8cd179aa876026fcad1b6da99ccebea9821da7b1f86d"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060exception\u0060 at line 1634 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.exception(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.exception(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1634}}}],"partialFingerprints":{"codehealthFindingId/v1":"e41c8add8eaf4d436dfe42c7ac52f39987c8f679ab9ba814b6fc0a85d45a7891"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060exception\u0060 at line 1657 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.exception(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.exception(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1657}}}],"partialFingerprints":{"codehealthFindingId/v1":"11bae8e4de9ed7fc03f461fb6c1d2618c8c2cfc231d489e49d657fc19add8479"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060exception\u0060 at line 1684 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.exception(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.exception(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1684}}}],"partialFingerprints":{"codehealthFindingId/v1":"55170bebbae1db6b7c01fb41414b4ab7931933b18ed716af6d1c699ade8ef802"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060exception\u0060 at line 1714 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.exception(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.exception(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1714}}}],"partialFingerprints":{"codehealthFindingId/v1":"339d2fb4dcc7ea77f4ae6b89b2f9c6a0fcb6185abb3bb642dbb4d5050bb32988"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 1723 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1723}}}],"partialFingerprints":{"codehealthFindingId/v1":"fff238dbce1fc462172df96ab480e133fc7ef69a660ee33cc03f002e1dcb4090"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 1852 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/image_index/image_index_default.py"},"region":{"startLine":1852}}}],"partialFingerprints":{"codehealthFindingId/v1":"58b013834758f182a1e089a8dfdb5559127da604e8d9526db20d39ab409e8a2f"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 75 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/intermediates/intermediates_measurement.py"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"3349284521fd3b579928d7d4e13fdfafdfff684846acb9829f0ae349518f2078"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 99 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/intermediates/intermediates_measurement.py"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"436f5b0e4e7ccd2a5c7fc34a6a1a96d4fe157c124ea95009b3cdd42be390d507"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 485 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.error(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.error(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/intermediates/intermediates_default.py"},"region":{"startLine":485}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa7d655589440e37d168abebe2565869919f0589f6529df61b9f1efc71799c51"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 549 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.error(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.error(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/intermediates/intermediates_default.py"},"region":{"startLine":549}}}],"partialFingerprints":{"codehealthFindingId/v1":"39afc530631f8116aa6e826f16d009a5c5d52997f1f5cb02d6b7c7e7dd9910dc"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 602 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.error(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.error(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/intermediates/intermediates_default.py"},"region":{"startLine":602}}}],"partialFingerprints":{"codehealthFindingId/v1":"57b1eddd92518ff6efa210466e8d634c0321039b9872177799b0f6c7c1d6bdf8"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 260 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/model_records/model_records_sql.py"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c39b1266fd5674c8e56c8d6301b75e8f8c18f466c1ccd02f926544ec479eb96"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 263 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/model_records/model_records_sql.py"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fc93220826a0bccb1236487305d131849e384727cafb8b66df04e35af8580c8"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 148 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/startup.py"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d6eb479c7cf68a7c6dd2a8d7a8ee74014a6f510991cda1671424e21aae6ee4c"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 105 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.error(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.error(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/session_lock.py"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fb9b1e6ecccba1ca3ba98d9eca01f625d6772e964112834baef479f29dcc316"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 108 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.error(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.error(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/session_lock.py"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5b4624b84c45b6f45b98f816d046930a43bff996c3063e2ce069fb1e6a7317b"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 141 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.error(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.error(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/session_lock.py"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"20dc0dd32f5b4c852fcae7daf7487d93c36b310ba1fb5c1d9a049d62c4de7675"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 134 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/database.py"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dbb3453b5fb7a321a297bcdac1ce021a6ee488fe86364280237ae86ecc39e67"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 167 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/database.py"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad705424b0bee3e0a7d2163cd63408e599a81107a1ccb6409b9491dc6ef55eb3"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 190 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/database.py"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"2957fc510570ba83ce8fef05fc065afb696252a84419574919e2fc4c1c434a45"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 313 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/database.py"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"c19f681b88455cff57d77322aac232366c8a7573a6cd9bf0e20842031a509182"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 339 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/database.py"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"4724f4c92ed891eb032c56bed47b63f9a2f23bd1efdc753481e972f6ecf38bc6"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 341 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.error(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.error(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/database/database.py"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"463bef7e969ab0d400d1d83f6729189df4f89fd9799e81ab060527f6f0889929"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 75 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_impl.py"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"3580f432ca7ee03eb08ecfc114136c578f8aeef164db476625c2ffe49cf74aa6"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 126 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_impl.py"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"90532d6d888eb0f4f3cd2f3a49d8db28b31c06be74d83f6b1186071a0c3eb4b3"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 158 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_impl.py"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c1f88e199585647eba9c8a8614c80fbf4d32655c27acb9682a8ce88b4b1cc03"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 170 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_impl.py"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c37544faf77b8300fb55b65cf55dc466e0c463c215d9c8fd95e2b1a3b52beda"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 366 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_impl.py"},"region":{"startLine":366}}}],"partialFingerprints":{"codehealthFindingId/v1":"044481c717fe571971ecf0bba6056f94dda48d04e7d427bc39fe825f5031d1a7"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 382 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_impl.py"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"570cbd73778bde81abe9f1653ecb0c09e333dd583fe9af35462bd11001dee805"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 388 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_impl.py"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"6942c628fb4af21f58d87b71325db9352b3b36dfabc757b185570c363dab3b19"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 433 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_impl.py"},"region":{"startLine":433}}}],"partialFingerprints":{"codehealthFindingId/v1":"37555ae4a1961c72c66c0d7323a257be9eb5d664478613e3d1836dd8128768c6"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 41 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_26.py"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"c68c4305b55b04d64ca9b0b9a5fb153a392be9632bc57a2a71a9163169250a2b"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 95 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_26.py"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c3c81fdcc872d5de37ff2de79d55a447a3ae34712a542fd5868a3958a3ce431"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 45 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_25.py"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"7710c74cdd8aeb9089bec737d22fbdaf5561d03b708b4a7397b6b91ac295d1f8"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 62 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_23.py"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"30ac5bf33f8d18be24ec560be5ec246baa50bd1e908d58a1253340ea372c3424"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 64 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_23.py"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb892540394f3b725f1780ab89b1007c0af1858d2cee8b626009b32c277442c3"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 69 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_23.py"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"d410bb9111e5f4e3b8a924e5a72a0552673a02b544f4bf00843d975f34534a67"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 72 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_10_01_add_anima_variant.py"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"948654932f31011b078a3b69330b0b446df43e0235df48b4218e90caa3f36511"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 115 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_09_30_store_embeddings_fp16.py"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"5eddb57a7acad25130f6b6b649756e08f66cc6c09970dd247236f7803072b546"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 56 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_09_23_index_client_state_references.py"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"1868265f256ac43e55ef353afc8c58722896335b2e0beede205f3df4f017687c"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 122 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_09_22_add_intermediates_management.py"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"161720f216b8f5104b07e949321d16aed42d13006d11986cd1a5a177401d642c"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 134 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_09_22_add_intermediates_management.py"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4890f0fb233640157865c9126c225acac25c4bcf5e5f7ce3805a1476f2508f5"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 56 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_09_16_add_qwen3_vl_encoder_variant.py"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0e3cca01458291b7e1b6fc2f3069f4b99b88966d904521426c351ab658f9f13"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 187 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_08_06_add_project_boards.py"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"a57f32e0c54744ed6f970ca91d3f9b497bf26e531d240aaf36908fdf898d42e0"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 252 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_08_06_add_project_boards.py"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"8caf7881928efc6f9e08b6fcbf0fa079d4a97cb3a4ca0c4c652b500051131aaa"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 115 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2.py"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"c65cf172c4c6eade5aa5bc4c1cb3c022b9e09623c48c53c1c53dc35f490436e9"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 125 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2.py"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab011971451e7c0e3d7128c07bc035ba6d6f8218d951ccbf38c08fd1d9e1af56"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 128 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2.py"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e7f1f86b91e9c5e648b66b98e620aa532e9b82fea9ebb032df32665bc34952d"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 134 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2.py"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea452fd4afc388b3cbf919fde17e6677f23ec42a01e70a3385702c978a1e709f"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 138 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2.py"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"749ae8bc358da3494c4bb55cd7f7069783cb50fb9ec33defb0147ce4aa58fb37"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 95 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/torch_cuda_allocator.py"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"d51a62f4e6b164a9febd7b3e60023f8b342decd2aac5fc67830580a6c88695f9"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 100 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/torch_cuda_allocator.py"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"813a2be1377dd85ce878578216b3f964ca9819c946ef31550fe373bc7733f019"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 128 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/torch_cuda_allocator.py"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9ea9fb169633d74360648a83d3a56ca3835ac207eaae55d508913b3ac328de8"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 42 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/ti_utils.py"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"3863034e65522927df4820b1adc46074ec344dbb602ed1628fe6f506cb04019d"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 44 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/ti_utils.py"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"30973ecbe4b44216f4597b486d9053494baf99b92d7ee3eebc68e077bcf64d67"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 46 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/ti_utils.py"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"09241992126edc8d9037d387c23181f5fe5f96c2c3bd745f8a67b21c397ad3f0"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 50 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/startup_utils.py"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"b995b474dea7ea38d5bc03d1b1ad8cf43f5974cf6cb9ddab23ca36976317e9f4"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 52 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/startup_utils.py"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1f6c5a92cb82d8030b125d75b45584317f7ff0d3f16d08f1155f3302a3ac766"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 87 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.error(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.error(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/startup_utils.py"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"59eb5345368546093af10696d675c50b0520d2baa7db16480870de6853b91987"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 101 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.error(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.error(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/startup_utils.py"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"739a39d42a19ad13156b6d74a6150020bc0553e514673abdc24b5947b097eecd"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 190 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/startup_utils.py"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8d99465e2cea100a941fb62dfee98de1399ba360994ba2b6d8e2ea19760e819"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 137 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/rocm_integrated_gpu.py"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a7aa6116b78850c60ed4e7daa0408595874f9ba5ee5349464dc06ef72145d45"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 148 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/rocm_integrated_gpu.py"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"b28990a8df9b045421372dc1d70d2bb569c3656c093fd74390bad3f8fab24e96"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 114 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/rocm_aotriton.py"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e890e77f5ff1b14882380b512e2c7b6bdd14b620783cf18412726c55c9bc82e"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 122 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/rocm_aotriton.py"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"d73fec3a8f5e7f1383bc01a7898a2806d2e0fce76256dff84d7a4c5b0e8b975a"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 133 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/rocm_aotriton.py"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8a0533833abe7f412b0674540241be3e307a45d096f47b0482badb08cf8e3ae"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 135 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/rocm_aotriton.py"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"fab6fd70274122b96f73ee0989f5729bafc9afa518e1317d5b68245ef4b67e44"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 52 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/profiler.py"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"aac437daef52010961c733c76c4cb73cf1962cd883e7228f88aa0dbc696de393"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 63 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/app/util/profiler.py"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"24f3b7e80072f8246fdd400a5911234869fc54c24c228a7ca307dcf57adb48a6"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 86 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/safety_checker.py"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"f45705ba62accb9cdc302bb974423025636691c127af617c512c057da7727533"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 88 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/safety_checker.py"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"e114852753b415d62d32626f8f0ecf73e2a20a9ef7119227ddcbf1781b6da99e"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 22 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/invisible_watermark.py"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d151596bb7e4f37394778e694fc68e41cb49794d22d78bc7b9816f2a4545d5e"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 51 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/image_util/infill_methods/lama.py"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e08a2cfc2991eaa949fb1c53551240d05bde6add1790f4b518c42843f37b36a"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 256 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/factory.py"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"b89c2b9449df0dfbf10e489fb1af386d0a974013313eecb40e0135054a8af849"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 302 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/configs/factory.py"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"84164bebef6930dd7f1490ba08545de4f48d298fbeaf0b9990b86076f66c0e50"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 84 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_util.py"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"d85ba588d1a7e55480a7b924eaf3a93c08f80869d95b377f792640f31e7531ae"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 168 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/load_default.py"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"57a3a8ce6bc2617344130ae87e200398c77a6d44e35298e4c5aa1588b46aa060"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 429 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/load_default.py"},"region":{"startLine":429}}}],"partialFingerprints":{"codehealthFindingId/v1":"44e0a1f551ca3bfdef9b0770b07d8f33f1127e628bac3db24c0709025d331848"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 548 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/load_default.py"},"region":{"startLine":548}}}],"partialFingerprints":{"codehealthFindingId/v1":"913bd7c64ba2d7bc6dd79e320043bb7f8232f155387c2e17902b2c3bd1551e6b"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 609 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/load_default.py"},"region":{"startLine":609}}}],"partialFingerprints":{"codehealthFindingId/v1":"73fe17746afb457cae82dcf2a4d0a52ba95d391878ac247292502e402acc4a73"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 656 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/load_default.py"},"region":{"startLine":656}}}],"partialFingerprints":{"codehealthFindingId/v1":"59981445de3a5f06046c565fbcc9009ae56587b874e177725260bae604c9eda5"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 871 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/load_default.py"},"region":{"startLine":871}}}],"partialFingerprints":{"codehealthFindingId/v1":"89f25193c98c2505c43661dcc3a0cc4c2649b8bde77712bff4adec017954d2ad"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 876 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/load_default.py"},"region":{"startLine":876}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb5c6fbb225c07ac3a91202a940d3730e71e57b6305dbe7d4e68db0daf223f7d"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 933 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/load_default.py"},"region":{"startLine":933}}}],"partialFingerprints":{"codehealthFindingId/v1":"34282b9946a54fb9adc01fc4c0e159314137c3add9d4052c43f11c284bffc0fb"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 216 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/load_base.py"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"073151c73fc9bb94593e6aec01cf89f2d512591ba528ad7ad794d9841133f176"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 775 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":775}}}],"partialFingerprints":{"codehealthFindingId/v1":"4beb57525c51f58d365d2704b44b9fe3cb203bc9e4aba3f308bcfd03753a19c4"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 790 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":790}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ca862cf4a83757d18cfaec7c5b5bb185ecca5cd2a607f7628918d07444a8e4c"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 800 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":800}}}],"partialFingerprints":{"codehealthFindingId/v1":"f17066fae8e7a96d090feadf2e62f5a4023168a926284af0baf267f3dbc72c86"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 810 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":810}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe228c9539feef6445e95584fca88455dce463e92f665397ed2946dcbe7486d4"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 959 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":959}}}],"partialFingerprints":{"codehealthFindingId/v1":"94d5bc598879099972f53e21b61f3374d953d72023862450a56f0e003bb89d82"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 1016 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":1016}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad65b61c5ea1d2162c49dc64c8720d45530ca209f623af043bdba1357fbd2b7f"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 1050 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":1050}}}],"partialFingerprints":{"codehealthFindingId/v1":"e89d7ae941d74e28779a524a6c8dc04500356a05c7040956ba0533f997960b7b"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 1174 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":1174}}}],"partialFingerprints":{"codehealthFindingId/v1":"216d32d3989bd67555b6db77edc879707cda5ec171df365e59e9a6ac060d8167"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 1595 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":1595}}}],"partialFingerprints":{"codehealthFindingId/v1":"58f93393894aadc6be2af9594350d44e05246f643860b6dda027a7e9c0b0e149"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 1810 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":1810}}}],"partialFingerprints":{"codehealthFindingId/v1":"414ebb554974179fce0538a0740c39efd44acb7e5cade0d0cddfe102f95e4e50"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 1834 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":1834}}}],"partialFingerprints":{"codehealthFindingId/v1":"83cbc1257a1e3dce3693cafaed291fc2079ef44705c89e59fb0ee6cc8b077db4"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 1899 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":1899}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd1524e5a01748c288bdab5b96b735cee5fdd3016d3335850b6e7a22d9a70046"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 1926 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":1926}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee23fbc20fd2ec8b4b4d84b9a09bc1da70b783d8501122bfcc87fbadbcace47e"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 1938 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":1938}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8432b4fd2a8f10f2640acb6565ef7941bba8b907ac9d7db095892653aa5e962"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 1951 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":1951}}}],"partialFingerprints":{"codehealthFindingId/v1":"68d818aac7cc2966c406efbe7f41f95efbf271ea68150ff97bce1e0005c5bb03"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 1956 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":1956}}}],"partialFingerprints":{"codehealthFindingId/v1":"dac012c4b1220033021d9928e19483e6d5800eb8899bb075b31c7c471f8eea13"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 1964 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":1964}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccd1be5ebe27aacffc9345cbbc8bcabea37d7135d309f19712bcbb9ef4b4916f"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 2002 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2002}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a6e647f97e26df4b7fff14ed8d11eb308861c6a304b5dc21c94b6f57d5bd221"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 2032 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2032}}}],"partialFingerprints":{"codehealthFindingId/v1":"0036dc9b6b85fc34ba86b0a6902c2f9c39bfd5bfdcf5e66f9d0cd010b32b43ca"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 2040 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2040}}}],"partialFingerprints":{"codehealthFindingId/v1":"94281ecc2c8e658caf8ad39f8a21ad56bf00d7c3e99cdaa697bc4a0f01351ec6"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 2074 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2074}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a21041e5d99dd57b8d2b0fa1c919124a6c20aef228c8fe00a886364d22e8467"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 2106 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2106}}}],"partialFingerprints":{"codehealthFindingId/v1":"36562130d94e46bcaeace592578c101b049493073fef916015d831d48ff0d8cc"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 2115 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2115}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1c02317696186697b0c985803b57508a5c08289fffb2f8d392936aaf82625ea"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 2119 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2119}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fd3127c286b0e99016e1980106ca5a2401accbee3c43f16019857a053a478a7"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 2128 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2128}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4c7d9c4375a8584ae056f8488a17539b92b3e4ef997cd4eaa434caa2b06c54a"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 2148 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2148}}}],"partialFingerprints":{"codehealthFindingId/v1":"a771e12bee283a6b4338b800b42baeb90a893e3b5bc1832cbec585a23b2777f1"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 2164 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2164}}}],"partialFingerprints":{"codehealthFindingId/v1":"eff3fdb0add624f287363037fe1d7e1f5a633411f5400134d7e09b91032b8ad4"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 2194 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2194}}}],"partialFingerprints":{"codehealthFindingId/v1":"d97b8549d02fb886c7588d0e49d87921de4ce34f8e2c08d188a60f9284371800"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 2197 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2197}}}],"partialFingerprints":{"codehealthFindingId/v1":"78f09216f52bd483e919dbedada9aa303563343ceffbf8a2e7702da37f43e9a4"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 2244 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2244}}}],"partialFingerprints":{"codehealthFindingId/v1":"944f468d2b83072f4b38a9a99559d982731476d21ca26c2c06ba15cfc3f71246"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 2464 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2464}}}],"partialFingerprints":{"codehealthFindingId/v1":"e20fed09f85c1bef9e8971c3d66622ab443067801f5604b934670e0982c32e63"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 2534 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2534}}}],"partialFingerprints":{"codehealthFindingId/v1":"67c4b276ab0f0f483dad496cf2cf88d972f56cc576c889b28472a82e1f7e503d"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 2608 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2608}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee9246878e02461bfe38a33a48cfe6f93f89c61cd3f54a92885e3d6eb1b22f12"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 2637 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2637}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5de6a39c8b6b0bf799a1e893a72b01e4afeeb0a047d49439e84211e1aa3df22"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 2742 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2742}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ca135429fd8da0d259dd89977947b77e282a17bc58fb1a0de719749d5673352"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 2775 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2775}}}],"partialFingerprints":{"codehealthFindingId/v1":"9aefc1ab70bf3677e7b0d75492cc8be96abf9b93c782dec2860ce9944cffef56"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 2838 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2838}}}],"partialFingerprints":{"codehealthFindingId/v1":"74af905019c7ee44356d761f7dbee2b3b122b6e2f824a2944ffd4f730bb13628"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 2871 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2871}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f456df12aef85b049bba1b5c268a270e773eee8c14feec27b8121c78d770345"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 2958 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2958}}}],"partialFingerprints":{"codehealthFindingId/v1":"31ef85c525b280045dfb02e69454ab0151b2da8660d709aca7a7a8cdaf826747"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 50 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/util/lora_metadata_extractor.py"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ec41ee92f077f82f0cd13c976f19c580b16ac92e18bddca20e1577c50f19b4e"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 66 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/util/lora_metadata_extractor.py"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b736ab0e82c275012bb51f8dc21f98ced477f59217a25b6983e1dbf0ebccda0"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 70 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/util/lora_metadata_extractor.py"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"72a22649111b28f58f67aff08d88ed90fbfc76d9c549d4c28c427f44e09fb42b"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 94 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/util/lora_metadata_extractor.py"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"7de2b724a236b75dd2358c7cbeeb149aa8101bf0a8518db3eda3bff27fac1756"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 99 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/model_manager/util/lora_metadata_extractor.py"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"f25bc361f5a3c0497011034f8c66f2b1d5df2ab8d78a297ec7c236f5207aea91"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 82 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/patches/layers/lora_layer_base.py"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba7f5775be42740b002ca914d2c964410a59d44413b8d5ab7bac6d6885e964bc"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 128 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/models/pixeldit_model.py"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"2eb0e024a3835bda8aab3aeb3e3b192f2947e9136196cc357f8e4dc7cb560910"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 149 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/models/pixeldit_model.py"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfd6ae213a6df2490bcef09117edf616050b299dacb20838176eb93f8aafaeb9"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 167 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/models/pixeldit_model.py"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"283cd619dd33a85e61c523072e5283cdebd5167c5746d89e9ecd0f92149ab3f9"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 109 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/models/pid_distill_model.py"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"83658c246f0a7c33690497c0e5de8b07616373109c917129f6fc71b3b2c7b553"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 308 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/models/pid_distill_model.py"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a81ca464624ad4a9c438eb7657cd88e38918ff3c6b8c2207ff3e5ef58b27cfa"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 310 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/models/pid_distill_model.py"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"872d0a77b47f105c59f721d0009fefc0b4cf3ca79f1f4b8b4b83d687dd70ea52"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 312 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/pid/_src/models/pid_distill_model.py"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e6223019a8fa4e193ffcbdbd011c5856800be5cc071267d4f303d5ca2c29336"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 96 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/fp8_scaled.py"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"701746de7f1aa5b2bb66afa65fcd9b71764e5aebeb0168ac802fcd2988d0c301"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 709 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/fp8_scaled.py"},"region":{"startLine":709}}}],"partialFingerprints":{"codehealthFindingId/v1":"2380b0121f296f1c1030bbeefb024cfbec18a03a8b802f1071f04cdc33a9239c"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 329 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/sdnq/sdnq_tensor.py"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"493dfda95aac9baa380d5ae67445fc97a78fbb93f08e735880d801d113be5484"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 336 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/sdnq/sdnq_tensor.py"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"edf2fab8cf6267651f871547509bfc555513a08e2b77d91c353c82e081d02346"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 398 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/sdnq/sdnq_tensor.py"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ec6c27e4c3a79079f6032bffb966fb9f06f83e75860b69acd7d67af61fe5b5a"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warning\u0060 at line 416 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.warning(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.warning(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/sdnq/sdnq_tensor.py"},"region":{"startLine":416}}}],"partialFingerprints":{"codehealthFindingId/v1":"e344cfe329f3611011524719f589604d176715c0cf20c08bf1f44154b9acb1bd"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 319 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.debug(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.debug(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/sdnq/loaders.py"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"910194c7ea99a2e3483b584f751325996aaafd3394bf1ba63938416cf591274d"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 371 is handed an f-string as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the record is filtered out. Pass the values beside a constant message instead: \u0060logger.info(\u0022order %s moved to %s\u0022, order_id, status)\u0060 with the standard library\u0027s \u0060logging\u0060, which keeps the message and its arguments apart on the record, or \u0060log.info(\u0022order moved\u0022, order_id=order_id, status=status)\u0060 with structlog."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/backend/quantization/sdnq/loaders.py"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"91b651c8d9f5a11846e32ef4b81c035f0ed47ce5126d9b25a5f86cf31d30108d"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 193 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/store.ts"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ea43344b67f640a51ccd09802ae4207dc21dce344fb913583a970e297e00243"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 203 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/store.ts"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"199a83ead0cee4628e3435a25bacf57af05885f0d3aa73cd818a6ae95f035a25"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 144 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/enhancers/reduxRemember/driver.ts"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb1bf6a2edc13ab904eeebd8411723782ec37d556daba1deb7900ca7e59b1ecc"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 158 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/enhancers/reduxRemember/driver.ts"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"e533030d7f2be3371bc7b9e2ddfa2bb81e679b0beae11392fa258793f5420ca6"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 164 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/enhancers/reduxRemember/driver.ts"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"94346da9b8a34e83d42036c93e64dcbd859d9ea7b4973a84e2362941c0fed806"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 87 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.info({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.info(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"87847de96fb73fbfadf08451907ed55ee97afd0da7759372bf6114f252d55ab2"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 23 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/app/store/middleware/listenerMiddleware/listeners/getOpenAPISchema.ts"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"40781ff98abfbbb63da763faf8269e1c71c9268fd44952bde9ad613ac91ead22"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 78 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/common/hooks/focus.ts"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe263f3c6c311c15ac41e01c98cea1a1f7feb43263f565a281a0b506b47d8baf"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 425 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/CanvasWorkflowIntegration/WorkflowFieldRenderer.tsx"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"62664a7c846a51c266330c9a559695fa77a0da91c215aa5a70586618ee8b2c34"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 59 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/components/StagingArea/StagingAreaItemsList.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc7a570649599426703c4d7fd2e520537bb10c1cb1214f649e2b85b71a229ef2"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 45 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useExportCanvasToPSD.ts"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8fcef7040076b4bf4fd190d63057330903b911e10ed7c96d949e6caefe92ffa"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 69 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useExportCanvasToPSD.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"aae5e41e4f413de02cf709ed88fb74aab59438518cb46d8d2f300523b35457ce"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 103 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useExportCanvasToPSD.ts"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee0ed1cf0018e98d5e0d80b31c28eb549aa20d7f85dd593c898f9d34167e3a53"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 83 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectSave.ts"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb7437e8bacf6f490a7e221dc6298c7b2b5420cdf90aa93c0ac6f8e27be2998f"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 89 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectSave.ts"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fa38f2680c8f451ae0e91df433301808b710cfde86f6184a385d7417c41298a"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 82 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectLoad.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4a3287c0fbb399aca348bc3172881613c56ea67e87b00683299748cbd113b34"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 101 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/hooks/useCanvasProjectLoad.ts"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffa1c9eb1d15a61bafbbf21f4d77560cb4fe0cd5a853dd42017f4b7e334b50db"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 1087 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.error({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.error(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts"},"region":{"startLine":1087}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdaddb07b8d56bc3075b315746737402da074b21cd2db32598eaf907a68073b3"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 1296 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasSegmentAnythingModule.ts"},"region":{"startLine":1296}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f10bebf924961315b44d3df47abf14b954c5b4aec1936591f526fca1b71d2da"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 168 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.error({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.error(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"805bcff2e77da1feb2510d21892f2266fa0f575f49015ecb2fa2596c91acbd41"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 410 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityFilterer.ts"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c58223a8fae3ca9cf0c6a9a8c7a658d2cafbd782221164b009eab392ee3ee38"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 334 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"64070e40dd38393aa7587c7632036ddc555f43ba32903e83b857677b876f2593"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 345 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/konva/CanvasEntity/CanvasEntityAdapterBase.ts"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"e23e30b9c9e1dc13b7eed2fd00b1f04e3cd243201eca581f5761121606b6a12f"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 1254 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/controlLayers/store/paramsSlice.ts"},"region":{"startLine":1254}}}],"partialFingerprints":{"codehealthFindingId/v1":"55879ad608902d5b9a2dc19ee9f21ba2df4a51da505f0dfc1cb5d46e75ef04a7"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 62 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/scrollIntoView.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"725489a359c3241e10da2a28d545ce60968ff8b83c1eeecd3a836d05cbca8e21"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 124 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/context.tsx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9566ae1572d8db6d0fedca409fd9ba01aad7ff0381dd3ba256ece996912dafb"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 164 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/gallery/components/ImageViewer/context.tsx"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bfb43a36014923d90377faf32e0c7621dddd7ad5d43644738d5388eb52c8fe2"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 140 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.info({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.info(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"12b6bcc405ea67af5f81626fbdf66c7fb0e87e1b029ff077898647ba5427e5e1"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 199 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.info({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.info(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2872063a0751f88a19a1f1878d5f0a28e655592aaeb2b532f23f7a78ecb16ef"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 131 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeCopyPaste.ts"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"e10da7ce59d7cefb8ccda503a747202b08db6ec64d2520dd2018f9548bce9af0"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 143 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeCopyPaste.ts"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"e339aaace184247ac09f3f828a8930479f83fb1f8147f90acf75c296d7de44b1"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 161 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/hooks/useNodeCopyPaste.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba5d9d7f5261d80e4fe1460d7f6591dc6e94ab8bcb7dba09f24c89a1706e6f02"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 87 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/graph/generation/addWanLoRAs.ts"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"995f197272760f665b4d0f402db4c8ad50fedbeb58da05f4cbf5b544486c014e"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 70 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/workflow/graphToWorkflow.ts"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cd6ff7a687857690066444e9dab2bd48a7e4f94bf027706b32139b835469b08"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 91 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/nodes/util/workflow/graphToWorkflow.ts"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"3eee4d5e2986479171fa123ddd67fe581048b5cb7fd694aae83cfd2000b73e7f"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 194 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"56e27a573da27bd3efaa2fb5b6996b04da194050e40a8e153e6ed40ad94924bf"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 198 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0a8f9baa6e559fc3675929930d4af0e29a91a500b281d3e1cfa47b70ef00285"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 227 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"95f7ecd3c5b0464e495a650d5d8fe00fbc9c5f4f34b6fff02d6295c17d6ad2d0"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 231 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6506ebd71ee1830a64151741282e6e849329afd7359de396790f1693fad0c74"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 259 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b979f766c33af832bfc1a04524a6194f894938682bda3c7af1211a97579b96b"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 261 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.error({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.error(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"40e1ee257cd95cc1578c25135a26dfe60fb651ef8a73e51c10027de9fb225cef"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 268 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d6606dab0771130120b8f3cbbb843ee41e9d310eded4ba3e570222a805e5ebe"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 296 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"88e41b894c5cd02dceb8882673163aa1aa875950f018ab612e735e8b8f0a3a3c"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 412 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.error({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.error(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":412}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b6565a6e3f70401cc5c064022bb191382f1aa77fa54b8389b9f96fd64c1cd53"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 422 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b8f5508d68ecccdb1e316c55985e48e45603cd2ad53c908de1edd4944774951"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 426 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.error({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.error(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":426}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6c1afbb591121ceb01cd55cb76696cb995e08832a8615ebe95e0ea3aabf6361"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 503 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcd5e302fa77210958b489dbfb897dc87537da497043cdbd81915503970722f7"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 532 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":532}}}],"partialFingerprints":{"codehealthFindingId/v1":"14ac051fbd76b5f629359cb024bc15bdbc9664934bcabdb94ee227252d7abb7a"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 565 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":565}}}],"partialFingerprints":{"codehealthFindingId/v1":"f968c4acc1402472bc4a8fedd6e0466abcd14293a7bf59cec422c4a90b1b33e7"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 594 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f7661968343d622b182ce1da36d5ccdac2923651712e507413acfca7eae5797"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 630 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":630}}}],"partialFingerprints":{"codehealthFindingId/v1":"b21dc4d73188f300b54709beea68859d8062c9906d229183402792e885db6e79"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 670 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":670}}}],"partialFingerprints":{"codehealthFindingId/v1":"f637c286266001e41be191e370a01a7b82b7ba54d9cedb05e0b504fb38bc614b"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 829 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.error({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.error(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":829}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca35308645e16165a61440b5fef9a9f912762d9f16f7fdd5f845ace1e97ed90c"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 834 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/features/ui/layouts/navigation-api.ts"},"region":{"startLine":834}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5e1b718657c7fd27c46ffed5be21d3d4e6be1d75b6cf89fe93032862f503fa1"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 93 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"78ce986ab0b7302eaec7a721295856f8609d0928938d6e3e673bbed105611510"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 221 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bc38b071b928bc03bd1212a1c388069e7353095d115e8ced7c0dddb9fa01dc4"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 225 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbe572bbc7cfed520a1518c30553f28266b7629dde6f669ef3f17bd10a545f7d"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 231 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2f5f7a29b120bdedbca7d6cfc93847870be2a645452b56660f2ac7c04804c03"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 235 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3da181a671eaafa9e7d0e0065b60ef5ea2e54a18d3f536b2c06d1f0a05cf36b"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 257 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a4c8159895552305d0ae12eca2e362bf62b77c6eb07e1b8de98ae48bd755a44"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 261 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.error({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.error(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f5117f84ad3188df276cadbf95fdf53075d0fa2b1511d4397c23b97d54b10cc"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 588 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":588}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f7901ee04a45dbafb86ae75a7ec36a6f519f04149dd0ac447f982ad5e1127ee"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 590 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":590}}}],"partialFingerprints":{"codehealthFindingId/v1":"e94986ebac82851fece401dc097633469341b2cd715dc2666c6af16622c4aa9a"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 594 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.error({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.error(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"9155d076b368629e65f56156dc4f90a451e808c0af444be1fbd1b6e1ca5a4b57"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 600 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.info({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.info(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":600}}}],"partialFingerprints":{"codehealthFindingId/v1":"6db1fc1e3152d604b5398f7ddcc882882ae8a4cba0d5484865da5afd83aa7f63"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 605 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":605}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bd5ff52f679526b6f084bea25770a7f31f9e0782fc2e62aa49bcc6d47b8ca75"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 630 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":630}}}],"partialFingerprints":{"codehealthFindingId/v1":"1130a7fb43f15d236d3277e535a8067b14cd40a019bd897d996155cbfcdca405"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 632 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":632}}}],"partialFingerprints":{"codehealthFindingId/v1":"32b1399d75fcad85809b0ded032a2dbae5296ddab44190d728c696b51d53077d"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 636 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.error({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.error(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":636}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f8265a74803f31d7cb527ec6adf2da6eb9d343c61c2d89af423a23aa4b6f789"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 640 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.info({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.info(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":640}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fa6288dbe948a62485a58301ceec95956b7651560a9d6d496acffb4e8c73939"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 645 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":645}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0e17ce6e2fb911a6c3615dc56bec5531f409a83d79fe4ffbae9bc32cd6f690b"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 694 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":694}}}],"partialFingerprints":{"codehealthFindingId/v1":"00386cb0a7647fd85baa945abcf43378cad3a0d42ad125aed8ff0a1ed5305750"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 698 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":698}}}],"partialFingerprints":{"codehealthFindingId/v1":"1102791d98e8fc93ba4a296f294be3c1c99c830a8ee3407f93a4104a63858c82"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 703 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":703}}}],"partialFingerprints":{"codehealthFindingId/v1":"18cb833015c49e3300bcc93d50c9b190f177f33e099f6cea9bcfc0806cb77ced"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 731 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":731}}}],"partialFingerprints":{"codehealthFindingId/v1":"bde708d486faa64db0f83673cbb40ef583c622d44e51c01e9162973478aebca6"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 735 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.info({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.info(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":735}}}],"partialFingerprints":{"codehealthFindingId/v1":"616afdbf037c336516c3aab2de6cd67dd961f685b3267afdc1f8d2c0e218fa78"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 739 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.error({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.error(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":739}}}],"partialFingerprints":{"codehealthFindingId/v1":"762d9b05c5dd3889d3b669e2ee0a076da002a6a85615645bdb6cc5f76c2f6505"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 744 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.info({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.info(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":744}}}],"partialFingerprints":{"codehealthFindingId/v1":"af3d9aba1e06779f841cbda670ab1a443bb49897b37240a24c9643365965dec8"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 781 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":781}}}],"partialFingerprints":{"codehealthFindingId/v1":"01cc0e813636d723e45056affb53302633d42187383ffa910acab1609f0d212f"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 797 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":797}}}],"partialFingerprints":{"codehealthFindingId/v1":"84603c828087026047b3bfe7c62750ea8a829ddfb38254c766bbb3bb9be0bc1e"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 853 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":853}}}],"partialFingerprints":{"codehealthFindingId/v1":"14ddf15cbbefd2996c5edad94254ef32365945ab41f4df0980d84bd08c7d61b8"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 855 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":855}}}],"partialFingerprints":{"codehealthFindingId/v1":"59b32b9a5319c9bbd15f1e309942913d0b3c5b8244679f9e00d0ee6a93c00673"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 860 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":860}}}],"partialFingerprints":{"codehealthFindingId/v1":"b533b9d6de4df81b6890d8906fbfdadde57abdac85a746bd4115f0bb96035ff4"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 867 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.error({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.error(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":867}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e55d26245e3d19548995612c86d0386d4851d08bc3a399076dd2a266d889979"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 881 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":881}}}],"partialFingerprints":{"codehealthFindingId/v1":"41a4b2c26ea60821e58edba2dec4729117806e60a2b1096761d35f61abf57f16"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 892 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":892}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad6a2f4c033d6c796b1183cd9c3bb01a4d4e37a5b22ce211c24d40233051b17e"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 927 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.info({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.info(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":927}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ee6ce272a4a21af4f68a42b49dfd55a89a39eec4e1ab8206fc4bd48eaa7f4c8"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 935 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.info({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.info(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/setEventListeners.tsx"},"region":{"startLine":935}}}],"partialFingerprints":{"codehealthFindingId/v1":"32aea6ba451d62ef0bada183434ea4ea712d97ea5ee8d1aa2bf6d92a6760e7e2"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 48 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onQueueItemStatusChanged.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0e0dff2cb40c2db72f5faa96e5c869aa47e87c195b95546a15c4f33aac00c36"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 160 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onQueueItemStatusChanged.tsx"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d664cb40f07efa27d469b4d5bd7c9a5151fc745762ceb2b57e9bc9466f9da3a"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 127 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9d384c2e567a4c642f0dce977e98b57f37a23f74e6ec8308a42ea5a42a0a43a"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 534 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0a28469eeffd15d4499ee2ff44c1fe33bca6feb97ac85cf8dcd57d85b05363c"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060error\u0060 at line 562 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.error({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.error(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx"},"region":{"startLine":562}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a2f69f25b929c484539836148049a44799cd00ece5f1ebf6e14d7a8c671b271"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 633 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.warn({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.warn(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx"},"region":{"startLine":633}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab701d813ed8ea84896fa0c701c73d0c18b7693a3fd43cbed6167c1cd270a340"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 659 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.debug({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.debug(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx"},"region":{"startLine":659}}}],"partialFingerprints":{"codehealthFindingId/v1":"07712c5c6f25254fe419c5d9757b834aa66e0f58a44f417ec079a5b43638f2a3"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 663 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx"},"region":{"startLine":663}}}],"partialFingerprints":{"codehealthFindingId/v1":"f68ab7ea1fd8513c9279baadd54dc1415bea70a596b906b1dcaaba89bf6c2d13"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060trace\u0060 at line 761 is handed a template literal with \u0060${\u2026}\u0060 substitutions as its message, so the logger receives one finished string \u2014 the values in it cannot be queried, filtered or aggregated as fields, and every occurrence reads as a different message. Pass the values beside a constant message instead: \u0060logger.trace({ orderId, status }, \u0027order status updated\u0027)\u0060 for pino and bunyan, \u0060logger.trace(\u0027order status updated\u0027, { orderId, status })\u0060 for winston. If these calls go through a NestJS \u0060Logger\u0060 routed into pino, nestjs-pino forwards an object first argument as fields in the same way."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"invokeai/frontend/webv1/src/services/events/onInvocationComplete.tsx"},"region":{"startLine":761}}}],"partialFingerprints":{"codehealthFindingId/v1":"10f82b39dc79c3f2a8297f3f150a4c6c152c5c1784ce84f23a8583d6831e7474"}},{"ruleId":"X5","level":"note","message":{"text":"Strict null checking is not enabled everywhere the repository type-checks: 3/5 of this repository\u0027s type-checking configuration(s) turn on strict null checking (\u0060\u0022strict\u0022: true\u0060, or \u0060\u0022strictNullChecks\u0022: true\u0060). A configuration that states neither is counted as OFF, because off is tsc\u0027s own default; a solution-style one whose \u0060\u0022files\u0022\u0060 is empty and whose \u0060\u0022references\u0022\u0060 point at other projects is in neither number, because it checks no source itself. Where it is off, \u0060string\u0060 admits \u0060null\u0060 and \u0060undefined\u0060: passing a value that is null compiles silently and throws on the first property access."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"8870f9ff7b17c2e14c5ba3bc13137b94673aad0b9498438c572dabb049852943"}},{"ruleId":"X5","level":"note","message":{"text":"Null assertions (\u0060!\u0060) reduce the strict null checking score: ~1.2 \u0060!\u0060 null assertions per 1k TypeScript source lines \u2014 584 assertion(s) across the 471189 source line(s) of the 3140 TypeScript file(s) read, which is the only code the operator asserts anything in (a \u0060!\u0060 in a \u0060.js\u0060 file is not this operator and was not counted, and one in a file whose null checking is off silences nothing). Densest: invokeai/frontend/webv1/src/common/util/promptAST.ts (28), invokeai/frontend/webv2/src/workbench/canvas-engine/document-model/documentModel.ts (27), invokeai/frontend/webv2/src/platform/browser/sha256.ts (23). Each one tells the compiler to trust the author about null, suppressing the very diagnostic \u0060strictNullChecks\u0060 exists to produce."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"edb251d0f8dd1deb75ff6fa12d145c3d5c948a70b0aaf8da052107c857335979"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060_running_queue_item_owners\u0060 swallows every exception into \u0060return set()\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":"invokeai/app/api/sockets.py"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"8eebf6077e3081ec99a0226871a6d7ab5df6afd1a953d0afc06a4474536646fa"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on parse failure: \u0060stored_projection_method\u0060 returns \u0060\u0027umap\u0027\u0060 when \u0060(ValueError, AttributeError)\u0060 is raised, with no log or raise \u2014 a malformed value silently becomes that default. Log the input or fail validation. 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":"invokeai/app/services/image_index/projection.py"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"d249ade32c9ac079a91d124a529c1e5e90b87f4c21d0e50978f3eb7d92f890af"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060_get_device_resident_model_keys\u0060 swallows every exception into \u0060return set()\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":"invokeai/app/services/session_queue/session_queue_default.py"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"b407ef729592f217f337ceb2021f515b3af9fc023f9fda99316355a5c57791c7"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on parse failure: \u0060day_after\u0060 returns \u0060\u0027\u0027\u0060 when \u0060(ValueError, OverflowError)\u0060 is raised, with no log or raise \u2014 a malformed value silently becomes that default. Log the input or fail validation. 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":"invokeai/app/services/shared/database/queries/base.py"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ed1afb54b18a9bf561a66513b7ebe16c77dad90fd8b1122eef02039e0b751b2"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on parse failure: \u0060redacted_database_url\u0060 returns \u0060\u0027***\u0027\u0060 when \u0060ValueError\u0060 is raised, with no log or raise \u2014 a malformed value silently becomes that default. Log the input or fail validation. 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":"invokeai/app/services/shared/database/startup.py"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"0af893ff167152f840258b9b10cea2a7ca68168ef94a88b9cf8c5360cfb28f01"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on parse failure: \u0060_collect_board_candidates\u0060 returns \u0060set()\u0060 when \u0060(TypeError, ValueError)\u0060 is raised, with no log or raise \u2014 a malformed value silently becomes that default. Log the input or fail validation. 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":"invokeai/app/services/shared/sqlite_migrator/migrations/migration_2026_08_06_add_project_boards.py"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"b047dc202614cdd1e4de512159afd5a09f738e881209c8f0df3ec53211f0f3e5"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on parse failure: \u0060find_missing_wildcards\u0060 returns \u0060[]\u0060 when \u0060ParseException\u0060 is raised, with no log or raise \u2014 a malformed value silently becomes that default. Log the input or fail validation. 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":"invokeai/app/util/dynamicprompts.py"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec33c58d54a16d22f409c7363f66615568cd873bc23e1274fba89ce4033287ce"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on parse failure: \u0060header_config\u0060 returns \u0060{}\u0060 when \u0060ValueError\u0060 is raised, with no log or raise \u2014 a malformed value silently becomes that default. Log the input or fail validation. 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":"invokeai/backend/ltx2/checkpoint_layout.py"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"0172a8f96e4d0fea16e05557e99a14a3cbebf9a299d52a304b70c488bdd5d576"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060_get_reclaimable_allocator_bytes\u0060 swallows every exception into \u0060return 0\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":"invokeai/backend/model_manager/load/model_cache/model_cache.py"},"region":{"startLine":2421}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c10ec59a99ba951e1db30651c46dc0fa056f064984257243f45e0c18d5f2cae"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060_probe_fp8_matmul\u0060 swallows every exception into \u0060return False\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":"invokeai/backend/quantization/fp8_scaled.py"},"region":{"startLine":841}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c7e7718d8d78689260e50a0ad29742e26a7e0206c540adcd1ea2b31b216931c"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060parse_comfy_quant_bytes\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":"invokeai/backend/quantization/int8_convrot.py"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"50694602a5588d275d004550bad1f3f189c97afc52eec893252e39224f6a44fa"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060parse_comfy_quant_marker\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":"invokeai/backend/quantization/int8_convrot.py"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"661f0f6a8a1ef5e075effc135410d6f690534c80167d9aba211d9147e68873b2"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060_counter_values\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":"invokeai/backend/util/wddm.py"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"e59691dbd5db1cfbf5f542d75364e5d95de185bd3955e8e7abd27954100bbcb2"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060getSemanticReferenceName\u0060 swallows every exception into \u0060return \u0027\u0027\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":"invokeai/frontend/webv2/src/features/gallery/ui/GalleryItemSearch.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"8542aa112e96a8a32edf73c13b56797e1a89a9c4a50354e31fcdabe4113716a6"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060createQueueReceiptAcknowledgements.drain\u0060 swallows every exception into \u0060return false\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":"invokeai/frontend/webv2/src/features/queue/runtime/receiptAcknowledgements.ts"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff899755fc9bf39d680d69492aa81fa5e5b4ef8d87f8ee612e9e57efed745105"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060getRunnableLayerWorkflowInputs\u0060 swallows every exception into \u0060return false\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":"invokeai/frontend/webv2/src/features/workflow/core/layerWorkflow.ts"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa5e66e3ed7e8621e6372176790fe14a0592d13b83106076cc0999fbc234816c"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060parseRecents\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":"invokeai/frontend/webv2/src/platform/ui/colorPickerStore.ts"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"7835cd71bcdcba8322c9e9b86b4ba23d98ad538c37c0b67a0ee53a787488d3cb"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060parseProjectCovers\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":"invokeai/frontend/webv2/src/workbench/projects/covers.ts"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0aded5f2f0d12c9a9033d9380a83deb5c3fa2a9488f7f4aac8810bea0dfe2af"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060readStored\u0060 swallows every exception into \u0060return \u0027marquee\u0027\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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/toolFamilyStore.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"efaf06e6948ca3b24eb834b9b6a894b7f626a9da25a45de3ea8e257329275c5d"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060parseRecords\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":"invokeai/frontend/webv2/src/workbench/palette/recents.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"76b8bc0fb85a562f1f5c74de4776fef60a0b1c3f9e219a52afc969f2a89cccea"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060readStored\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":"invokeai/frontend/webv2/src/workbench/widgets/canvas/tool-presentation/propertyGroupStore.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f995ad05523fdfc85b3d7a99f06b97ef1b515b7016e263b40821ef568df8010"}}],"taxonomies":[{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d","organization":"MITRE","informationUri":"https://cwe.mitre.org/","isComprehensive":false,"shortDescription":{"text":"The MITRE Common Weakness Enumeration (CWE)."},"taxa":[{"id":"CWE-1032","guid":"5f21e517-68aa-a650-9a25-5771ef024637","name":"OWASP Top Ten \u2014 Security Misconfiguration category","shortDescription":{"text":"OWASP Top Ten \u2014 Security Misconfiguration category"},"helpUri":"https://cwe.mitre.org/data/definitions/1032.html"},{"id":"CWE-1059","guid":"a2381a08-60f6-9554-a8b8-f3018cfaaca5","name":"Insufficient Technical Documentation","shortDescription":{"text":"Insufficient Technical Documentation"},"helpUri":"https://cwe.mitre.org/data/definitions/1059.html"},{"id":"CWE-1357","guid":"e4d2e772-757e-0a5c-bd7d-77052949d866","name":"Reliance on Insufficiently Trustworthy Component","shortDescription":{"text":"Reliance on Insufficiently Trustworthy Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1357.html"},{"id":"CWE-1395","guid":"800e09e7-c11a-8654-9fa6-86f398995fed","name":"Dependency on Vulnerable Third-Party Component","shortDescription":{"text":"Dependency on Vulnerable Third-Party Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1395.html"},{"id":"CWE-16","guid":"659db3ea-affc-8453-8add-c1218fbfcb92","name":"Configuration","shortDescription":{"text":"Configuration"},"helpUri":"https://cwe.mitre.org/data/definitions/16.html"},{"id":"CWE-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-287","guid":"ec161954-9db0-355d-9539-ae741453fd44","name":"Improper Authentication","shortDescription":{"text":"Improper Authentication"},"helpUri":"https://cwe.mitre.org/data/definitions/287.html"},{"id":"CWE-319","guid":"7af97476-9f0d-4458-9163-3d2043918a1a","name":"Cleartext Transmission of Sensitive Information","shortDescription":{"text":"Cleartext Transmission of Sensitive Information"},"helpUri":"https://cwe.mitre.org/data/definitions/319.html"},{"id":"CWE-327","guid":"e51910ff-67b5-3c51-aa3d-92837d9eab90","name":"Use of a Broken or Risky Cryptographic Algorithm","shortDescription":{"text":"Use of a Broken or Risky Cryptographic Algorithm"},"helpUri":"https://cwe.mitre.org/data/definitions/327.html"},{"id":"CWE-353","guid":"09d7e902-d4ee-f05d-ae6c-0a1554d0c18f","name":"Missing Support for Integrity Check","shortDescription":{"text":"Missing Support for Integrity Check"},"helpUri":"https://cwe.mitre.org/data/definitions/353.html"},{"id":"CWE-494","guid":"b8a65e0d-e459-4a55-a931-fc1136482375","name":"Download of Code Without Integrity Check","shortDescription":{"text":"Download of Code Without Integrity Check"},"helpUri":"https://cwe.mitre.org/data/definitions/494.html"},{"id":"CWE-502","guid":"f7d3b296-aac0-5c5a-b706-e07faba26c36","name":"Deserialization of Untrusted Data","shortDescription":{"text":"Deserialization of Untrusted Data"},"helpUri":"https://cwe.mitre.org/data/definitions/502.html"},{"id":"CWE-506","guid":"401d6455-56e3-0552-9a39-f77461673e3f","name":"Embedded Malicious Code","shortDescription":{"text":"Embedded Malicious Code"},"helpUri":"https://cwe.mitre.org/data/definitions/506.html"},{"id":"CWE-532","guid":"1cd8877a-76e8-ce54-b40b-779af23364a0","name":"Insertion of Sensitive Information into Log File","shortDescription":{"text":"Insertion of Sensitive Information into Log File"},"helpUri":"https://cwe.mitre.org/data/definitions/532.html"},{"id":"CWE-732","guid":"1da27e8f-b330-7650-ab63-bd61953eae5d","name":"Incorrect Permission Assignment for Critical Resource","shortDescription":{"text":"Incorrect Permission Assignment for Critical Resource"},"helpUri":"https://cwe.mitre.org/data/definitions/732.html"},{"id":"CWE-77","guid":"332c8ade-6612-9f56-a06b-d8d90b1a8750","name":"Improper Neutralization of Special Elements used in a Command (\u0027Command Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Special Elements used in a Command (\u0027Command Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/77.html"},{"id":"CWE-78","guid":"2e31ceaf-c7ae-2e5e-9661-cfb1362789cf","name":"Improper Neutralization of Special Elements used in an OS Command (\u0027OS Command Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Special Elements used in an OS Command (\u0027OS Command Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/78.html"},{"id":"CWE-79","guid":"fd45580b-e8c4-fc5e-8c2f-aa8fab0b4dbf","name":"Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)","shortDescription":{"text":"Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/79.html"},{"id":"CWE-798","guid":"5e8f057d-fee3-995a-a0cb-9fc5b0d174d1","name":"Use of Hard-coded Credentials","shortDescription":{"text":"Use of Hard-coded Credentials"},"helpUri":"https://cwe.mitre.org/data/definitions/798.html"},{"id":"CWE-829","guid":"13c33925-97fb-5a5e-b40c-56d328b8a4d7","name":"Inclusion of Functionality from Untrusted Control Sphere","shortDescription":{"text":"Inclusion of Functionality from Untrusted Control Sphere"},"helpUri":"https://cwe.mitre.org/data/definitions/829.html"},{"id":"CWE-89","guid":"6d08fdad-37eb-c150-bbf0-d7d946863407","name":"Improper Neutralization of Special Elements used in an SQL Command (\u0027SQL Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Special Elements used in an SQL Command (\u0027SQL Injection\u0027)"},"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":"Improper Control of Generation of Code (\u0027Code Injection\u0027)","shortDescription":{"text":"Improper Control of Generation of Code (\u0027Code Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/94.html"},{"id":"CWE-95","guid":"400bba4e-483c-5c50-a695-114fa9168003","name":"Improper Neutralization of Directives in Dynamically Evaluated Code (\u0027Eval Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Directives in Dynamically Evaluated Code (\u0027Eval Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/95.html"}]},{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61","version":"2025","organization":"OWASP Foundation","informationUri":"https://top10.owasp.org/2025/","isComprehensive":false,"shortDescription":{"text":"The OWASP Top 10:2025 web application security risks."},"taxa":[{"id":"A02:2025","guid":"668dee9e-41bc-6354-97d0-fdf8f40c50c1","name":"Security Misconfiguration","shortDescription":{"text":"Security Misconfiguration"},"helpUri":"https://top10.owasp.org/2025/A02_2025-Security_Misconfiguration/"},{"id":"A03:2025","guid":"168e227c-7735-2e57-bc6e-997affe644c5","name":"Software Supply Chain Failures","shortDescription":{"text":"Software Supply Chain Failures"},"helpUri":"https://top10.owasp.org/2025/A03_2025-Software_Supply_Chain_Failures/"},{"id":"A04:2025","guid":"6a9f5bfd-1a56-6453-beec-a7eff0ba3007","name":"Cryptographic Failures","shortDescription":{"text":"Cryptographic Failures"},"helpUri":"https://top10.owasp.org/2025/A04_2025-Cryptographic_Failures/"},{"id":"A05:2025","guid":"87e86033-3231-8458-8e4a-5cb82743553a","name":"Injection","shortDescription":{"text":"Injection"},"helpUri":"https://top10.owasp.org/2025/A05_2025-Injection/"},{"id":"A07:2025","guid":"334ddd78-539d-d35c-83dd-253647eb7eaf","name":"Authentication Failures","shortDescription":{"text":"Authentication Failures"},"helpUri":"https://top10.owasp.org/2025/A07_2025-Authentication_Failures/"},{"id":"A08:2025","guid":"84b0c297-710e-9a5f-9335-936ecb260c36","name":"Software or Data Integrity Failures","shortDescription":{"text":"Software or Data Integrity Failures"},"helpUri":"https://top10.owasp.org/2025/A08_2025-Software_or_Data_Integrity_Failures/"},{"id":"A09:2025","guid":"78892bc9-3c98-495d-881c-8af1390d643c","name":"Security Logging \u0026 Alerting Failures","shortDescription":{"text":"Security Logging \u0026 Alerting Failures"},"helpUri":"https://top10.owasp.org/2025/A09_2025-Security_Logging_and_Alerting_Failures/"}]},{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35","organization":"OWASP Foundation","informationUri":"https://owasp.org/www-project-top-10-ci-cd-security-risks/","isComprehensive":false,"shortDescription":{"text":"The OWASP Top 10 CI/CD Security Risks."},"taxa":[{"id":"CICD-SEC-3","guid":"458c83a6-ebf7-cf55-8cc3-b4d949bbf271","name":"Dependency Chain Abuse","shortDescription":{"text":"Dependency Chain Abuse"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-03-Dependency-Chain-Abuse"},{"id":"CICD-SEC-8","guid":"b6b2dacf-a168-4957-876e-a8c73ee00eb0","name":"Ungoverned Usage of 3rd Party Services","shortDescription":{"text":"Ungoverned Usage of 3rd Party Services"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-08-Ungoverned-Usage-of-3rd-Party-Services"},{"id":"CICD-SEC-9","guid":"b3d36727-0395-5b51-94c4-5e173d62eab3","name":"Improper Artifact Integrity Validation","shortDescription":{"text":"Improper Artifact Integrity Validation"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-09-Improper-Artifact-Integrity-Validation"}]}],"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":70,"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."]}]}